意外とメジャーなデータベース? FirebirdというDBを修復する必要に迫られた話
とあるソフトの中で使用されていたFirebirdというデータベースが壊れたっぽく、対応を迫られた。Firebirdの日本語情報も少なかったため、そのときにとった対応を最低限メモとして残す。
photo credit: AndiH via photopin cc
サマリー
1.Firebirdに触れることになった背景
2.Firebirdの特徴
3.Firebirdの基本的な使い方
4.Firebirdのバックアップ・修復(←メイン)
1.Firebirdに触れることになった背景
医療業界の話になるが、介護認定の際には「主治医の意見書」というものの提出が求められる。この意見書を作成・管理するためのソフトの一つに「医見書」がある。「医見書」は日本医師会が日医総研に命じてオープンソースソフトウエアとして開発させたORCAプロジェクトによる成果物の一つ。(その他の成果物の有名なものに「日医標準レセプトソフト」がある。)
この「医見書」が使用しているデータベースソフトが件の「Firebird」であった。
ユーザより依頼があって数台にダウンロード&インストール&データベース設定をして以来、全く触ったこともなかったこのソフトだが、ある日ユーザから「更新しようとするとエラーが出る」との障害報告を受け、調査した結果、どうやらデータベースが壊れているらしいことがわかった。
MySQLのrepairみたいなコマンドがきっと用意されているはず!と思い、FirebirdというDBを触わるにあたっての最低限の前提情報を調べてみた。
2.Firebirdの特徴
- オープンソース
- 軽量で、設定や管理が簡単なのに強力
- ストアドプロシージャとトリガーをフルサポート
- 非力なハードウェアでも十分に動作する
- 1データベース:1ファイルの構造のためわかりやすい
- バックアップの際には1ファイルをコピーするだけ
日本ではあまり普及していないようだが、海外ではかなりの普及率を誇る(それ故に日本語の情報は少ない模様)。
3.Firebirdの基本的な使い方
今回の環境はWindows7 + Firebird2.0。
Firebirdには「Firebird ISQL Tool」というツールがあり、ここからデータベースをいろいろ触わることができる。
下記にFirebird ISQL Toolのチュートリアルっぽいものがある。MySQLでいうところのMySQLモニタを使用する感覚で使用可能。
http://tech.firebird.gr.jp/firebird-jp-doc/qsg15-ja/qsg15-databases-ja.html
4.Firebirdのバックアップ・修復
gfixとgbakコマンドで壊れたDBの修復を試みて、最終的にはデータを取り出し、それを正常なDBに戻すという方法が一般的であるようだ。
とりあえずgfixによる修復を試してみる。コマンドプロンプトから操作。
使用前にFirebirdのbinフォルダにパスを通しておくと楽だが、自分の場合は今回の件はすぐに解決し、二度とFirebirdは触らない気がしたのでパスは通さず。
>gfix -v -f -user sysdba -password masterkey "d:\ikensyo\data\ikensyo.fdb"
ちなみに引数は下記の通り。
引数 | 説明 |
---|---|
-v | validate:修復実行の指定。未使用領域の開放と破損DBのレポート |
-f | full:レコードとページの修復と、未割り当てエリアの フラグメントも行われる |
これで返ってきた結果は...
database file appears corrupt ()
- bad checksum
- checksum error on database page 26899
チェックサムエラーで修復が完了していない模様。
そこで引数を変えてみる。
>gfix -m -f -i -user sysdba -password masterkey "d:\ikensyo\data\ikensyo.fdb"
ちなみに引数は下記の通り。
引数 | 説明 |
---|---|
-m | mend:修復時に破損レコードを使用不可としてマークする |
-i | ignore:修復時にチェックサムエラーを無視する |
結果、一応修復完了。
スキップされた部分はどうしようもできないので、もうこれ以上何も考えないことにする。今後は定期的にバックアップをとるということで。
あわせて読みたい
MySQLでCSVインポート時に Got error 139 from storage engine エラー - TechNote定期的にメンテしているWebアプリの、あるテーブル(マスタ系)にcsvデータをインポートするときに出たエラー。一度くらい見た記憶があったが、どんな対応をとったか...
Oracleのtimestamp型のフィールドで大小比較する方法 - TechNote基幹システムのDBデータを日々csv出力して別のシステムのDBにインポートし、活用するような仕組みを作っている。このとき、データの差分のみを抜く方法としては、も...
一度は観ておきたい!エンジニアが主役の映画5選 (とそこで使われている技術を少々) - TechNote以前から一度まとめてみたかったタイトルの件、今更ながらまとめておきます。観たい映画がなくなった方や、エンジニアとして働いてるけど目標を見失ったという方のご参考に...