予期せぬ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させることにする。。。