Чистка архива WAL в реплицируемых базах Postgresql


Официальная дока на тему находится по адресу https://www.postgresql.org/docs/9.2/static/pgarchivecleanup.html Я же продемонстрирую немного практики, как раз на том сервере который вышел за все допустимые лимиты.

Сейчас наблюдается такая картина

# du -hs /var/lib/postgresql/10/archive/
2.6G   /var/lib/postgresql/10/archive/
# du -hs /var/lib/postgresql/10/main/
1.3G   /var/lib/postgresql/10/main/

Размер архив-логов в два раза больше чем сама база (что логично) поэтому мы можем или чистить архив-логи автоматически или производить эти операции вручную.

Можно почистить архив в ручном режиме и для этого мы создаем точку backup на мастер-сервере (задаем ей метку):

# su postgres
$ psql
# SELECT pg_start_backup('test-archive-clean', true);
# SELECT pg_stop_backup();

В чистом виде нас интересует исключительно создание backup-файла в архиве WAL:

$ ls /var/lib/postgresql/10/archive/ | grep backup
00000001000000000000000E.00000028.backup
0000000100000000000000AD.00000028.backup

Проверяем состояние репликации (текущую позицию) у MASTER-сервера:

# select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 0/AE1D8000
(1 row)

На Slave-сервере:
# select pg_last_wal_replay_lsn();
 pg_last_wal_replay_lsn
------------------------
 0/AE1E9A68
(1 row)

На Slave-сервере принудительно выполним очистку архива wal-логов до текущей backup-точки:

$ pg_archivecleanup -d /var/lib/postgresql/10/archive/ 0000000100000000000000AD.00000028.backup

В результате выполнения команды будет выведен список удаленных файлов журнала:

$ pg_archivecleanup -d /var/lib/postgresql/10/archive/ 0000000100000000000000AD.00000028.backup
pg_archivecleanup: keeping WAL file "/var/lib/postgresql/10/archive//0000000100000000000000AD" and later
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//00000001000000000000005B"
...
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//0000000100000000000000A5"
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//000000010000000000000015"

Теперь архив содерхит только следующие записи:

$ ls -lua /var/lib/postgresql/10/archive/
total 131096
drwxr-xr-x 2 postgres postgres   12288 Aug 28 2018 .
drwxr-xr-x 4 postgres postgres    4096 Aug 28 09:22 ..
-rw------- 1 postgres postgres     304 Aug 1 14:56 00000001000000000000000E.00000028.backup
-rw------- 1 postgres postgres 16777216 Aug 28 09:34 0000000100000000000000AD
-rw------- 1 postgres postgres     305 Aug 28 09:34 0000000100000000000000AD.00000028.backup
-rw------- 1 postgres postgres 16777216 Aug 28 10:05 0000000100000000000000AE
-rw------- 1 postgres postgres 16777216 Aug 28 10:11 0000000100000000000000AF
-rw------- 1 postgres postgres 16777216 Aug 28 10:29 0000000100000000000000B0
-rw------- 1 postgres postgres 16777216 Aug 28 10:39 0000000100000000000000B1
-rw------- 1 postgres postgres 16777216 Aug 28 10:49 0000000100000000000000B2
-rw------- 1 postgres postgres 16777216 Aug 28 11:03 0000000100000000000000B3
-rw------- 1 postgres postgres 16777216 Aug 28 11:11 0000000100000000000000B4

Для автоматической очистки мы добавим в файл /var/lib/postgresql/10/main/recovery.conf параметр:

archive_cleanup_command = 'pg_archivecleanup -d /var/lib/postgresql/10/archive/ %r >> /var/log/postgresql/cleanup.log 2>&1'

Перезапускаем Postgresql:

# /etc/init.d/postgresql restart

Проверяем лог чистки архива:

pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AD"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AF"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B0"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B4"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B3"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B2"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B1"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AE"
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B6" и последующие
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B5"

Чистить wal-логи надо обязательно, на интенсивных операциях обновления и записи они разрастаются неприлично быстро.