[pgsql-jp: 26198] 解決レポート

Junzo Kudou tech @ dk.catv.ne.jp
2002年 5月 29日 (水) 19:09:26 JST


工藤です。
一応pg_dumpが出来るようになりましたので御報告します。


井上さんとのやりとりで、問題となってるテーブルの特定レコードを
昔のアーカイブから復旧したらなんとかなるんじゃなかろうかと当り
をつけ、試しにローカルに展開したコピーDBでやってみました。

問題となっているテーブルは利用者IDと書き込み期日、書き込み内容等
からなるテーブルでして、IDとDATEの組合せでレコードがユニークに
特定されます。
このテーブルにおいて、特に条件づけをせず
select ID,DATE,COMMENT from TABLENAME;
とやるとエラーが出て全く表示されません。
IDとDATEだけに関してなら問題なく出力されます。
ここから、おそらく障害が発生しているのはCOMMENTのカラムであろう
と推測しました。
このカラムはTEXT型なのでtoastの恩恵を受ける可能性が最も高いカラム
でした。

レコードのしぼり込みのためにまず
select COMMENT from TABLENAME where ID=***;
で全ユーザIDについてループし、さらにDATEでしぼりこみ該当レコード
と思われるものを2つ発見しました。

このレコードを一度deleteし壊れる前のアーカイブから復旧し再度pg_dump
をかけてみました。

すると!

別なエラーが(笑

pg_dump: dumpClasses(): SQL command failed
pg_dump: Error message from server: ERROR:  MemoryContextAlloc: invalid request size 4294967295
pg_dump: The command was: FETCH 100 FROM _pg_dump_cursor

"MemoryContextAlloc"を調べ歩いたところ、Postgres7.1.2より前の
バージョンではエラーがあったらしいとの記述を発見したのですが、
使用しているのは7.2.1ですので無関係と判断。

このDBは以前にも同じ環境でpg_dumpを行っていましたし、同じ構成
でレコード数が数倍あるデータのpg_dumpも行えていましたので、
単純にHDD領域が足りないというのも解せません。
vacuumをしてもまったく状況が変わらなかったので、どうもまだ障害
が残っているだろうと再度
select ID,DATE,COMMENT from TABLENAME;
をやるとやはり
ERROR:  unexpected chunk number 1 (expected 0) for toast value 74452
のエラーが発生していました。

よって、残りの幾つかのカラムについても同じ操作行い再度レコードの
特定をし一件の異常レコードを発見しました。
今度はレコード毎delete&insertではなく、このカラムについてのupdate
だけを行いました。
この操作の後pg_dumpを再度行うと、無事にアーカイブ作成に成功しました。

もしかしたらもっとエレガントな解決策があったのかもしれませんが、結局
こういう泥臭い手段で解消してしまいました。
勉強不足を痛感しております。
三淵さん、井上さん、御協力ありがとうございました。

+-----------------------------------------------------------+
|  株式会社デジタオ 技術担当                      工藤順三  |
|  mail tech @ dk.catv.ne.jp                                  |
+--URL  http://digitao.net/ --------------------------------+



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