[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 メーリングリストの案内