[pgsql-jp: 35007] Re: 破損したファイルからのデータ取り出し

Katsuhiko Okano k_okano @ po.ntts.co.jp
2005年 3月 11日 (金) 10:42:53 JST


岡野と申します。

> ただ、幸運(?)にも当該パーティションに対してfsckをかけてみた
> ところ、lost+foundディレクトリ配下にいくつかPostgreSQLの
> ファイルらしきものが残っていました。
> ただ、ファイル名が、#(数字)といった形式になっており、どれが
> どのファイルか判別ができない状態です。
> これらのファイルの中から、実際のタプルが入っていたファイルを
> 特定し、さらにタプル内の文字列をなんらかの方法で取り出すことは
> 可能でしょうか?

運がよくて時間と気力が豊富であれば一部を見るくらいは出来るかもしれません。
#私なら泣きながら許しを請い1から作り直します(-_-;)

lost+foundの中のファイルが先頭から末尾まで残っているか分からないので
取り出せるとは限らないし、取り出したデータが正しいかも
単独では確認できないと思うので
やってみて意味があるのかと言われると困るのですが、以下ご参考まで。


ディレクトリ構造も含めて漏れなく残っていれば、
pg_filedump -fでバイナリダンプをとってみて推測できるかもしれません。
#手作業になるので気力と時間がどれだけかかるやら・・・

マニュアルを見ると、データベースの情報はpg_databaseに、
テーブルの情報はシステムカタログpg_classに、
列の情報はシステムカタログpg_attributeに格納されているようです。
http://www.postgresql.jp/document/pg746doc/html/catalog-pg-database.html
http://www.postgresql.jp/document/pg746doc/html/catalog-pg-class.html
http://www.postgresql.jp/document/pg746doc/html/catalog-pg-attribute.html

またソースファイルには以下のような箇所があり、ファイル名は
pg_databaseが1262、pg_classが1259、pg_attributeが1249ではないかと思います。
pg_class.hより
>#define RelOid_pg_type			1247
>#define RelOid_pg_attribute		1249
>#define RelOid_pg_proc			1255
>#define RelOid_pg_class			1259
>#define RelOid_pg_shadow		1260
>#define RelOid_pg_group			1261
>#define RelOid_pg_database		1262

それをふまえて、ディレクトリ構造やファイルが壊れてないことを祈りながら
1)global/1262ファイルから、データベースのOIDを推測
2)base/データベースのOID/1259ファイルから、テーブルのOIDを推測
  base/データベースのOID/1249ファイルから、テーブルの列情報も推測
3)base/データベースのOID/テーブルのOIDファイルから
  残骸が見つかれば手で取り出して変換


スマートなやり方じゃないですね・・・

-- 
----------------------------------------
Katsuhiko Okano
k_okano _at_ po.ntts.co.jp
NTT Software Corp. (division "NBRO-PT6")




pgsql-jp メーリングリストの案内