Устранение последствий переполнения хранилища кластера WAL-журналами
Описание проблемы
В работе кластера Managed Services for PostgreSQL наблюдается одна или несколько указанных ниже проблем:
- В результате трансфера Yandex DataTransfer произошло переполнение хранилища данных базы;
- Превышено количество слотов репликации для кластера;
- Запись новых данных в таблицы в баз данных кластера не производится.
Решение
Ошибка может возникать из-за проблем со слотами репликации во время операций с базами кластера со стороны Data Transfer.
Кажжый выполняющийся трансфер создает слот репликации в базе данных.
Слот репликации – это указатель на позицию в WAL-журнале, если слот не используется – позиция в журнале не изменяется.
Если данные из этого слота не читались по какой-то причине, размер WAL-журнала продолжает увеличиваться до тех пор, пока не закончится свободное место в хранилище кластера или пока не будет превышено значение параметра Max slot wal keep size
Узнать, какие слоты репликации открыты в базе можно, подключившись к одной из баз кластера с помощью psql
и выполнив запрос select * from pg_replication_slots where slot_type = 'logical';
.
select * from pg_replication_slots where slot_type = 'logical';
```sql
select * from pg_replication_slots where slot_type = 'logical';
-[ RECORD 1 ]-------+---------------------
slot_name | dtt7v7vbpuogkku0oce9
plugin | wal2json
slot_type | logical
```
Если для поля plugin
в слоте логической репликации указано значение wal2json
, это означает, что с базами данных этого кластера в настоящий момент работает DataTransfer.
Возможно, в процессе работы трансфера для одного или нескольких слотов репликации возникла ошибка.
Попробуйте удалить его командой select pg_drop_replication_slot('$REPLICATION_SLOT_NAME');
, где $REPLICATION_SLOT_NAME
– наименование залипшего порта репликации (в предоставленном выше примере это dtt8d6vbqjdikau1oaq1
).
Если в результате удаления слота репликации возникает ошибка replication slot "$REPLICATION_SLOT_NAME" is active for PID $PID_NUM
, попробуйте остановить выполнение трансфера на стороне DataTranser или удалить из параметров трансфера задействованный эндпоинт.
select pg_drop_replication_slot('$REPLICATION_SLOT_NAME');
db-name=> select pg_drop_replication_slot('$REPLICATION_SLOT_NAME');
ERROR: replication slot "$REPLICATION_SLOT_NAME" is active for PID 12345
Также можете указать максимальный размер WAL лога, после которого работа Data Transfer будет остановлена. Для этого измените значение параметра Max slot wal keep size
. Если размер WAL-журнала для вашей базы превысит размер, указанный в этом параметре, трансфер остановится.
Это предотвратит заполнение всего свободного места в хранилище кластера.
После ошибки (или успешного завершения трансфера) WAL-журнал удаляется и пространство в хранилище, занятое им, высвобождается.
В случае, если трансфер не завершается успешно после изменения значения параметра Max slot wal keep size
, увеличьте размер хранилища кластера по этой инструкции.
Более подробно о работе слотов репликации вы можете узнать из документации от разработчиков PostgreSQL