Как удалить слот репликации в 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=#

Ответ 1

Используйте pg_drop_replication_slot:

select pg_drop_replication_slot('bottledwater');

Смотрите документы и этот блог.

Слот репликации должен быть неактивен, т.е. не должен иметь активных соединений. Поэтому, если есть потоковая реплика, использующая слот, вы должны остановить потоковую реплику. Или вы можете изменить его recovery.conf чтобы он больше не использовал слот, и перезапустить его.

Ответ 2

В дополнение к принятому ответу, я хотел бы отметить, что следующая команда не завершится неудачей, если слот не существует (это было полезно для меня, потому что я написал это).

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

Ответ 3

@Craig Ringer, а как вы можете остановить потоковую реплику, чтобы после этого можно было удалить слот?