読者です 読者をやめる 読者になる 読者になる

TechNote

とあるエンジニアのただのメモ

意外とメジャーなデータベース? FirebirdというDBを修復する必要に迫られた話

とあるソフトの中で使用されていたFirebirdというデータベースが壊れたっぽく、対応を迫られた。Firebirdの日本語情報も少なかったため、そのときにとった対応を最低限メモとして残す。

f:id:kojikoji75:20150113211050j:plain
photo credit: AndiH via photopin cc

サマリー

1.Firebirdに触れることになった背景
2.Firebirdの特徴
3.Firebirdの基本的な使い方
4.Firebirdのバックアップ・修復(←メイン)



1.Firebirdに触れることになった背景

医療業界の話になるが、介護認定の際には「主治医の意見書」というものの提出が求められる。この意見書を作成・管理するためのソフトの一つに「医見書」がある。「医見書」は日本医師会が日医総研に命じてオープンソースソフトウエアとして開発させたORCAプロジェクトによる成果物の一つ。(その他の成果物の有名なものに「日医標準レセプトソフト」がある。)

f:id:kojikoji75:20150113202625p:plain


この「医見書」が使用しているデータベースソフトが件の「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

チェックサムエラーで修復が完了していない模様。

f:id:kojikoji75:20150113202454p:plain




そこで引数を変えてみる。

>gfix -m -f -i -user sysdba -password masterkey "d:\ikensyo\data\ikensyo.fdb"

ちなみに引数は下記の通り。

引数 説明
-m mend:修復時に破損レコードを使用不可としてマークする
-i ignore:修復時にチェックサムエラーを無視する

f:id:kojikoji75:20150113202547p:plain

結果、一応修復完了。

スキップされた部分はどうしようもできないので、もうこれ以上何も考えないことにする。今後は定期的にバックアップをとるということで。



あわせて読みたい

MySQLでCSVインポート時に Got error 139 from storage engine エラー - TechNoteMySQLでCSVインポート時に Got error 139 from storage engine エラー - TechNote

定期的にメンテしているWebアプリの、あるテーブル(マスタ系)にcsvデータをインポートするときに出たエラー。一度くらい見た記憶があったが、どんな対応をとったか...

Oracleのtimestamp型のフィールドで大小比較する方法 - TechNoteOracleのtimestamp型のフィールドで大小比較する方法 - TechNote

基幹システムのDBデータを日々csv出力して別のシステムのDBにインポートし、活用するような仕組みを作っている。このとき、データの差分のみを抜く方法としては、も...

一度は観ておきたい!エンジニアが主役の映画5選 (とそこで使われている技術を少々) - TechNote一度は観ておきたい!エンジニアが主役の映画5選 (とそこで使われている技術を少々) - TechNote

以前から一度まとめてみたかったタイトルの件、今更ながらまとめておきます。観たい映画がなくなった方や、エンジニアとして働いてるけど目標を見失ったという方のご参考に...



Firebird 徹底入門

Firebird 徹底入門