Архивация WAL-файлов
Исполнять сценарий необходимо от имени пользователя postgres.
Описание сценария
Процесс архивирования WAL-файла, инициируемый СУБД.
Последовательность выполнения
Шаги сценария:
- Настройте в конфигурационном файле
copywala.yamlпараметрwal_destination_uriдля архивирования WAL-файлов в выбранное хранилище. - Включите архивирование WAL-файлов в настройках БД (postgresql.conf) путем установки значений
archive_mode=onиarchive_command='copywala archive-wal %f %p'.
Результат
-
При создании нового WAL-файла СУБД запустит команду, указанную в
archive_command, и архивирует WAL-файлы в заданное хранилище (вывод статистики и поддержка многопоточного режима не активированы):2025-09-02 12:51:45.341 INF 00000001000000760000007D: wal archived -
При активации флага
--statвыводится отдельная строка с дополнительной информацией (поддержка многопоточного режима не активирована):2025-09-02 12:51:45.891 INF 00000001000000760000007D: wal archived
2025-09-02 17:51:48.763 INF wal archiving stats storage=local-fs:///home/postgres/backups/adf_019a24a3-90e5-7c33-b067-56b3f601fff2/wals archived_wals=1 workers=1 time_elapsed=15.739542ms time_compress=15.739042ms time_upload=250ns total_bytes=50331648 upload_bytes=1800 compress_ratio=27962.0 compress_algorithm=S2 -
При активации многопоточного режима архивации и передаче опции
--statкоманде архивированияarchive_command='copywala archive-wal %f %p --stat':2025-10-28 12:14:36.742 INF wal archiving stats storage=local-fs:///home/postgres/backups/adf_019a24a3-90e5-7c33-b067-56b3f601fff2/wals archived_wals=12 workers=4 time_elapsed=365.250797ms time_compress=365.242233ms time_upload=3.508µs total_bytes=201326592 upload_bytes=21729907 compress_ratio=9.3 compress_algorithm=S2 batch_size=100 from=0000000100000008000000EB to=0000000100000008000000F6
Если в качестве хранилища используется локальное хранилище (wal_destination_uri: local-fs://...), то процесс архивации выполняется следующим образом:
- По указанному пути создается поддиректория
.archiving. - Запись WAL-файла осуществляется в данную поддиректорию.
- После завершения записи файла он перемещается в целевую директорию, указанную в
wal_destination_uriв настройкахcopywala.yaml.
Такой подход предотвращает ситуацию, при которой другие сервисы могут получить доступ к WAL-файлам до завершения их записи. В результате исключается обработка частично записанных файлов.
Исключительные сценарии
Будет выведено соответствующее сообщение для случаев:
- Закончилось место на диске.
- Отсутствие прав на запись в хранилище.
- Неверно настроенная конфигурация.
Дополнительные настройки сценария
В разделе перечисляются необязательные параметры, расширяющие возможности основного сценария:
- Поддержка многопоточного режима архивации WAL-файлов.
- Обзор статистики архивированных WAL-сегментов.
- Архивирование WAL-файлов в CWL-архив.
- Настройка логирования при архивации WAL-файлов.
Поддержка многопоточного режима архивации WAL-файлов
Активация параметра is_multi_wal_archiving_enabled в разделе wal_archiving в конфигурации copywala включает поддержку многопоточного режима архивации WAL-файлов при вызове команды copywala archive-wal.
Алгоритм работы:
- Команда
copywala archive-walвызывает механизм сканирования директории WAL-файлов. - Система проверяет наличие готовых к архивации WAL-файлов в директории
pg_wal/archive_statusпутем анализа их статуса. - WAL-файлы передаются параллельно в удаленное хранилище, используя настраиваемое число рабочих потоков (количество потоков регулируется параметром
multi_wal_archiving_workers_noв разделеwal_archiving).
При включении многопоточного режима архивации успешные операции архивирования отдельных WAL-файлов не заносятся в журнал (лог-файл) с целью предотвращения его чрезмерного увеличения. Если возникает ошибка архивирования, в лог-файле отображается сообщение с описанием проблемы.
Обзор статистики архивированных WAL-сегментов
Для включения вывода статистики добавьте флаг --stat в команду архивирования: archive_command='copywala archive-wal %f %p --stat'. Статистика отобразит следующие метрики по итогам архивирования WAL-сегментов:
- хранилище (storage);
- количество заархивированных WAL-файлов (archived_wals);
- число используемых потоков (workers);
- общий объем WAL-файлов (total_bytes);
- общее количество байтов, отправленных в хранилище (upload_bytes);
- общее время архивирования всех WAL-файлов (time_elapsed);
- общее время сжатия всех WAL-файлов (time_compress);
- общее время передачи данных в хранилище (time_upload);
- степень сжатия данных (compress_ratio);
- используемый алгоритм сжатия (compress_algorithm);
- первый заархивированный WAL-файл (from). Метрика применяется при включении многопоточного режима архивации;
- последний заархивированный WAL-файл (to). Метрика применяется при и включении многопоточного режима архивации.
При активации многопоточного режима архивации и передаче опции --stat команде архивирования archive_command='copywala archive-wal %f %p --stat' введена дополнительная статистика с информацией о диапазоне заархивированных WAL-файлов (from — первый файл, to — последний).
Пример настроек
-
copywala.yaml:wal_archiving:
is_multi_wal_archiving_enabled: true -
postgresql.conf:archive_command=copywala archive-wal %f %p --stat
Архивирование WAL-файлов в CWL-архив
Архивирование WAL-файлов в CWL-архив возможно только при использовании хранилища Local FS: в copywala.yaml задан wal_destination_uri: local-fs://....
Для настройки архивирования WAL-файлов в CWL-архив используются следующие параметры (конфигурационный файл copywala.yaml раздел wal_archiving):
Параметр | Описание | Значение по умолчанию |
|---|---|---|
| Флаг включения архивации WAL-файлов в CWL-архив:
> При использовании |
|
| Максимальный размер CWL-архива с WAL-сегментами, при достижении которого формирование текущего CWL-архива завершается и создается новый. Данный параметр используется только при > Также возможно принудительно завершить формирование текущего CWL-архива. |
|
Итоговый размер CWL-архива может превышать значение параметраwal_archiving_cwl_max_file_size. Это связано с тем, что проверка размера архива выполняется после выполнения команды copywala archive-wal, и если лимит не достигнут, запись WAL-файлов продолжается в тот же архив. Поскольку размер поступающих WAL-файлов заранее неизвестен, суммарный объем данных, записанных в CWL-архив до его завершения, может превысить заданное ограничение.
Механизм принудительного переключения CWL-архива
Механизм принудительного переключения CWL-архива позволяет досрочно завершить текущий архив (до достижения им размера wal_archiving_cwl_max_file_size) и начать формирование нового.
После переключения:
- Текущий CWL-архив закрывается.
- Перемещается в целевую директорию.
- Становится доступным для внешних систем резервного копирования (СРК).
Это гарантирует, что внешняя СРК будет работать только с полностью сформированными архивами, даже если они были завершены раньше достижения максимального размера.
Механизм возможно использовать только при включенной архивации WAL-файлов в CWL-архив и использовании локального хранилища:
is_wal_archiving_in_cwl_enabled: truewal_destination_uri: local-fs://...
Переключение CWL-архива осуществляется командой:
$ copywala archive-wal force-switch-cwl
Алгоритм переключения после ввода команды:
-
Проверяется, не выполняется ли параллельно архивация WAL-файла в текущий CWL-архив. Проверка выполняется по наличию блокировки на Lock-файле
<wal_destination_uri>/.archiving/wals.cwl.lockи продолжается в течение тайм-аута, заданного в параметреforce_switch_cwl_lock_timeout(конфигурационный файлcopywala.yamlразделwal_archiving). По умолчанию –15s(15 секунд). -
Во время ожидания разблокировки Lock-файла команда каждые 1/5 тайм-аута выводит предупреждение в лог, например:
2026-03-27 15:00:18.261 [3555762] WRN waiting for unlock: /wals/.archiving/wals.cwl.lock
2026-03-27 15:00:21.461 [3555762] WRN waiting for unlock: /wals/.archiving/wals.cwl.lock
2026-03-27 15:00:24.662 [3555762] WRN waiting for unlock: /wals/.archiving/wals.cwl.lock
2026-03-27 15:00:27.862 [3555762] WRN waiting for unlock: /wals/.archiving/wals.cwl.lock -
По истечению тайм-аута:
-
Если блокировка не была снята – переключение на новый CWL-файл не произойдет. В логе появится сообщение об ошибке:
2026-03-27 15:00:30.062 [3555762] ERR timeout of waiting for unlock: /wals/.archiving/wals.cwl.lock -
Если блокировка снята успешно, команда
copywala archive-wal force-switch-cwlзавершится успешно, в логе будут записи о завершении текущего CWL-файла и продолжении архивации:2026-03-27 15:08:33.055.132 [3557350] INF completed current CWL archive wals file cwl=/dest/db_<id>/wals/<wal_segment_range>.cwl
2026-03-27 15:08:33.255 [3557350] INF wals archivation will be continued to new CWL file
-
Настройка логирования при архивации WAL-файлов
Настройка логирования при архивации WAL-файлов определяется параметром is_archive_logs_to_file_only. Он задается в конфигурационном файле copywala.yaml в секции wal_archiving и может принимать следующие значения:
true— сообщения уровняINFOпри архивации WAL-файлов записываются только в файл логов Copywala.false(значение по умолчанию) — сообщения уровняINFOодновременно записываются в файл логов Copywala и в стандартный поток ошибок (stderr).