([ccj-adm 640],2001.05.16)

MySQLをつかったファイル情報データベースのプロトタイプが
できたので内輪に公開します。コマンドが二つ。
  /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/ccjfileDBread
  /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/ccjfileDBwrite

昨年から rawdata/DSTdata fileの転送をやっていて考えていた
ことはだいたいできるようになりましたが、ほかの人が
使いやすいかどうかはこれからです。

ご意見よろしく。

S.Yokkaichi, RIKEN
-----------------------------------------------
ccjfileDB  v0.1beta  010516 S.Yokkaichi

目的
  RCF->CCJのfile転送(raw/DST/microDST)の記録、およびそれを
  CCJでおいてある場所の記録。
  転送する人の作業記録でもあるし、CCJのuserがjobを流すときに
  参照する場所でもある。

  よって書き込みは基本的にccj-adminな人のみ、読み出しはccjの全userから
  可能な形とする。

そのためのデータの内容
  rawdata名をあたえると、runnumber,そのrunの特徴(magnet ON/OFF,
  beam? date?など)、hpssでの場所、DSTの名前(当然version があるが
  それぞれについて。)、filesize などがでてくる。

  runnumberをあたえると、特徴のほか、
  そのrunに属するfileの名前と場所がわかるようにする。

  抽象的には、一枚のテーブル(縦軸それぞれのraw data file,
   横軸fieldで fileについてのあらゆる情報。)
technical issue
  データベースエンジンは MySQLまたはObjectivity/DBとする。
  user interfaceは極力DBエンジンに依存しない形とする。
  userは OO_FD_BOOTとかMySQLのDB名とかを知らなくても(設定しなくても)
    つかえることとする。 
  コマンドラインから運用し、Unixのパイプに出力することができる。
   ->検索機能としてgrepなどを使用することもできる。
  コマンドラインのほか、fileからレコードをまとめて入力できる。
    入力 file formatは textで、field分割は空白文字によるとして、
    ls -l などの出力形式を awkなどで整形したものを使えるようにする。
  この程度の機能を実行するにあたって RDBMSが べたファイルにくらべていいところ。
    ファイル内部の書き換えがやりやすい。重複検出をしてくれる。
    書き換え時の検索もはやい(はず)。
    networkもサポート(これはむしろ不要か)。
    実行権限の設定とかはunixだけで必要十分かも。

今回のMySQLによる実装。
  ccjsunでmysqldをはしらせる。
  テーブルはとりあえず2つ、fileDBとrunDB とする。
  fileDBについては raw data fileの名前をunique keyとして、
    検索などができるようにする。fieldとして以下を想定する。
      run number
      rawdata file size	
      rcfhpssでのdirectory名
      ccjhpssでのdirectory名
      ccjdiskでのdirectory名
      ccjへの転送につかったtape名	
      (DSTの名前/サイズ/tapeなどなど。DSTのversionごとに別fieldとする。)
      (転送まだ/途中/終了 のflag)
      etc.

   一年分 100TB/1GB = およそ10万本の rawdata fileとすると、
   よこ数十カラム x たて 10万行の tableとなる。
  runDB
    runidをunique keyとし、filedbのそれと結合する。
    fieldとして以下を想定する。
      runid
      magnet ON/OFF/HALF
      beam(AuAu、pp、etc.)
      date/time
      etc.

  DB/tableの新規作成、field(column)の追加などは、とりあえず
  built-in tool(mysql)を使って行うものとし、コマンドは作成すると
  してもあとまわし。
	
今回のコマンド
  /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/ccjfileDBread
  /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/ccjfileDBwrite
    ->実行権限を unixのgroupで管理する。まだやってないけど。

  ccjsun(Solaris2.6)でのみ走る。

  ccjfileDBread
    SQLのselect文を実行する。(検索/表示する)
    出力は標準出力、エラーメッセージは標準エラー出力へ出している。
    --printexampleで コマンドラインのexampleを出す。

  ccjfileDBwrite
    SQLのinsert/delete/update文を実行する。
    inputfileから情報を読んでDBにかきこむ。
    サンプル inputfileは
      /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/testinput.txt
      /ccj/u/yokkaich/mysql/ccjdb/bin/v01b/testinputrun5K1.txt
      など。	
    file format
      行頭#はコメント。
      一行目(コメントのぞく)に 
         format (insert|update|delete) column1,column2....
	 あとの行は value1,value2.....のくりかえし。
         field区切りは空白文字。field数に制限なし。
      一行目に これをかかないと、出てくるまで行が無視される。
      一行512文字をこえる行があるとそこでプログラム終了。その前の行までは
      処理されてしまう。
      fieldの数が一行目の定義とあってない行があると、無視して
      次の行へいく。
      行毎に処理するので行数制限なし(5000行まではcheckずみ)。     
      insertで、すでにfilenameがあると、その行はなにもしない。	
      updateで、まだfilenameがないと、その行はなにもしない。すでに
              fieldがうまっていても、overwriteする。

  make
    static linkにしたのでLD_LIBRARY_PATHを気にしなくても良い(はず)。

to be done
  テスト
    数十field 10万行でのcheck。速度、メモリ消費、などread/write時それぞれ。
    入力file formatをもうすこし考える。凶悪な入力でもこけないかどうか。
  UI
    エラーメッセージの整備。optionでqueryがでるとか。
    ccjfileDBwriteでrunDBもあつかえるようにする。
    ccjfileDBwriteのコマンドライン形式の整備。
  DB
    fieldの整備。
    2000年データ(file/run)の入力
    MySQL user/passwd/権限の最適化
    fieldのtypeの最適化
  コード関係
    makefileの整備。CVSの導入。汚いコードの整理。

to be discuss
  一般
    rawdata基準で破綻しないか。
    一つのDSTがあちこちにあるのを全部フォローしなくていいか。
    一つのrawdatafileさえrcf-hpss上に複数あったりするがどうするか。

  テクニカル
    ccjsunだけで走ればよいか?network accessはどうするか。
    バックアップ(重要)。

  とくにMySQL関連
    mysql的にpasswdを設定しないと、user名を知られるとアクセスできて
    しまうがいいのか。privilegeはread onlyではあるが。
     ...passwdをコード中に書き込んであるからおなじだけど。
        make時に -Dで書き込むようにしているがほかに手はないか。

    unixとしては専用user(mysql)を設定してrcに書いてしまうか。
  
    実運用時のDB名、table名。
    
    directory名とか同じ文字列が重複してもったいない。さりとて
    別のtableをつくるほどか?

以上。