[pgsql-jp: 34203] Re: PostgreSQLと外部ディスクとの接続についての質問

Katsuhiko Okano k_okano @ po.ntts.co.jp
2004年 10月 28日 (木) 21:57:43 JST


岡野と申します。


上野 礼美 wrote:
> Linux上にPostgreSQLを導入したDBサーバに対して、1sおきにクライアントから
> insertを発行した。この最中に、サーバと外部ディスクを接続しているSCSIケーブル
> を抜いたところ、抜いてから約110sの間PostgreSQLサーバからクライアントに正常応
> 答が返ってきて、その後からエラー応答が返ってくるようになった。

異常系の試験はどこまで救うべきか悩みますよね。

在原さんが書かれているように、ログメッセージを見る限りは
Oct 28 11:55:15 では、バッファ上にあるブロックに空きがあったため
そこに挿入できたのではないでしょうか。
サーバの再起動後に挿入したはずのレコードが作られていなかったのは、
バッファをディスクに書き出す前にディスクが故障していたためだと思います。

Oct 28 11:55:16 では、現在確保してある表ブロックのどこにも新しいレコードを
入れる場所が無かったため、表ブロックを拡張(extend)して
新しいブロックを確保しようとしたが、
ディスクにアクセスできなかったためエラーとしたのではないでしょうか。


> →SCSIケーブルを抜いたらすぐに、クライアントからの問い合わせに対しエラー応答
>> 返すようにしたい。変更すべき設定・対処法などありますでしょうか?

SCSIケーブルを抜いたらすぐに、故障が起きたと知りたいのであれば、
PostgreSQLの設定変更ではなくOSに聞かないと分からないと思います。
過去に私がかかわったシステムでは、FC接続二重化のRAIDディスクのエラーメッセージを
syslog等を監視して拾っていました。

ディスク故障が起きたら、その後のクライアントからの問い合わせに対しエラー応答
を返すようにしたいのであれば、三谷さんの書かれているように
wal_sync_methodパラメタやfsyncパラメタでログをすぐに書き、
そこでログが書けなかったらエラーとする方法がよいと思います。


> また、この辺りのPostgreSQLの仕組み・原因についても、わかればと思っておりま
> す。
PostgreSQLは他のDBMSと同様にメモリ上にバッファを用意して
ディスクへの読み書きを減らして性能向上しようとしています。
また、PostgreSQLはOracle等とは違い、必要なディスクブロックは
足りなくなったときにブロック単位で確保しているようです。
(src\backend\access\heap\heapam.cのheap_insert()から呼んでいるRelationGetBufferForTuple()?)



Tatsuo Ishii wrote:
> PostgreSQLでは(fsync=offでない限り)コミット時に同期書込を行うので,そ
> こでI/Oエラーにならないのだとすると,カーネルのバグしか考えられません.
> つまり,PostgreSQLの問題ではないということです.
カーネル2.4.20より前のバージョンには、fsync関連で問題があるようです。

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




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