web-dev-qa-db-ja.com

postgres 9.4でレプリケーションスロットを削除する方法

削除したい複製スロットがありますが、削除すると、ビューから削除できないというエラーが発生します。何か案は?

postgres=# SELECT * FROM pg_replication_slots ;
  slot_name   |    plugin    | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn
--------------+--------------+-----------+--------+----------+--------+------+--------------+-------------
 bottledwater | bottledwater | logical   |  12141 | postgres | t      |      |       374036 | E/FE8D9010
(1 row)

postgres=# delete from pg_replication_slots;
ERROR:  cannot delete from view "pg_replication_slots"
DETAIL:  Views that do not select from a single table or view are not automatically updatable.
HINT:  To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.
postgres=#
25
Igor Barinov

使用する pg_drop_replication_slot

select pg_drop_replication_slot('bottledwater');

the docs および this blog を参照してください。

レプリケーションスロットは非アクティブでなければなりません。つまり、アクティブな接続はありません。したがって、スロットを使用するストリーミングレプリカがある場合は、ストリーミングレプリカを停止する必要があります。または、そのrecovery.confそのため、スロットを使用せずに再起動します。

37
Craig Ringer

受け入れられた回答の補足として、スロットが存在しない場合でも次のコマンドは失敗しないことを述べておきます(これは私がスクリプトを作成したため、これは私にとって便利でした)。

select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name = 'bottledwater';
6
Yann Vo