CODBデータベース破損の修復

まれに、CCEd が使用する CODB データベースが破損することがあります。発生頻度は高くありませんが、起きた場合は通常、次の 2 つの形のいずれかで現れます。

OID の不一致

/usr/sausalito/codb/codb.oids には、現在使用中として記録されている Object ID の一覧が保存されています。

このファイルの内容が、実際に存在するオブジェクトと一致しなくなると問題が発生する場合があります。多くのケースでは、このテキストファイルを慎重に編集することで修復できます。

db.classes の破損

/usr/sausalito/codb/db.classes は、CCEd のインストール時に作成される Berkeley DB v1.85 データベースです。CCEd はこれを使用して、クラス、オブジェクト、およびそれらのインデックスを追跡します。

このデータベースが破損すると、以前は復旧手段が非常に限られていました。過去には、移行によって救済するしかない、しかもそれすら必ず成功するとは限らない、というのが一般的な結論でした。

blueonyx-db RPM パッケージには、現在、両方の CODB 問題を診断および修復するためのツールが含まれています。

#> rpm -ql blueonyx-db
/home/solarspeed/db/bin/db_load185
/usr/sausalito/sbin/examine_codb.pl
/usr/sausalito/sbin/repair_codb_classes.pl

使用方法

/usr/sausalito/sbin/examine_codb.pl

このツールはレポートを生成し、CODB のインデックスが整合しているか、または破損しているかを表示します。

/usr/sausalito/sbin/repair_codb_classes.pl

--fix パラメータ付きで実行すると、このツールは次のサービスを停止します。

crond
cced
admserv
cced-api

その後、たとえば次のような名前で CODB ディレクトリのタイムスタンプ付きバックアップを作成します。

/usr/sausalito/codb-backup-20260518-153802.tar.gz

修復処理では、blueonyx-db RPM に含まれている Berkeley DB v1.85 ツール db_load185 を使用します。

/home/solarspeed/db/bin/db_load185

これは CCEd が内部で使用しているものと同じ Berkeley DB バージョンであり、互換性の面で重要です。

このツールは db.classes をダンプし、/usr/sausalito/codb/objects/ に実際に存在するオブジェクトに合わせて内容を調整したうえで、データベースを再構築します。

修復が完了すると、停止していたサービスが再起動されます。その時点で CODB は再び使用可能になっているはずです。

例: 壊れたサーバー

#> /usr/sausalito/sbin/examine_codb.pl
MISSING_OBJDIR  DnsRecord       1222    /usr/sausalito/codb/objects/1222
NOT_IN_CODB_OIDS        DnsRecord       1222
MISSING_OBJDIR  DnsRecord       1224    /usr/sausalito/codb/objects/1224
NOT_IN_CODB_OIDS        DnsRecord       1224
MISSING_OBJDIR  DnsRecord       1162    /usr/sausalito/codb/objects/1162
NOT_IN_CODB_OIDS        DnsRecord       1162
MISSING_OBJDIR  DnsRecord       1223    /usr/sausalito/codb/objects/1223
NOT_IN_CODB_OIDS        DnsRecord       1223
MISSING_OBJDIR  DnsRecord       1221    /usr/sausalito/codb/objects/1221
NOT_IN_CODB_OIDS        DnsRecord       1221
MISSING_OBJDIR  DnsSOA  1219    /usr/sausalito/codb/objects/1219
NOT_IN_CODB_OIDS        DnsSOA  1219

SUMMARY
dump_file=/tmp/db.classes.dump
entries=1758
duplicates=0
missing_object_dirs=6
class_mismatches=0
oids_not_marked_in_use=6

このサーバーでは、/usr/sausalito/codb/db.classes に 6 個のオブジェクトが記録されていますが、対応するオブジェクトディレクトリは /usr/sausalito/codb/objects/ の下にもう存在しません。この例では、影響を受けているオブジェクトはすべて DNS レコードです。

データベースの修復

#> /usr/sausalito/sbin/repair_codb_classes.pl --fix
live_objects=1752
live_class_entries=1752
class_oids_mismatched=0
current_codb_oids=1752
clean_dump=/tmp/db.classes.clean.dump
codb_backup=/usr/sausalito/codb-backup-20260518-153802.tar.gz
RESULT codb_backup=/usr/sausalito/codb-backup-20260518-153802.tar.gz db_backup=/usr/sausalito/codb/db.classes.bak.20260518-153802 replaced=1 db_file=/usr/sausalito/codb/db.classes oids_file=/usr/sausalito/codb/codb.oids

修復結果の確認

#> /usr/sausalito/sbin/examine_codb.pl

SUMMARY
dump_file=/tmp/db.classes.dump
entries=1752
duplicates=0
missing_object_dirs=0
class_mismatches=0
oids_not_marked_in_use=0

このサマリーでは、欠落しているオブジェクトディレクトリ、クラス不一致、codb.oids に記録されていない Object ID のいずれもなくなっています。これは、CODB データベースの整合性が回復したことを示しています。