この記事は、P5で “database is malformed “というエラーが表示された場合を対象としています。構造的なインデックス・エラーのチェックと修復についてです。ここで扱うのはインデックスの構造的な完全性だけであり、その内容や実際ではないことに注意してください。
インデックスのチェック
P5バックアップインデックスは4つの*.dbファイルで構成され、アーカイブインデックスにはさらに2つのファイルがあります。これらはP5のインストールディレクトリのサブフォルダにあります:/usr/local/aw/config/index/backup/<clientname>
と/usr/local/aw/config/index/archive/<archivename>です。
バックアップ・インデックスのファイルは…
- addrs.db
- files.db
- names.db
- paths.db
アーカイブインデックスには、さらに2つのファイルが追加されます。
- ppaths.db
- metadata.db
これらの*.dbファイルをチェックし、修復することができます。
P5が並行してインデックスにアクセスするのを避けるため、開始する前に必ずP5を停止してください。
ファイルが壊れているかどうかをチェックするには、sqlite3ターミナルを使うことができます。P5のunix版には、このプログラムが含まれています。Windows版は http://sqlite.org からダウンロードできます。
チェックはターミナル・ウィンドウで次のように行います:
/usr/local/aw/bin/sqlite3 names.db
sqlite> pragma integrity_check(10);
(ok)
sqlite> .quit
このファイルは問題なくチェックが完了しています。壊れたファイルは次のようになります:
/usr/local/aw/bin/sqlite3 addrs.db
sqlite> pragma integrity_check(10);
*** in database main ***
Page 77037: btreeInitPage() returns error code 11
Page 77033: btreeInitPage() returns error code 11
Page 77030: btreeInitPage() returns error code 11
...
sqlite> .quit
インデックスの修復(標準的な方法)
インデックスを修復する最も安全な方法は、テープから無傷のバージョンを復元することです。壊れたバックアップ・インデックスを修復するには、Advanced Options → Manage Indexes セクションに移動し、インデックスを選択して “Check” をクリックします。チェック機能はインデックスをチェックし、最後に保存されたバージョンをテープから復元します。アーカイブ・インデックスの場合、自動バックアップはありません。
問題が解決しない場合…
最後のバックアップが何らかの理由で古すぎる場合、あるいは、それでも問題が解決せず、保存されたインデックスに既に欠陥があった場合、再びsqlite3コマンドを使用してインデックスをダンプし、テープから新しいインデックスを作成することができます。このコマンドはデータベースのダンプを作成し、ダンプから新しいデータベースを作成するslite3の別のインスタンスでそのダンプを直接読み込みます:
echo .dump | /usr/local/aw/bin/sqlite3 addrs.db | /usr/local/aw/bin/sqlite3 addrs_new.db
このようにして、新しいファイル、ここではaddrs_new.dbが書き込まれます。新しいファイルが元のファイルと同じようなサイズかどうか確認してください。内部構造がより最適化された方法で再作成されるため、サイズは若干小さくなると思われるが、何らかの理由でメカニズムが完全に失敗し、データの大きな部分が失われないように注意する必要があります。
サイズが合わない場合は、ダンプされたファイルを新しいファイルと置き換えてください。
