[pgsql-jp: 37314] Re: 特定のテーブルに全アクセスするとERROR: could not read block 1855 of relation 1663/115852/115869: Successと表示されます

Y. Shimada yshim_pgsql @ storgate.co.jp
2006年 6月 29日 (木) 18:43:22 JST


島田@Storgateともうします。

On 2006/06/29, at 16:44, Hisakazu Nakai wrote:

> 中井です。
> 管理者 wrote:
>> pg_dump: Error message from server: ERROR:  could not read block  
>> 344 of relation 1663/115852/115874: Input/output error
>> とエラーが出てしまいました。一部データは出力されているような 
>> のですがど
>> の様に考えれば良いのでしょうか?
>> またレンタルサーバ業者(大手)に問い合わせたのですが、ハード 
>> 障害は発生
>> していないとのことです。

 ?ですね。
その業者の方は、どんな根拠でハード障害ではないと判断されたので 
しょうか?
たんに、ハードエラーのメッセージが出ていないから。。。って
ファイルシステムが壊れた(?)かも、
過去の、/var/log/messages に何らかのヒントがあるかと。。思 
います。
今日(最近)だけでなく、出来うる限り過去にさかのぼってチェックし 
ないと


>> 復旧手段としてはどの様にすればよいのでしょうか。
>
> どうみてもハードディスクのエラーなので、復旧できないと思います。
> データベースを停止して、tarでデータを吸い上げてみてはど 
> うですか。
> tarでデータを吸い上げるときにエラーメッセージが出る筈です。
> 壊れているのは一部のデータ(ハードディスクの一部)なので、
> それ以外のアクセスは問題ないでしょう。

データベース(postmaster)を停止する前に、いまのうちに、
pg_dump 等で、出来うる限り別ディスク(別サーバ)に、
とれるだけ(エラーの出るテーブルは別にして、個別にテーブルを
指定するなどして。、)のバックアップをとっておくことを、
おすすめします。

考えたくありませんが、万一、postmaster が再び正常起動でき 
なく
なってしまったら。。

また、、

On 2006/06/29, at 14:40, 管理者 wrote:

> そこでテーブルにselect * from テーブル名
> とその対象テーブルを覗いてみようとしたところ
> ERROR:  could not read block 1855 of relation 1663/115852/115869:
> Success
> というメッセージが表示されました。
> select * from テーブル名 where キー1=1
> といった具合に検索対象を絞りこむと一部の時だけ上記のエラーメッ 
> セージが
> 表示されます。

ということは、115869 は多分 oid なので、、、

postgres サーバに postgresql 管理者アカウントでログインし、
$PG_HOME、$PGDATA はそちらの環境に合わせてください。

* iod2name は contrib にあります。
 $PG_HOME/bin の中になければ、別途、make する必要が 
あるかもしれません。

postgres $ $PG_HOME/bin/oid2name -d DB名 -t テーブル名

 (以下サンプル)
  $ oid2name -d hogehoge -t hoge_tbl
  Oid of table hoge_tbl from database "hogehoge":
  ---------------------------------
115869  = hoge_tbl

とすれば、エラーのでるテーブルの oid が判ります。
その結果、表示された oid が "115869"なら、ビンゴで、

そこで、
postgres $ find $PGDATA -name 115869 -ls

とすれば、エラーの出ているファイルの path がわかります。
HDD の固定的障害なら、find でもエラーが出るかもしれません。

 (以下サンプル)
  $ cd $PGDATA
  # find . -name 115869 -ls
  79045 2192 -rw-r--r--   1 postgres postgres 22232  6月  
29 14:52 ./base/.../115869

次に、find でエラーが出なければ。。

postgres $ cp -p ./base/.../115869 /tmp/.

とかしてみれば、ファイルが読めるかどうかが判るはずです。
エラーなら、/var/log/messages を確認してください。


また、oid2name で表示された oid が "115869" で 
ないなら、

$ oid2name -d hogehoge -o 115869

としてみると、oid "115869" をもつテーブル(インデックス等)
が表示されるかと、、
 (以下サンプル)
  $ oid2name -d hogehoge -o 115869
  Tablename of oid 115869 from database "hogehoge":
  ---------------------------------
115869  = pg_toast_17406_index

----



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