c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

障害

管理しているサーバーのPostgreSQLにおいて以下の様なエラーが出力された

db=# select * from table_name  where id='098';
ERROR:  invalid page header in block 999999 of relation "table_name"

げげ、コレはDBデータの破損である。
こういう場合は大抵DiskのI/Oエラーだ。

既に時計は午前2時半だったがデータセンターへ直行しRAIDをチェックする、案の定Bad Blockで1発死んでいた。早速ディスクを交換しリビルド開始、これでディスク障害は対応終了である。


しかし論理破損は別に直さなければならない。該当カラムが読み出せない(勿論削除もできない)ため、一度DBをDropして再投入する必要がある模様。pg_dumpfile*1などというソフトを使うと手で書き換える事もできるらしいが、ディスクのヘッダ書き換えの様な物であって、余りリスキーな事をやりたくないので止めておく。

とりあえずデータ自体はあるものの、量が多い為と、CVS形式なので投入にかなりの時間が掛かることが予想される。
現在別の作業中ため、DBをおいそれと止められず、該当カラム以外の影響が無いのでこのまま時間を稼ぎつつとりあえずDBをもう一つ作り、まったく同じ様にデータを投入。その後切り替え作業を行って復旧という方法を取ることにした。週明け対応だな。

リアルタイムにデータが追加されるDBじゃなくて良かった…。あー怖いなあ、DB破損。レプリケーションとか必要だなあ。
raidといえど、書き込み時にミスるとデータが壊れるのはどうにかならないものか…まあ他のデータには影響が出ないのは幸いだが。

*1:http://sources.redhat.com/rhdb/utilities.html 、rhdb-utils-3.0-2.i386等で検索すればバイナリも出てくる