pg_receivewal
Эта страница переведена при помощи нейросети GigaChat.
pg_receivewal — выводит журналы предзаписи с сервера PostgreSQL.
Синтаксис
pg_receivewal [option...]
Описание
pg_receivewal предназначена для потоковой передачи WAL (журнала предзаписи) с работающего кластера PostgreSQL. Полученные данные сохраняются в локальный каталог, который может быть использован как архив для восстановления до определенного момента времени. Подробнее об этом в разделе «Непрерывное архивирование и восстановление до заданной точки во времени (PITR)»
В отличие от таких механизмов, как archive_command и archive_library, pg_receivewal начинает передачу WAL в режиме реального времени — по мере его генерации на сервере, без ожидания завершения сегментов. Поэтому при использовании утилиты нет необходимости задавать archive_timeout.
По умолчанию pg_receivewal, в отличие от встроенного WAL-приемника на реплицирующем сервере, сбрасывает данные WAL только после завершения сегмента. Чтобы обеспечить сброс в реальном времени, следует использовать параметр --synchronous. Однако поскольку pg_receivewal не применяет WAL, его не следует использовать в качестве синхронного резервного при значении remote_apply параметра synchronous_commit. В противном случае PostgreSQL будет считать его отстающей резервной копией, что приведет к блокировке фиксации транзакций. Чтобы этого избежать, нужно задать application_name для pg_receivewal, отличное от указанных в synchronous_standby_names, либо изменить synchronous_commit на другое значение.
Передача журналов предзаписи осуществляется через обычное подключение к PostgreSQL с использованием протокола репликации. Для корректной передачи WAL необходимо соблюдение следующих требований:
- Соединение устанавливает суперпользователь или пользователь с правом
REPLICATION(подробнее описано в разделе «Атрибуты ролей»). - В файле pg_hba.conf разрешено подключение для репликации.
- Параметр max_wal_senders установлен на достаточное значение, чтобы поток мог подключиться.
Определение точки начала потока WAL при запуске pg_receivewal происходит следующим образом:
-
Выполняется сканирование целевого каталога для поиска последнего завершенного сегмента WAL. В качестве стартовой точки берется начало следующего сегмента.
-
Если точка начала не определена и используется слот репликации, отправляется команда
READ_REPLICATION_SLOTдля полученияrestart_lsn— доступно, начиная с PostgreSQL 15. -
Если предыдущие способы не дали результата, используется последняя позиция сохраненных данных в WAL, полученная через команду
IDENTIFY_SYSTEM.
При потере соединения или невозможности его установить из-за некритической ошибки, pg_receivewal безостановочно пытается подключиться повторно, восстанавливая передачу при успешном соединении. Чтобы отключить этот режим, используйте параметр -n.
Если не возникнет фатальных ошибок, утилита будет работать непрерывно до получения сигнала завершения SIGINT (Ctrl+C) или SIGTERM.
Параметры
Для утилиты pg_receivewal существуют следующие параметры командной строки:
-D directory--directory=directory- Устанавливает каталог для записи данных. Параметр обязателен.
-E lsn--endpos=lsn- Завершает репликацию и выходит с кодом 0, как только достигается указанный LSN. Если в потоке имеется запись с точным соответствием LSN, она будет обработана.
--if-not-exists- Отменяет вызов ошибки, если при использовании с параметром
--create-slot, слот с заданным именем уже существует.
-n--no-loop- Не выполняет повторных попыток подключения при ошибке соединения. В случае ошибки сразу завершает выполнение с ошибкой.
--no-sync- Отключает принудительную запись данных WAL на диск. Это повышает производительность, но увеличивает риск потери данных при сбое системы. Используется, как правило, только для тестирования. Несовместим с параметром
--synchronous.
-s interval--status-interval=interval- Задает интервал между сообщениями о состоянии. Интервал указывается в секундах. Меньшие значения позволяют более точно отслеживать прогресс резервного копирования с сервера. Значение ноль полностью отключает периодические обновления статуса, хотя обновление все равно будет отправлено при запросе сервера, чтобы избежать отключения из-за тайм-аута. Значение по умолчанию составляет 10 секунд.
-S slotname--slot=slotname- Указывает слот репликации для использования. При этом
pg_receivewalсообщает серверу позицию сохранения, отмечая, какой сегмент был сохранен на диске, чтобы сервер мог удалить этот сегмент, если он больше не нужен.Если клиент настроен как синхронный реплицируемый сервер, но
--synchronousне указан, это может привести к блокировке фиксации транзакций на основном сервере. Чтобы избежать такой ситуации, следует использовать--synchronous.
--synchronous- Сохраняет данные WAL на диск сразу после того, как они были получены и отправляет статус серверу сразу после синхронизации, независимо от
--status-interval.Обязательно при использовании
pg_receivewalв роли синхронного реплицируемого сервера, чтобы поддерживать корректную обратную связь.
-v--verbose- Включает режим подробного вывода.
-Z level-Z method[:detail]--compress=level--compress=method[:detail]- Включает сжатие журналов предзаписи.
Метод может быть
gzip,lz4(при наличии поддержки--with-lz4) илиnoneдля отсутствия сжатия. Если указан только уровень (целое число), то при значении больше 0 используетсяgzip, при 0 — сжатие не применяется.Дополнительно могут быть заданы параметры в формате
keywordилиkeyword=value. В настоящее время поддерживается только ключевоеkeyword=level. При включении сжатия к именам файлов добавляется соответствующий суффикс:.gzдляgzip,.lz4— дляlz4.
-d connstr--dbname=connstr- Задает параметры подключения к серверу. Параметры указываются в виде строки подключения. Они переопределят любые конфликтующие параметры командной строки.
Этот параметр называется
--dbnameдля согласованности с другими клиентскими приложениями, но посколькуpg_receivewalне подключается ни к какой конкретной базе данных в кластере, любое имя базы данных, включенное в строку подключения, будет проигнорировано сервером. Однако указанное таким образом имя базы данных заменяет имя базы данных по умолчанию (replication) для поиска пароля репликационного подключения в файле~/.pgpass. Аналогично, промежуточное ПО или прокси-серверы, используемые для подключения к PostgreSQL, могут использовать имя для таких целей, как маршрутизация соединений.
-h host--host=host- Указывает хост компьютера, на котором запущен сервер. Значение по умолчанию берется из переменной окружения
PGHOST. Если она не установлена, выполняется подключение к Unix-сокету (каталог Unix-сокета начинается с косой черты).
-p port--port=port- Указывает TCP-порт или расширение файла локального Unix-сокета для подключения к серверу. Значение по умолчанию берется из переменной окружения
PGPORTили задается при компиляции.
-U username--username=username- Указывает имя пользователя для подключения.
-w--no-password- Отключает запрос на ввод пароля. Если сервер требует аутентификации по паролю и пароль недоступен другими способами, такими как файл
.pgpass, попытка подключения завершится неудачей. Параметр полезен в пакетных заданиях и сценариях, где нет пользователя, который мог бы ввести пароль.
-W--password- Запрашивает пароль перед подключением к основному серверу.
Параметр не является обязательным, поскольку pg_receivewal автоматически запросит пароль, если сервер требует аутентификацию паролем. Однако утилита потратит попытку подключения, чтобы выяснить, что сервер хочет пароль. В некоторых случаях стоит ввести -W, чтобы избежать дополнительной попытки подключения.
--create-slot- Создает новый физический слот репликации с именем, указанным в
--slotи завершает выполнение.
--drop-slot- Удаляет физический слот репликации с именем, указанным в
--slot, и завершает выполнение.
-V--version- Выводит версию
pg_receivewalи завершается.
-?--help- Показывает справку о параметрах командной строки утилиты
pg_receivewalи завершается.
Код завершения
pg_receivewal завершает работу со следующими кодами завершения:
- Код 0 — при получении сигнала
SIGINT, что считается нормальным завершением и не расценивается как ошибка. - Ненулевой код — в случае фатальной ошибки или завершения по другим сигналам.
Переменные окружения
Утилита pg_receivewal использует переменные окружения, поддерживаемые libpq.
Переменная окружения PG_COLOR указывает, использовать ли цвет в диагностических сообщениях. Возможные значения — always, auto и never.
Примечания
Если pg_receivewal используется в качестве основного механизма архивирования WAL вместо archive_command или archive_library, рекомендуется задействовать слоты репликации. Без этого сервер может преждевременно удалить или перезаписать WAL-файлы, поскольку у него не будет сведений от archive_command, archive_library или репликационных слотов о том, какие данные уже заархивированы. Однако стоит учитывать, что при недостаточной скорости приема данных со стороны pg_receivewal, слот репликации может привести к заполнению дискового пространства на сервере.
Кроме того, при сохранении WAL-файлов pg_receivewal сохраняет групповые права доступа, если они были включены в исходном кластере.
Примеры
Передача журнала предзаписи с сервера на mydbserver и его хранение в локальном каталоге /usr/local/pgsql/archive:
$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive