PostgreSQL
November 30, 2022

Рост размера WAL журнала из-за слота репликации

Довольно часто в графиках кластера PostgreSQL, а конкретнее в графике Total size of WAL files, можно видеть не ровную горизонтальную линию или синус, а постоянно растущую прямую линию. График будет очень похож на биссектриссу, выходящую из угла. Это означает что есть проблемы с WAL.

Одной из самых распространённых причин такого поведения является неработающий логический слот репликации. Посмотреть это можно подключившись к кластеру и от имени root вбить команду psql.

Далее в консоли postgresql уже делаем запрос к одной из системных баз:

select * from pg_replication_slots ;

Пример проблемной выдачи:

select * from pg_replication_slots ;
-[ RECORD 1 ]-------+--------------
slot_name           | debezium
plugin              | pgoutput
slot_type           | logical
datoid              | 16552
database            | Risk1
temporary           | f
active              | f
active_pid          | [null]
xmin                | [null]
catalog_xmin        | 157861469
restart_lsn         | 1E74/9B651980
confirmed_flush_lsn | 1E75/15209D98
wal_status          | extended
safe_wal_size       | [null]

Time: 1.818 m

Здесь есть неактивный (active=f) слот от debezium (slot_name=debezium). Из-за которого и идёт рост WAL журнала.

По дефолту используется 1 слот репликации:

select * from pg_replication_slots ;
-[ RECORD 1 ]-------+------------------------------------------
slot_name           | rc1a_xxxxxxxxxxx_mdb_yandexcloud_net
plugin              | [null]
slot_type           | physical
datoid              | [null]
database            | [null]
temporary           | f
active              | t
active_pid          | 1242723
xmin                | 8678220
catalog_xmin        | [null]
restart_lsn         | 40E/DD0007D8
confirmed_flush_lsn | [null]
wal_status          | reserved
safe_wal_size       | [null]
two_phase           | f

Time: 2.806 m

Слот удаляется через функцию pg_drop_replication_slot.

select pg_drop_replication_slot('slot_name');

Пример с debezium:

select pg_drop_replication_slot('debezium');