不調。スランプというか。
要は仕事が思うように進まないだけなんだが。
とある仕事で使っている PostgreSQL サーバが月曜深夜に、
NOTICE: Buffer Leak: [003] (freeNext=-3, freePrev=-3, relname=service_stat, blockNum=67, +flags=0x4, refcount=1 77)
などという不吉なメッセージを吐いていた。 これ以降、SQLを投げてもまともに返事が得られないという、しゃれにならない事態が発生。
postmaster を再起動したら直ったようにみえたが、どうもまだ特定のテーブルにアクセスできず。 service_stat というテーブルから SELECT しようとしても、
ERROR: Relation 'service_stat' does not exist
などと言われてしまう。システム表 (pg_class) には service_stat のレコードがあるようにみえるのだが、 これも、
SELECT * FROM pg_class WHERE relname='service_stat';
とすると 0 rows。しかし
SELECT * FROM pg_class WHERE relname ~ 'service_stat';
とすれば1行返ってくる。なんなんだ。
... ま、このままではしょうがないので、乱暴だがシステム表を手動で書き換える。
UPDATE pg_class SET relname='service_stat' WHERE relname ~ 'service_stat';
とすると、service_stat テーブルに触れるようになった。入っているデータは問題ない模様。
# 共有メモリがぶっ壊れて、その余波でシステム表も壊れたのか?
この DB サーバ、一昨年秋 と 昨年夏 にもトラブってるというクセモノ。他の機械で動いている PostgreSQL はほぼノートラブルなだけに、もしかしてこの機械、ハードウェア的に何かあるんじゃないか (メモリがごくまれにエラーを起こすとか?) という疑念も沸くところ。 しかし疑念が沸いたところで、今さらハードウェアの検証からやり直すわけにもいかないしなあ・・・