Журнал упреждающей записи
Дополнительную информацию о настройке этих параметров см. в разделе Конфигурация WAL.
Параметры
wal_level (enum)
wal_level определяет, сколько информации записывается в WAL. Значение по умолчанию — replica, при котором в журнал записывается достаточно данных для поддержки архивирования WAL и репликации, включая выполнение запросов только на чтение на резервном сервере. Значение minimal удаляет всю информацию, кроме необходимой для восстановления после сбоя или аварийного отключения. Наконец, logical добавляет информацию, необходимую для поддержки логического декодирования. Каждый последующий уровень включает информацию, регистрируемую на всех уровнях ниже его. Этот параметр можно задать только при запуске сервера.
На уровне minimal WAL-протоколирование некоторых массовых операций можно пропустить без риска потери данных, что позволяет значительно ускорить эти операции (см. раздел Выключите архивацию WAL и потоковую репликацию). Такая оптимизация возможна в следующих операциях:
ALTER ... SET TABLESPACE
CLUSTER
CREATE TABLE
REFRESH MATERIALIZED VIEW
(без указания CONCURRENTLY)
REINDEX
TRUNCATE
Но минимальный WAL не содержит достаточно информации для восстановления данных из базовой резервной копии и журналов WAL, поэтому для включения архивирования WAL (archive_mode) и потоковой репликации необходимо установить уровень replica или более высокий. Обратите внимание, что при смене значения с wal_level на minimal все базовые резервные копии, созданные до этого, непригодными для восстановления архива и резервного сервера, что может привести к потере данных.
На уровне logical протоколируется та же информация, что и на уровне replica,
а также информация, необходимая для извлечения из WAL наборов логических
изменений. Установка уровня logical увеличит объем WAL, особенно если многие
таблицы сконфигурированы с параметром REPLICA IDENTITY FULL и выполняется
множество команды UPDATE
и DELETE
.
fsync (boolean)
Если этот параметр включен, сервер QHB попытается добиться, чтобы изменения были физически записаны на диск, выполняя системные вызовы fsync() или иные схожие методы (см. wal_sync_method). Это гарантирует, что кластер баз данных сможет вернуться в согласованное состояние после сбоя операционной системы или оборудования.
Хотя выключение fsync часто повышает производительность, это может привести к неустранимому повреждению данных в случае отключения питания или сбоя системы. Поэтому рекомендуется выключать fsync только в том случае, если вы легко можете восстановить всю базу данных из внешнего источника.
К примерам безопасных условий для выключения fsync относятся начальная загрузка нового кластера баз данных из файла резервной копии, использование кластера баз данных для обработки пакета данных, после которой база данных будет удалена и создана заново, или задействование клона базы данных только для чтения, который часто пересоздается и не используется для отработки отказа. Высококачественное оборудование само по себе не является достаточным основанием для выключения fsync.
Для надежного восстановления при смене значения fsync с off на on
необходимо принудительно перенести все измененные буферы из ядра в стабильное
хранилище. Это можно сделать, когда остановлен кластер или включен режим fsync,
запустив команду qhb_bootstrap --sync-only
или команду sync
, размонтировав
файловую систему или перезагрузив сервер.
Во многих ситуациях выключение параметра synchronous_commit для некритичных транзакций может обеспечить больший потенциальный выигрыш в производительности, чем выключение fsync, и при этом без сопутствующего риска повреждения данных.
Параметр fsync можно задать только в файле qhb.conf или в командной строке сервера. Если вы выключите этот параметр, возможно, также имеет смысл выключить параметр full_page_writes.
synchronous_commit (enum)
Определяет, после завершения какого этапа обработки WAL сервер баз данных вернет клиенту сообщение об успешном выполнении операции. Допустимые значения: remote_apply (применено удаленно), on (включен, значение по умолчанию), remote_write (записано удаленно), local (локально) и off (выключен).
Если значение synchronous_standby_names не задано, для данного параметра имеют смысл только значения on и off; при значениях remote_apply, remote_write и local уровень синхронизации будет тот же, что и с вариантом on. Локальное поведение всех режимов, отличных от off, заключается в ожидании локального сброса WAL на диск. В режиме off из-за отсутствия ожидания возможна задержка между моментом, когда клиенту сообщается об успешном выполнении, и моментом, когда транзакция действительно гарантированно защищена от сбоя сервера. (Максимальная задержка равна утроенному значению wal_writer_delay.) В отличие от fsync, значение off этого параметра не создает риска несогласованности базы данных: сбой операционной системы или базы данных может привести к потере некоторых последних предположительно зафиксированных транзакций, но состояние базы данных будет таким же, как если бы эти транзакции были прерваны обычным образом. Поэтому выключение параметра synchronous_commit может быть полезной альтернативой выключению fsync, когда производительность важнее точной уверенности в прочности транзакции. Дополнительную информацию см. в разделе Асинхронная фиксация.
Если значение synchronous_standby_names не пустое, synchronous_commit также определяет, будет ли сервер при фиксировании транзакций ожидать, пока их записи WAL будут обработаны на резервном сервере (или серверах).
Если задано значение remote_apply, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции, применили эту транзакцию, так что она стала видимой для запросов на резервном сервере (или серверах), а также сохранили ее в стабильном хранилище. Это вызовет куда большую задержку фиксирования, нежели предыдущие параметры, поскольку нужно будет дождаться воспроизведения WAL. Если задано значение on, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции и сохранили ее в стабильном хранилище. Это гарантирует, что транзакция будет потеряна, только если хранилище базы данных будет повреждено и на основном, и на всех синхронных резервных серверах. Если задано значение remote_write, фиксирование не завершится, пока ответы от текущих синхронных резервных серверов не укажут, что они получили запись о фиксировании транзакции и сохранили ее в своих файловых системах. Этот вариант гарантирует сохранение данных даже в случае сбоя резервного сервера QHB, но не в случае сбоя на уровне его операционной системы, поскольку данные могут не достичь стабильного хранилища на этом сервере. Со значением local фиксирование завершится после локального сброса данных на диск, не дожидаясь репликации. Обычно этот вариант нежелателен при синхронной репликации, но он предоставлен для полноты.
Этот параметр можно изменить в любое время; поведение каждой конкретной
транзакции определяется значением, действующим на момент ее фиксирования. Таким
образом, есть возможность и смысл, чтобы некоторые транзакции фиксировались
синхронно, а другие — асинхронно. Например, чтобы одна транзакция с несколькими
состояниями фиксировалась асинхронно, когда по умолчанию задано противоположное
значение, выполните в этой транзакции команду SET LOCAL synchronous_commit TO OFF
.
Характеристики различных значений synchronous_commit приведены в Таблице 1.
Таблица 1. Режимы synchronous_commit
Значение synchronous_commit | Стабильная локальная фиксация | Стабильная фиксация на резервном сервере после сбоя QHB | Стабильная фиксация на резервном сервере после сбоя ОС | Согласованность запросов на резервном сервере |
---|---|---|---|---|
remote_apply | • | • | • | • |
on | • | • | • | |
remote_write | • | • | ||
local | • | |||
off |
wal_sync_method (enum)
Метод, используемый для принудительного сохранения изменений WAL на диск. Если режим fsync выключен, то этот параметр не учитывается, поскольку принудительные сохранения файла WAL вообще не будут проводиться. Возможные значения этого параметра:
-
open_datasync (записать файлы WAL функцией open() с параметром O_DSYNC)
-
fdatasync (вызывать fdatasync() при каждом фиксировании)
-
fsync (вызывать fsync() при каждом фиксировании)
-
fsync_writethrough (вызывать fsync() при каждом фиксировании, форсируя вызывая сквозную запись любого дискового кэша)
-
open_sync (записать файлы WAL функцией open() с параметром O_SYNC)
Варианты open_* также применяют флаг O_DIRECT, если он доступен. Не все эти методы доступны на всех платформах. По умолчанию выбирается первый метод из приведенного выше списка, который поддерживается платформой, за исключением того, что в Linux и FreeBSD значением по умолчанию является fdatasync. Выбираемый по умолчанию вариант не обязательно идеален; для создания отказоустойчивой конфигурации или достижения оптимальной производительности может потребоваться изменить это значение или другие аспекты конфигурации вашей системы. Эти аспекты рассматриваются в разделе Надежность. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
full_page_writes (boolean)
Когда этот параметр включен, сервер QHB записывает в WAL все содержимое каждой страницы диска при первом изменении этой страницы после контрольной точки. Это необходимо, поскольку запись страницы, которая выполнялась во время сбоя операционной системы, может оказаться завершена только частично, что приводит к появлению на диске страницы, содержащей смесь старых и новых данных. Информации об изменениях на уровне строк, обычно хранящейся в WAL, будет недостаточно для полного воссоздания такой страницы при восстановлении после сбоя. Сохранение образа полной страницы гарантирует, что ее можно восстановить корректно, но ценой будет увеличение объема данных, которые должны быть записаны в WAL. (Поскольку воспроизведение WAL всегда начинается с контрольной точки, достаточно сделать это при первом изменении каждой страницы после контрольной точки. Поэтому одним из способов снижения затрат на запись полных страниц является увеличение интервалов контрольных точек.)
Выключение этого параметра ускоряет обычные операции, но может привести к неисправимому или незаметному повреждению данных после сбоя системы. Поскольку риски при этом схожи с рисками при выключении fsync, хотя и в меньшей степени, его следует выключать только при тех же обстоятельствах, которые рекомендованы для вышеприведенного параметра.
Выключение этого параметра не влияет на применение архивирования WAL для восстановления состояния на определенный момент времени (PITR) (см. раздел Непрерывное архивирование и восстановление на момент времени (PITR)).
Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Значение по умолчанию — on (включен).
wal_log_hints (boolean)
Когда этот параметр имеет значение on (включен), сервер QHB записывает в WAL все содержимое каждой страницы диска при первом изменении этой страницы после контрольной точки, даже при второстепенных изменениях так называемых вспомогательных битов.
Если включен расчет контрольных сумм данных, изменения вспомогательных битов всегда регистрируются в WAL, и этот параметр игнорируется. С помощью этого параметра можно проверить, насколько больше информации будет запротоколировано в WAL, если в вашей базе данных будет включен расчет контрольных сумм данных.
Этот параметр можно задать только при запуске сервера. Значение по умолчанию — off (выключен).
wal_compression (boolean)
Когда этот параметр имеет значение on (включен), сервер QHB сжимает образ полной страницы, записанный в WAL, когда включен параметр full_page_writes или при создании базовой резервной копии. Сжатый образ страницы будет распакован во время воспроизведения WAL. Значение по умолчанию — off (выключен). Только суперпользователи могут изменять этот параметр.
Включение этого параметра может уменьшить объем WAL, не повышая риск неустранимого повреждения данных, но ценой некоторой дополнительной нагрузки на процессор, связанной со сжатием данных при записи в WAL и их разворачиванием при воспроизведении WAL.
wal_init_zero (boolean)
Если этот параметр имеет значение on (включен; это значение по умолчанию), вновь создаваемые файлы WAL заполняются нулями. В некоторых файловых системах благодаря этому пространство выделяется заранее, до того, как потребуется делать записи WAL. Однако в файловых системах, работающих по принципу копирования при записи (Copy-On-Write, COW), этот метод может не давать никаких преимуществ, поэтому данный параметр позволяет пропустить ненужную в таком случае операцию. Со значением off (выключен) при создании файла WAL записывается только последний байт, чтобы файл имел желаемый размер.
wal_recycle (boolean)
Если этот параметр имеет значение on (включен; это значение по умолчанию), файлы WAL переименовываются и используются повторно, что избавляет от необходимости создавать новые файлы. В файловых системах с COW, возможно, будет быстрее создать новые файлы, поэтому данный параметр позволяет выключить это поведение.
wal_buffers (integer)
Объем разделяемой памяти, используемой для данных WAL, которые еще не были записаны на диск. Значение -1 (по умолчанию) задает размер, равный 1/32 (около 3%) от shared_buffers, но не меньше 64 КБ и не больше, чем размер одного сегмента WAL (обычно 16 МБ). Это значение можно задать вручную, если выбираемое автоматически слишком велико или мало, но любое положительное значение меньше 32 КБ будет восприниматься как 32 КБ. Если это значение указано без единиц измерения, оно считается заданным в блоках WAL, размер которых равен XLOG_BLCKSZ байт (обычно это 8 КБ). Этот параметр можно задать только при запуске сервера.
Содержимое буферов WAL записывается на диск при каждом фиксировании транзакции, поэтому очень большие значения вряд ли обеспечат значительное преимущество. Однако значение как минимум в несколько мегабайт может повысить производительность при записи на загруженном сервере, где одновременно множество клиентов фиксируют транзакции. Автонастройка, заданная по умолчанию (-1), в большинстве случаев должна давать удовлетворительные результаты.
wal_writer_delay (integer)
Определяет, с какой периодичностью процесс записи WAL будет сбрасывать WAL на диск. После каждого сброса WAL он засыпает на время, заданное wal_writer_delay, но может пробудиться раньше, если произойдет асинхронное фиксирование транзакции. Если предыдущий сброс произошел раньше, чем закончился период, указанный в wal_writer_delay, и полученный после этого объем WAL не достиг значения wal_writer_flush_after, то WAL только передается ОС, но не сбрасывается на диск. Если это значение указано без единиц измерения, оно считается заданным в миллисекундах. Значение по умолчанию — 200 миллисекунд (200ms). Обратите внимание, что во многих системах эффективное разрешение таймера сна составляет 10 миллисекунд; если задать в wal_writer_delay значение, не кратное 10, на практике можно получить такой же результат, что и со следующим за ним значением, кратным 10. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
wal_writer_flush_after (integer)
Определяет, при каком объеме процесс записи WAL будет сбрасывать WAL на диск. Если предыдущий сброс произошел раньше, чем закончился период, указанный в wal_writer_delay, и полученный после этого объем WAL не достиг значения wal_writer_flush_after, то WAL только передается ОС, но не сбрасывается на диск. Если значение wal_writer_flush_after равно 0, то данные WAL всегда сбрасываются на диск немедленно. Если это значение указано без единиц измерения, оно считается заданным в блоках WAL, размер которых равен XLOG_BLCKSZ байт (обычно это 8 КБ). Значение по умолчанию — 1 МБ (1MB). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
wal_after_error_sleep_delay (integer)
Определяет период, на который процесс сброса WAL останавливается после того, как произойдет ошибка записи на диск. Большие значения этого периода (не более одной секунды) позволяют избежать чрезмерного заполнения журнала, но могут приводить к критическим задержкам работы высоконагруженных систем. Возможные значения: от 0 (отсутствие задержек) до 1000000 (1 секунда). Значение по умолчанию — 100 (100 микросекунд). Этот параметр можно задать только в файле qhb.conf или в командной строке сервера. Изменение значения потребует перезапуска сервера.
wal_skip_threshold (integer)
Когда wal_level равен minimal и транзакция фиксируется после создания или перезаписи постоянного отношения, этот параметр определяет, как будут сохраняться новые данные. Если объем данных меньше заданного значения, они записываются в журнал WAL; в противном случае к затронутым файлам применяется fsync. В зависимости от свойств вашего хранилища, увеличение или уменьшение этого значения может быть полезным, если такие фиксации замедляют параллельные транзакции. Если это значение указано без единиц измерения, оно считается заданным в килобайтах. Значение по умолчанию — два мегабайта (2MB).
commit_delay (integer)
Параметр commit_delay добавляет паузу перед началом сброса данных WAL. Это может увеличить быстродействие при групповом фиксировании, позволяя зафиксировать большее число транзакций за один сброс WAL, если загрузка системы достаточно высока и за заданное время успевают подготовиться к фиксированию другие транзакции. Однако это также увеличивает задержку вплоть до commit_delay при каждом сбросе WAL. Поскольку в паузе нет смысла, если никакие другие транзакции не готовы к фиксированию, задержка происходит только в том случае, если на момент запуска сброса WAL активно не менее commit_siblings других транзакций. Кроме того, эти задержки не происходят при выключенном fsync. Если это значение указано без единиц измерения, оно считается заданным в микросекундах. По умолчанию значение commit_delay равно нулю (без задержки). Только суперпользователи могут изменять этот параметр.
Обратите внимание, что заданное время ожидает только первый процесс, готовый сбросить данные WAL на диск, а все последующие процессы ждут только до тех пор, пока тот не завершит операцию сброса.
commit_siblings (integer)
Минимальное число одновременных открытых транзакций, которое требуется для добавления задержки commit_delay. Чем больше это значение, тем выше вероятность того, что как минимум еще одна транзакция окажется готова к фиксированию за время задержки. По умолчанию это пять транзакций.
Контрольные точки
checkpoint_timeout (integer)
Максимальное время между автоматическими контрольными точками WAL. Если это значение указано без единиц измерения, оно считается заданным в секундах. Допустимый диапазон составляет от 30 секунд до одного дня. Значение по умолчанию — пять минут (5min). Увеличение этого параметра может привести к увеличению времени, необходимого для восстановления после сбоя. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
checkpoint_completion_target (floating point)
Задает целевое время завершения процедуры контрольной точки, как долю от общего времени между контрольными точками. Значение по умолчанию — 0.9, что распределяет контрольную точку почти по всему доступному интервалу, обеспечивая довольно стабильную нагрузку ввода/вывода, а также оставляя некоторое время для издержек на завершение процесса контрольной точки. Уменьшать значение этого параметра не рекомендуется, поскольку тогда контрольная точка будет завершаться быстрее. Это приведет к высокой интенсивности ввода/вывода в процессе контрольной точки, за которым последует период низкой интенсивности ввода/вывода между завершением контрольной точки и следующей запланированной контрольной точкой. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
checkpoint_flush_after (integer)
Всякий раз, когда во время выполнения контрольной точки записывается больше заданного объема данных, сервер пытается заставить ОС произвести запись этих данных в нижележащее хранилище. Это ограничивает количество «грязных» данных в страничном кэше ядра, снижая вероятность зависаний при выполнении fsync в конце контрольной точки или когда ОС выполняет обратную запись большими пакетами в фоновом режиме. Зачастую это приводит к значительному снижению задержки транзакций, но также бывают случаи (особенно когда объем рабочей нагрузки больше shared_buffers, но меньше страничного кэша ОС), когда производительность может снизиться. Этот параметр может действовать не на всех платформах. Если это значение указано без единиц измерения, оно считается заданным в блоках, размер которых равен BLCKSZ байт (обычно это 8 КБ). Допустимый диапазон: от 0 (что выключает принудительную обратную запись) до 2 МБ (2MB). Значение по умолчанию равно 256kB в Linux и 0 в других ОС. (Если BLCKSZ отличен от 8 КБ, значение по умолчанию и максимальное значение масштабируются пропорционально ему.) Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
checkpoint_warning (integer)
Записывать сообщение в журнал сервера, если контрольные точки, вызванные заполнением файлов сегментов WAL, выполняются быстрее, чем через заданное время (что говорит о том, что нужно увеличить max_wal_size). Если это значение указано без единиц измерения, оно считается заданным в секундах. Значение по умолчанию — 30 секунд (30s). При нуле это предупреждение выключается. Если checkpoint_timeout меньше, чем checkpoint_warning, предупреждения генерироваться не будут. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
max_wal_size (integer)
Максимальный размер, до которого может вырасти WAL во время автоматических контрольных точек. Это мягкий предел; размер WAL может превышать max_wal_size при особых обстоятельствах, например: при большой нагрузке, сбое в archive_command или большом значении wal_keep_size. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Значение по умолчанию — 1 ГБ. Увеличение этого параметра может привести к увеличению времени, необходимого для восстановления после сбоя. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
min_wal_size (integer)
Пока WAL занимает на диске меньше объема, заданного в этом параметре, старые файлы WAL в контрольных точках всегда перерабатываются для дальнейшего использования, а не удаляются. Это позволяет зарезервировать достаточно пространства для WAL, чтобы справиться с пиками его использования, например, при выполнении больших пакетных заданий. Если это значение указано без единиц измерения, оно считается заданным в мегабайтах. Значение по умолчанию — 80 МБ. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
Архивирование
archive_mode (enum)
Когда параметр archive_mode включен, заполненные сегменты WAL отправляются в архивное хранилище с помощью команды archive_command. Помимо значения off, выключающего архивацию, есть еще два: on (включен) и always (всегда). В нормальных условиях между этими двумя режимами нет никакой разницы, но в режиме always архивирование WAL активно также во время восстановления из архива и при работе с резервным сервером. В режиме always все файлы, восстановленные из архива или переданные с потоковой репликацией, будут заархивированы (снова). Подробную информацию см. в подразделе Непрерывное архивирование на резервном сервере.
Переменные archive_mode и archive_command разделены, чтобы archive_command можно было изменять, не выходя из режима архивирования. Этот параметр можно задать только при запуске сервера. archive_mode нельзя включить, если в параметре wal_level задано значение minimal.
archive_command (string)
Это команда локальной оболочки, выполняемая для архивирования завершенного сегмента файла WAL. Любое вхождение %p в этой строке заменяется путем к файлу, который нужно заархивировать, а любое вхождение %f — только именем этого файла. (Путь задается относительно рабочего каталога сервера, т. е. каталога данных кластера.) Чтобы вставить в команду символ %, его нужно записать как %%. Важно, чтобы команда возвращала нулевой код завершения, только если она завершается успешно. Подробную информацию см. в подразделе Настройка архивирования WAL.
Этот параметр можно задать только в файле qhb.conf или в командной строке
сервера. Он игнорируется, если при запуске сервера не был включен параметр
archive_mode. Если значение archive_command — пустая строка (по
умолчанию), а archive_mode включен, архивирование WAL временно выключается,
но сервер продолжает накапливать файлы сегментов WAL в ожидании, что команда
будет вскоре предоставлена. Если в качестве команды archive_command задать
команду, которая ничего не делает, но возвращает значение true (успешное
завершение), например /bin/true
, архивирование по сути выключается, но при
этом разрывается цепочка файлов WAL, необходимых для восстановления архива,
поэтому такой вариант следует использовать только в исключительных случаях.
archive_timeout (integer)
Команда archive_command вызывается только для завершенных сегментов WAL. Поэтому, если ваш сервер генерирует небольшой трафик WAL (или запись данных чередуется с периодами простоя), от завершения транзакции до ее безопасного сохранения в архивном хранилище может пройти довольно много времени. Для ограничения времени существования неархивированных данных, можно задать значение archive_timeout, чтобы сервер периодически переключался на новый файл сегмента WAL. Когда этот параметр больше нуля, сервер будет переключаться на новый файл сегмента, если с момента последнего переключения на новый файл прошел заданный промежуток времени и наблюдалась какая-то активность базы данных, пусть даже это была одна контрольная точка (контрольные точки пропускаются, если в базе данных отсутствует активность). Обратите внимание, что архивные файлы, которые из-за принудительного переключения закрываются досрочно, все равно будут иметь тот же размер, что и полностью заполненные. Поэтому устанавливать для archive_timeout очень маленькое значение неразумно — это приведет к переполнению архивного хранилища. Обычно имеет смысл задавать значение около минуты. Если вы хотите, чтобы данные копировались с главного сервера быстрее, следует подумать о переходе с архивирования на потоковую репликацию. Если это значение указано без единиц измерения, оно считается заданным в секундах. Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
Восстановление из архива
В этом разделе описываются параметры, которые применяются только в процессе восстановления. Они должны быть сброшены для любой последующей операции восстановления.
Под «восстановлением» понимается как использование сервера в качестве резервного, так и выполнение целевого восстановления данных. Как правило, резервный сервер используется для обеспечения высокой доступности и/или масштабируемости чтения, тогда как целевое восстановление используется в случае потери данных.
Чтобы запустить сервер в режиме резервного, создайте в каталоге данных файл с именем standby.signal. Сервер перейдет к восстановлению, но не остановится по достижении конца заархивированного WAL, а продолжит пытаться осуществить восстановление дальше, подключившись для этого к передающему серверу, используя параметры в primary_conninfo, и/или получив новые сегменты WAL с помощью команды restore_command. Для данного режима представляют интерес параметры, описанные в этом разделе и подразделе Резервные серверы. Параметры, описанные в подразделе Целевая точка восстановления, также будут действовать, но в этом режиме они, как правило, бесполезны.
Чтобы запустить сервер в режиме целевого восстановления, создайте в каталоге данных файл с именем recovery.signal. В случае одновременного создания файлов standby.signal и recovery.signal приоритет имеет режим резервного сервера. Режим целевого восстановления завершается после полного воспроизведения заархивированного WAL или при достижении recovery_target (целевой точки). В этом режиме используются параметры, описанные в этом разделе и подразделе Целевая точка восстановления.
restore_command (string)
Команда локальной оболочки, выполняемая для извлечения заархивированного сегмента набора файлов WAL. Этот параметр необходим для восстановления из архива, но необязателен для потоковой репликации. Любое вхождение %f в этой строке заменяется именем файла, извлекаемого из архива, а любое вхождение %p — путем назначения на сервере. (Путь указывается относительно текущего рабочего каталога, т. е. каталога данных кластера.) Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска. Это самый ранний файл, который необходимо хранить, чтобы обеспечить возможность запуска восстановления, поэтому эту информацию можно использовать для усечения архива до минимального размера, необходимого для поддержки перезапуска. %r обычно используется только в конфигурациях с теплым резервированием (см. раздел Доставка журналов на резервные серверы). Чтобы вставить в команду символ %, его нужно записать как %%.
Важно, чтобы команда возвращала нулевой код завершения, только если она завершается успешно. У команды будут запрошены имена файлов, которых нет в архиве; в этом случае она должна возвращать ненулевой статус. Пример:
restore_command = 'cp /mnt/server/archivedir/%f "%p"'
Если команда была прервана сигналом (отличным от SIGTERM, который используется как часть отключения сервера баз данных) или ошибкой со стороны оболочки (например, если команда не найдена), то процесс восстановления будет остановлен и сервер не запустится.
Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
archive_cleanup_command (string)
Этот необязательный параметр задает команду оболочки, которая будет выполняться при каждой точке перезапуска. Назначение параметра archive_cleanup_command — предоставить механизм для очистки от старых архивных файлов WAL, которые больше не нужны резервному серверу. Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска. Это самый ранний файл, который необходимо хранить, чтобы обеспечить возможность запуска восстановления, поэтому все более старые файлы можно безопасно удалить. Эту информацию можно использовать для усечения архива до минимального размера, необходимого для поддержки перезапуска. Модуль qhb_archivecleanup часто используется в качестве archive_cleanup_command в конфигурациях с одним резервным сервером, например:
archive_cleanup_command = 'qhb-archivecleanup /mnt/server/archivedir %r'
Однако обратите внимание, что если несколько резервных серверов восстанавливаются из одного и того же архивного каталога, следует проследить за тем, чтобы файлы WAL удалялись только после того, как ими воспользуются все серверы. archive_cleanup_command часто используется в конфигурациях с теплым резервом (см. раздел Доставка журналов на резервные серверы). Чтобы вставить в команду символ %, его нужно записать как %%.
Если команда возвращает ненулевой код завершения, в журнал будет записано сообщение с предупреждением. Если же команда была прервана сигналом или ошибкой со стороны оболочки (например, если команда не найдена), возникнет фатальная ошибка.
Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
recovery_end_command (string)
Этот параметр задает команду оболочки, которая будет выполнена только один раз в конце процесса восстановления. Этот параметр не является обязательным. Назначение параметра recovery_end_command — предоставить механизм очистки после репликации или восстановления. Любое вхождение %r заменяется именем файла, содержащего последнюю действительную точку перезапуска, аналогично параметру archive_cleanup_command.
Если команда возвращает ненулевой код завершения, в журнал будет записано сообщение с предупреждением и запуск базы данных все равно продолжится. Если же команда была прервана сигналом или ошибкой со стороны оболочки (например, если команда не найдена), запуск базы данных будет прерван.
Этот параметр можно задать только в файле qhb.conf или в командной строке сервера.
Целевая точка восстановления
По умолчанию восстановление производится вплоть до конца журнала WAL. Чтобы остановить процесс восстановления в более ранней точке, можно использовать один из следующих параметров: recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time или recovery_target_xid. Если в файле конфигурации указано более одного из них, возникнет ошибка. Эти параметры можно задать только при запуске сервера.
recovery_target = 'immediate'
Этот параметр указывает, что восстановление должно завершиться по достижении согласованного состояния, т. е. как можно раньше. При восстановлении из оперативной резервной копии это будет точкой, в которой завершился процесс резервного копирования.
Технически это строковый параметр, но в данный момент допустимым является только значение 'immediate'.
recovery_target_name (string)
Этот параметр задает именованную точку восстановления (созданную с помощью pg_create_restore_point()), до которой будет производиться восстановление.
recovery_target_time (timestamp)
Этот параметр задает метку времени, до которой будет производиться восстановление. Точная точка остановки также зависит от значения параметра recovery_target_inclusive.
Значение этого параметра задается в том же формате, который принимается типом данных timestamp with time zone, за исключением того, что в нем нельзя использовать аббревиатуру часового пояса (если только переменная timezone_abbreviations не была установлена в файле конфигурации выше). Поэтому рекомендуется задавать числовое смещение от UTC или записывать название часового пояса полностью, например Europe/Helsinki (но не EEST).
recovery_target_xid (string)
Этот параметр задает идентификатор транзакции, до которого будет производиться восстановление. Имейте в виду, что значения идентификаторов отражают последовательность именно старта транзакций, а выполняться они могут и в другом порядке. Будут восстановлены все транзакции, совершенные до указанной (и, возможно, включая ее). Точная точка остановки также зависит от значения параметра recovery_target_inclusive.
recovery_target_lsn (pg_lsn)
Этот параметр задает номер LSN позиции в журнале упреждающей записи, до которого будет производиться восстановление. Точная точка остановки также зависит от значения параметра recovery_target_inclusive. Этот параметр принимает значение системного типа данных pg_lsn.
Следующие параметры уточняют целевую точку восстановления и определяют, что будет происходить при ее достижении:
recovery_target_inclusive (boolean)
Указывает, следует ли останавливаться сразу после заданной целевой точки восстановления (on) или непосредственно перед ней (off). Применяется, когда задан параметр recovery_target_lsn, recovery_target_time или recovery_target_xid. Этот параметр определяет, будут ли восстановлены транзакции, у которых позиция в WAL (LSN), время фиксации или идентификатор в точности совпадают с соответствующим заданным значением. Значение по умолчанию — on (включен).
recovery_target_timeline (string)
Указывает точную временную шкалу для восстановления. Значение этого параметра может задаваться числовым идентификатором временной шкалы или специальным значением. При значении current восстанавливается та временная шкала, которая действовала при создании базовой резервной копии. При значении latest восстанавливается последняя временная шкала, найденная в архиве, что полезно для резервного сервера. Значение по умолчанию — latest.
Обычно этот параметр требуется задавать только в сложных ситуациях повторного восстановления, когда необходимо вернуться к состоянию, которое само было достигнуто после восстановления на момент времени. Это рассматривается в подразделе Временная шкала.
recovery_target_action (enum)
Указывает, какое действие должен предпринять сервер после достижения целевой точки восстановления. Вариант по умолчанию — pause, означающий, что восстановление будет приостановлено. Вариант promote означает, что процесс восстановления завершится и сервер начнет принимать подключения. Наконец, при варианте shutdown сервер остановится по достижении целевой точки восстановления.
Предполагается, что вариант pause позволит выполнить запросы к базе данных и проверить, является ли эта целевая точка восстановления наиболее желаемой. Для снятия с паузы можно воспользоваться функцией pg_wal_replay_resume() (см. таблицу Функции управления восстановлением), которая приведет к завершению восстановления. Если эта целевая точка не является желаемой, нужно выключить сервер, установить параметры на более позднюю цель и перезапустить сервер для продолжения восстановления.
Вариант shutdown полезен для получения готового экземпляра сервера в желаемой точке воспроизведения. Данный экземпляр по-прежнему сможет воспроизводить дополнительные записи WAL (и на самом деле при следующем запуске должен будет воспроизводить записи WAL с момента последней контрольной точки).
Обратите внимание, что поскольку recovery.signal не удаляется, если в recovery_target_action задано значение shutdown, последующий запуск закончится немедленным завершением работы, если только не изменить конфигурацию или не удалить файл recovery.signal вручную.
Этот параметр не действует, если целевая точка восстановления не установлена. Если не включен режим hot_standby, вариант pause будет действовать так же, как shutdown. Если целевая точка восстановления достигается в процессе повышения, pause будет действовать так же, как promote.
В любом случае, если целевая точка восстановления задана, но восстановление архива заканчивается до ее достижения, сервер завершит работу с критической ошибкой.