予期せぬslonyレプリケーションの停止
slonyのレプリケーションが異常停止したようで、ひたすらログ調査。
2012-12-16 00:01:59 JST DEBUG2 remoteHelperThread_1_1: 63.716 seconds delay for first row 2012-12-16 00:01:59 JST DEBUG2 remoteHelperThread_1_1: 63.717 seconds until close cursor 2012-12-16 00:01:59 JST DEBUG2 remoteHelperThread_1_1: inserts=12 updates=81 deletes=0 2012-12-16 00:02:00 JST DEBUG2 remoteWorkerThread_1: new sl_rowid_seq value: 1000000000000000 2012-12-16 00:02:00 JST DEBUG2 remoteWorkerThread_1: SYNC 25423110 done in 64.255 seconds
レプリケーション自体は動いているようだが、時間がかかりすぎている。。。
で、ドキュメントによると
6. Slony-I FAQ: Performance Issues
pg_listenerの不要領域が溜まると、イベントの処理時間が長くなり、失敗するとのこと。
VACUUM FULLで不要領域を開放してね。但し、終了してないトランザクションがbeginした以降に不要なった領域は開放できないよ。
ということらしい。
今回のケースはまさにコレ。終了できないトランザクションプロセスがこびりついていた。
INFO: vacuuming "pg_catalog.pg_listener" INFO: "pg_listener": found 0 removable, 27948 nonremovable row versions in 381 pages DETAIL: 27947 dead row versions cannot be removed yet.
長時間のトランザクションを確認は
# SELECT pid, age(transaction) FROM pg_locks l WHERE locktype = 'transactionid' AND pid <> pg_backend_pid();
で行い、ageの値が極端に高い場合は、長時間張り付いているプロセスと判断し、pidをabortさせることにする。。。