Как можно избежать ошибки, когда запрашиваемый сегмент WAL уже удален?

Как решить проблему с обрывом репликации на Slave во время загрузки большой базы данных на Master в потоковой репликации Master-Slave PostgreSQL?

В данном случае, при попытке загрузки базы данных на Master размером 95 ГБ, репликация на Slave ломается, и в логах Master появляется следующая ошибка:

```
2024-02-14 13:28:22.756 MSK [773] ОШИБКА:  запрошенный сегмент WAL 0000000100000036000000C7 уже удалён
2024-02-14 13:28:22.756 MSK [773] ОПЕРАТОР:  START_REPLICATION 36/C7000000 TIMELINE 1
```

Какие варианты решения этой проблемы существуют? Увеличение значений параметров `max_wal_size` и `wal_keep_size` возможно, но есть ли еще другие варианты решения?
  • 14 февраля 2024 г. 10:48
Ответы на вопрос 2
Один из возможных вариантов решения проблемы с обрывом репликации на Slave во время загрузки большой базы данных на Master в потоковой репликации Master-Slave PostgreSQL - это использование инструмента `pg_basebackup` для создания резервной копии базы данных на Master и восстановления ее на Slave.

Для этого можно выполнить следующие шаги:

1. Остановите репликацию на Slave:

```
SELECT pg_stop_replication();
```

2. Создайте резервную копию базы данных на Master с использованием `pg_basebackup`:

```
pg_basebackup -D /path/to/backup_directory -Ft -Xs -z -P -R
```

В этой команде `/path/to/backup_directory` - это путь к каталогу, в котором будет создана резервная копия базы данных.

3. Скопируйте резервную копию базы данных на Slave.

4. Остановите PostgreSQL на Slave.

5. Восстановите резервную копию базы данных на Slave с использованием команды `pg_restore`:

```
pg_restore -c -U postgres -d <database_name> <backup_file>
```

В этой команде `<database_name>` - имя базы данных, а `<backup_file>` - путь к файлу резервной копии базы данных.

6. Запустите PostgreSQL на Slave.

7. Настройте репликацию на Slave:

```
SELECT pg_start_replication('<имя_слота>', '<имя_стартовой_точки>');
```

В этой команде `<имя_слота>` - это имя слота, на который будет осуществляться репликация, `<имя_стартовой_точки>` - это имя стартовой точки, с которой будет начинаться репликация.

Этот подход позволяет избежать проблемы с удаленным сегментом WAL, поскольку при создании резервной копии базы данных с использованием `pg_basebackup`, включается весь необходимый WAL файл и не возникают ошибки восстановления на Slave.
wal_keep_size размером больше ожидаемого лага репликации по объёму wal (это место будет занято постоянно, зато из-за этого не угрожает уронить мастер по переполнению диска) 

либо использовать слоты репликации. Очень желательно с разумным max_slot_wal_keep_size, чтобы забытый слот репликации умер, а не уронил мастер по исчерпанию места на диске.

либо архив wal, но если не нужен для других задач, то чаще используется wal_keep_size или слоты репликации
Похожие вопросы