Tips

SQLでデータを再構築する

日付2011/08/30
ID11-006
バージョンv12
プラットフォームWindows, Mac

あまり考えたくない事ですが、データファイルが度々壊れてしまうようなとき、データファイルの再構築を考えなければならないことがあります。4D v11以前のバージョンで、SEND RECORDコマンドやRECEIVE RECORDコマンドを使用して、データベースの再構築を行ったかもしれません。しかし、その方法は完全ではなく、壊れたデータをそのまま新しいデータベースに移してしまう可能性があります。より良い方法として、XMLで書き出したり読み込ませる方法がありますが、XMLのパースに時間が掛かるのが難点でした。

4D v12では、SQLステートメントとして全てのデータを書き出すコマンドがありますので、それを使う事で、データをもれなく再構築することができます。またXMLでの書き出し/読み込みと比較して、短時間で再構築することができます。

SQL EXPORT DATABASEコマンドは、全てのテーブルに含まれるデータをSQL文の形、つまりテキストデータとして出力します。たとえBLOBやピクチャ型のバイナリデータがあったとしても、それらバイナリデータも確保した形でSQL文として生成されるので、問題なく全てのデータをバックアップすることができます。

具体的には、次のコードは、データベースフォルダに全てのデータをバックアップします。

//全データをSQLステートメントファイルに保存
$folder_path:=Get 4D folder(Database folder)+"exportdata"+Folder separator
SQL EXPORT DATABASE($folder_path)

このようにしてバックアップされたデータを復旧するには、SQL文で書かれているので、SQL EXECUTE SCRIPTコマンドでSQL文としてファイルを実行すれば良いということになります。SQL EXPORT DATABASEコマンドは、テーブル毎にフォルダを生成しているので、それらを復元するためには、フォルダ構造を考慮してSQL文のファイルを指定しなければなりません。具体的には、次のようにします。

//SQLステートメントファイルより全データを復元
$folder_path:=Get 4D folder(Database folder)+"exportdata"+Folder separator+"SQLExport"+Folder separator
FOLDER LIST($folder_path;$folder_names)
For ($i;1;Size of array($folder_names))
   DOCUMENT LIST($folder_path+$folder_names{$i};$doc_names)
   For ($i2;1;Size of array($doc_names))
      if($doc_names{$i2}="Export@")
         SQL EXECUTE SCRIPT($folder_path+$folder_names{$i}+Folder separator+$doc_names{$i2};SQL on error confirm)
      end if
   End for 
End for

データベースの破損は避けなければなりませんが、万が一の場合で再構築が必要なときには、上記の方法をお試しください。

追記:
SQLステートメントファイルより全データを復元する際には、新規にデータファイルを作成して、空のデータファイルにデータを復元してください。