契機は、おそらく、PostgreSQLのVerを11.12から11.13にあげたとき…だと思っています。何をもって「Oldest query」を判定しているかについて、pluginの内容を確認したところ以下のクエリの結果でした。
SELECT 'query',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-query_start)),0) FROM pg_stat_activity WHERE state NOT LIKE 'idle%';
このクエリを
SELECT *,COALESCE(extract(epoch FROM CURRENT_TIMESTAMP-query_start),0) FROM pg_stat_activity WHERE state NOT LIKE 'idle%' ;
とかえて実行してみたところ、
ap2=# SELECT pid,usename,application_name,query_start,wait_event_type,wait_event,state,query,backend_type,COALESCE(extract(epoch FROM CURRENT_TIMESTAMP-query_start),0) FROM pg_stat_activity WHERE state NOT LIKE 'idle%' ; -[ RECORD 2 ]----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pid | 1171010 usename | replication_user application_name | walreceiver query_start | 2021-08-15 09:43:10.596396+09 wait_event_type | Activity wait_event | WalSenderMain state | active query | START_REPLICATION SLOT "replication_slot_for_gmo" C7/F3000000 TIMELINE 26 backend_type | walsender coalesce | 740.883447 -[ RECORD 3 ]----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pid | 1171187 usename | replication_user application_name | sby query_start | 2021-08-15 09:44:00.86581+09 wait_event_type | Activity wait_event | WalSenderMain state | active query | START_REPLICATION SLOT "replication_slot_for_local" C7/F3000000 TIMELINE 26 backend_type | walsender coalesce | 690.614033が返ってきました。
レプリケーションをするための「START_REPLICATION SLOT」ではじまるクエリが終わらないので、このクエリを「Oldest query」として、「CURRENT_TIMESTAMP-query_start」の値をmuninが表示する…ということでした。
今までは「Oldest query」は表示されていなかったので、START_REPLICATION SLOTではじまるクエリは実行されたらすぐに処理を終えて終了していたのだと思うのですが、何かを契機に「START_REPLICATION SLOT」が終了しなくなったのだと思います。
レプリケーションができていないわけではなく、ちゃんとレプリケーションできているので、今のところ実害はないように見えます。
$ psql -p 5432 -U postgres -c "select client_addr,state,sync_state from pg_stat_replication;" client_addr | state | sync_state ----------------+-----------+------------ ***.***.***.***| streaming | async ***.***.***.***| streaming | async (2 rows)
ただ、マニュアルを見ると「START_REPLICATION SLOT」は
サーバに対して、XXX/XXXWAL時点から、論理的レプリケーションのWALストリームを開始するよう指示します。例えば、要求されたWALがすでに回収された場合、サーバはエラーを返します。サーバが、例えば、要求されたWALセクションがすでに回収されている場合、エラーを返すことがありえます。成功時サーバはCopyBothResponseメッセージで応答し、フロントエンドに対するWALストリームを開始します。
とあるので、なんらかの応答が返ってきてクエリは終了するはず…だと思っています。
slotが悪さをしている可能性を疑い
slotが悪さをしている可能性を疑い
SELECT pg_drop_replication_slot('replication_slot_for_local');をして、再度、pg_create_physical_replication_slotしてみましたが、状況は変わりませんでした。
何かご存知の方がいらっゃいましたら、お知らせいただけると幸いです。