25.4. Горячая резервная копия#
25.4. Горячая резервная копия #
Горячий резервный режим - это термин, используемый для описания возможности подключения к серверу и выполнения запросов только на чтение во время восстановления из архива или в режиме резервного режима. Это полезно как для целей репликации, так и для точного восстановления резервной копии до желаемого состояния. Термин "горячий резервный режим" также относится к возможности сервера переходить от восстановления к нормальной работе, пока пользователи продолжают выполнять запросы и/или поддерживают свои соединения открытыми.
Запуск запросов в режиме горячего резервирования аналогичен обычной операции запроса, хотя есть несколько различий в использовании и административных аспектах, которые объясняются ниже.
25.4.1. Обзор пользователя #
Когда параметр hot_standby установлен в значение true на резервном сервере, он начнет принимать подключения после того, как процесс восстановления приведет систему в состояние согласованности. Все такие подключения строго только для чтения; даже временные таблицы не могут быть записаны.
Данные на резервном сервере занимают некоторое время, чтобы прийти с основного сервера, поэтому между основным и резервным сервером будет заметная задержка. При одновременном выполнении одного и того же запроса на основном и резервном серверах могут быть различные результаты. Мы говорим, что данные на резервном сервере являются постепенно согласованными с основным. Как только запись о метке транзакции воспроизводится на резервном сервере, изменения, внесенные этой транзакцией, становятся видимыми для любых новых снимков, сделанных на резервном сервере. Снимки могут быть сделаны в начале каждого запроса или в начале каждой транзакции, в зависимости от текущего уровня изоляции транзакции. Дополнительные сведения см. в разделе Раздел 13.2.
Транзакции, запущенные во время горячего резервирования, могут выполнять следующие команды:
Запрос доступа:
SELECT
,COPY TO
Команды курсора:
DECLARE
,FETCH
,CLOSE
Настройки:
SHOW
,SET
,RESET
Команды управления транзакциями:
BEGIN
,END
,ABORT
,START TRANSACTION
SAVEPOINT
,RELEASE
,ROLLBACK TO SAVEPOINT
EXCEPTION
блоки и другие внутренние подтранзакции
LOCK TABLE
, только когда явно в одном из этих режимов:ACCESS SHARE
,ROW SHARE
илиROW EXCLUSIVE
.Планы и ресурсы:
PREPARE
,EXECUTE
,DEALLOCATE
,DISCARD
Плагины и расширения:
LOAD
UNLISTEN
Транзакции, запущенные во время горячего резервного копирования, никогда не будут назначены идентификатор транзакции и не смогут записывать в журнал системы предварительной записи. Поэтому следующие действия вызовут сообщения об ошибке:
Язык манипулирования данными (DML):
INSERT
,UPDATE
,DELETE
,MERGE
,COPY FROM
,TRUNCATE
. Обратите внимание, что нет разрешенных действий, которые приводят к выполнению триггера во время восстановления. Это ограничение действует даже для временных таблиц, потому что строки таблицы не могут быть прочитаны или записаны без присвоения идентификатора транзакции, что в настоящее время невозможно в среде горячего резервного копирования.Язык определения данных (DDL):
CREATE
,DROP
,ALTER
,COMMENT
. Это ограничение распространяется даже на временные таблицы, потому что выполнение этих операций потребовало бы обновления таблиц системного каталога.SELECT ... FOR SHARE | UPDATE
, потому что блокировки строк не могут быть взяты без обновления базовых файлов данных.Правила для операторов
SELECT
, которые генерируют команды DML.LOCK
, которая явно запрашивает режим выше, чемROW EXCLUSIVE MODE
.LOCK
в краткой форме по умолчанию, так как он запрашиваетACCESS EXCLUSIVE MODE
.Команды управления транзакциями, которые явно устанавливают нережимное состояние:
BEGIN READ WRITE
,START TRANSACTION READ WRITE
SET TRANSACTION READ WRITE
,SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
SET transaction_read_only = отключено
Все команды двухфазного коммита:
PREPARE TRANSACTION
,COMMIT PREPARED
,ROLLBACK PREPARED
, потому что даже только для чтения транзакции должны записывать WAL в фазе подготовки (первой фазе двухфазного коммита).Обновления последовательности:
nextval()
,setval()
LISTEN
,NOTIFY
В нормальной работе “только для чтения” транзакции могут использовать LISTEN
и NOTIFY
, поэтому сессии горячего резервирования работают с немного более строгими ограничениями, чем обычные сессии только для чтения. Возможно, в будущих версиях некоторые из этих ограничений будут смягчены.
Во время горячего резервирования параметр transaction_read_only
всегда имеет значение true и не может быть изменен. Однако, если не предпринимается попытка изменить базу данных, соединения во время горячего резервирования будут вести себя так же, как любое другое соединение с базой данных. Если происходит сбой или переключение, база данных перейдет в нормальный режим обработки. сессии останутся подключенными во время изменения режима сервера. После завершения горячего резервирования будет возможно начать чтение-запись транзакций (даже из сессии, начатого во время горячего резервирования).
Пользователи могут определить, активен ли в данный момент режим горячего резервирования для их сессии, выполнив команду SHOW in_hot_standby
.
(В версиях сервера до 14 параметр in_hot_standby
не существовал; рабочий альтернативный метод для более старых серверов - использование команды SHOW transaction_read_only
). Кроме того, набор функций (Таблица 9.92) позволяют пользователям получить доступ к информации о резервном сервере. Они позволяют вам писать программы, которые осведомлены о текущем состоянии базы данных. Они могут использоваться для отслеживания прогресса восстановления или для написания сложных программ, которые восстанавливают базу данных в определенные состояния.
25.4.2. Обработка конфликтов запросов #
Основной и резервный серверы во многих отношениях слабо связаны. Действия на основном сервере будут влиять на резервный. В результате возможны негативные взаимодействия или конфликты между ними. Самый простой конфликт, который можно понять, - это производительность: если на основном сервере происходит огромная загрузка данных, то это приведет к генерации аналогичного потока записей WAL на резервном сервере, поэтому запросы на резервном сервере могут конкурировать за системные ресурсы, такие как ввод-вывод.
Также могут возникать дополнительные типы конфликтов при горячем резервировании. Эти конфликты являются жесткими конфликтами в том смысле, что запросы могут потребовать отмены и, в некоторых случаях, отключения сессий для их разрешения. Пользователю предоставляются несколько способов обработки этих конфликтов. Конфликтные случаи включают:
Все блокировки Access Exclusive, включая явные команды
LOCK
и различные действия DDL на основном сервере, конфликтуют с доступом к таблицам в запросах на резервном сервере.Удаление табличного пространства на основном сервере конфликтует с запросами резервного сервера, которые используют это табличное пространство для временных рабочих файлов.
Удаление базы данных на основном сервере конфликтует с сессиями, подключенными к этой базе данных на резервном сервере.
Применение записи очистки операции vacuum из WAL конфликтует с транзакциями резервной копии, чьи снимки все еще могут "видеть" любую из удаляемых строк.
Применение записи очистки операцией vacuum из WAL конфликтует с запросами, обращающимися к целевой странице на резервной копии, независимо от того, видимы ли данные, которые должны быть удалены.
На основном сервере эти случаи просто приводят к ожиданию, и пользователь может выбрать отмену любого из конфликтующих действий. Однако на резервном сервере нет выбора: действие, записанное в WAL, уже произошло на основном сервере, поэтому резервный сервер не должен пропустить его применение. Кроме того, допускать бесконечное ожидание применения WAL может быть нежелательно, потому что состояние резервного сервера будет все больше отставать от состояния основного сервера. Поэтому предусмотрен механизм принудительной отмены запросов резервного сервера, конфликтующих с записями WAL, которые должны быть применены.
Пример ситуации проблемы заключается в том, что администратор на основном сервере выполняет команду DROP TABLE
на таблице, которая в данный момент запрашивается на резервном сервере. Очевидно, что запрос на резервном сервере не может продолжаться, если DROP TABLE
применяется на резервном сервере. Если бы такая ситуация произошла на основном сервере, команда DROP TABLE
ожидала бы, пока другой запрос не завершится. Но когда команда DROP TABLE
выполняется на основном сервере, основной сервер не имеет информации о том, какие запросы выполняются на резервном сервере, поэтому он не будет ожидать такие запросы на резервном сервере. Записи изменений WAL поступают на резервный сервер, пока запрос на резервном сервере все еще выполняется, что вызывает конфликт. Резервный сервер должен либо отложить применение записей WAL (и всего, что идет после них), либо отменить конфликтующий запрос, чтобы команда DROP TABLE
могла быть применена.
Когда конфликтующий запрос короткий, обычно желательно позволить ему завершиться, откладывая применение WAL на некоторое время; но длительная задержка в применении WAL обычно не желательна. Поэтому механизм отмены имеет параметры max_standby_archive_delay и max_standby_streaming_delay, которые определяют максимально допустимую задержку в применении WAL. Конфликтующие запросы будут отменены, если прошло больше времени, чем установленная задержка, для применения новых полученных данных WAL. Существуют два параметра, чтобы можно было указать разные значения задержки для случая чтения данных WAL из архива (т.е. начального восстановления из базовой резервной копии или “догоняющего” резервного сервера, который значительно отстал) по сравнению с чтением данных WAL через потоковую репликацию.
В резервном сервере, который существует преимущественно для обеспечения высокой доступности, лучше установить относительно короткие значения параметров задержки, чтобы сервер не отставал от первичного сервера из-за задержек, вызванных запросами на резервном сервере. Однако, если резервный сервер предназначен для выполнения длительных запросов, то предпочтительным может быть высокое или даже бесконечное значение задержки. Однако следует помнить, что длительный запрос может привести к тому, что другие сессии на резервном сервере не увидят недавних изменений на первичном сервере, если задерживается применение записей WAL.
После превышения времени задержки, указанного в параметрах max_standby_archive_delay
или max_standby_streaming_delay
, конфликтующие запросы будут отменены. Обычно это приводит только к ошибке отмены, хотя в случае воспроизведения команды DROP DATABASE
вся конфликтующая сессия будет завершена. Кроме того, если конфликт возникает из-за блокировки, удерживаемой простаивающей транзакцией, конфликтующая сессия будет завершена (это поведение может измениться в будущем).
Отмененные запросы могут быть повторены немедленно (после начала новой транзакции, конечно). Поскольку отмена запроса зависит от характера воспроизводимых записей WAL, запрос, который был отменен, может успешно выполниться, если он будет выполнен снова.
Имейте в виду, что параметры задержки сравниваются с прошедшим временем с момента получения данных WAL сервером-резервом. Таким образом, период ожидания, предоставляемый для любого запроса на сервере-резерве, никогда не превышает параметр задержки и может быть значительно меньше, если сервер-резерв уже отстает из-за ожидания завершения предыдущих запросов или из-за невозможности справиться с большой нагрузкой обновления.
Самая распространенная причина конфликта между запросами на резервном сервере и воспроизведением WAL-журнала - это “ранняя очистка”. Обычно Tantor SE-1Cпозволяет очищать старые версии строк, когда нет транзакций, которым нужно их видеть, чтобы обеспечить правильную видимость данных в соответствии с правилами MVCC. Однако это правило может быть применено только для транзакций, выполняющихся на основном сервере. Поэтому возможно, что очистка на основном сервере удалит версии строк, которые все еще видны для транзакции на резервном сервере.
Очистка версий строк — не единственная потенциальная причина конфликтов с
запросами на резервных серверах. Все индексные сканирования (включая те, которые выполняются на
резервных серверах) должны использовать снимок MVCC, который
“согласуется” с картой видимости. Поэтому конфликты необходимы всякий раз, когда VACUUM
устанавливает страницу как полностью видимую в
карте видимости, содержащей одну или несколько строк,
не видимых для всех запросов на резервных серверах. Таким образом, даже выполнение
VACUUM
для таблицы без обновленных или удаленных строк,
требующих очистки, может привести к конфликтам.
Важно, чтобы пользователи понимали, что таблицы, которые регулярно и часто обновляются на основном сервере, быстро приведут к отмене более длительных запросов на резервном сервере. В таких случаях установка конечного значения для max_standby_archive_delay
или max_standby_streaming_delay
может рассматриваться как установка statement_timeout
.
Существуют возможности для устранения проблем, связанных с отменой запросов на резервном сервере. Первый вариант - установить параметр hot_standby_feedback
, который предотвращает удаление недавно удаленных строк VACUUM
и, таким образом, предотвращает конфликты при очистке. Если вы сделаете это, обратите внимание, что это задержит очистку мертвых строк на основном сервере, что может привести к нежелательному раздутию таблицы. Однако, ситуация с очисткой не будет хуже, чем если бы запросы на резервном сервере выполнялись непосредственно на основном сервере, и вы все равно получаете преимущества выполнения на резервном сервере.
Если резервные серверы подключаются и отключаются часто, вам может потребоваться внести изменения, чтобы обрабатывать периоды, когда обратная связь hot_standby_feedback
не предоставляется. Например, рассмотрите возможность раздутия параметра max_standby_archive_delay
, чтобы запросы не были быстро отменены из-за конфликтов в архивных файлах WAL во время отключенных периодов. Также рассмотрите возможность раздутия параметра max_standby_streaming_delay
, чтобы избежать быстрой отмены ново прибывших записей WAL после повторного подключения.
Количество отмененных запросов и причина их отмены можно просмотреть с помощью системного представления pg_stat_database_conflicts
на резервном сервере. Системное представление pg_stat_database
также содержит сводную информацию.
Пользователи могут контролировать, будет ли создано сообщение в журнале, когда восстановление WAL ожидает дольше, чем deadlock_timeout
для разрешения конфликтов. Это контролируется параметром log_recovery_conflict_waits.
25.4.3. Обзор администратора #
Если hot_standby
установлено в on
в файле postgresql.conf
(значение по умолчанию) и есть
standby.signal
если файл присутствует, сервер будет работать в режиме горячего резервирования.
Однако, может потребоваться некоторое время, чтобы разрешить подключения к горячему резерву,
поскольку сервер не будет принимать подключения, пока не завершит
достаточное восстановление, чтобы обеспечить согласованное состояние, относительно которого можно выполнять запросы.
В течение этого периода,
клиенты, пытающиеся подключиться, будут отклонены с сообщением об ошибке.
Чтобы подтвердить запуск сервера, либо выполните цикл попыток подключения из приложения, либо ищите эти сообщения в журналах сервера:
LOG: entering standby mode ... then some time later ... LOG: consistent recovery state reached LOG: database system is ready to accept read-only connections
Информация о согласованности записывается один раз на каждую контрольную точку на основном сервере.
Невозможно включить горячее резервное копирование при чтении WAL-журнала,
записанного в период, когда wal_level
не был установлен в
replica
или logical
на основном сервере. Достижение
согласованного состояния также может быть задержано при наличии обоих этих
условий:
Транзакция записи имеет более 64 подтранзакций
Очень долгоживущие транзакции записи
Если вы используете логическую репликацию на основе файлов ("теплый резерв"), вам может потребоваться подождать, пока прибудет следующий файл журнала предзаписи, что может занять столько времени, сколько указано в параметре archive_timeout
на основном сервере.
Настройки некоторых параметров определяют размер общей памяти для отслеживания идентификаторов транзакций, блокировок и подготовленных транзакций. Эти структуры общей памяти на резервном сервере должны быть не меньше, чем на основном сервере, чтобы гарантировать, что резервный сервер не исчерпает общую память во время восстановления. Например, если на основном сервере использовалась подготовленная транзакция, но на резервном сервере не было выделено общей памяти для отслеживания подготовленных транзакций, то восстановление не сможет продолжиться, пока не будет изменена конфигурация резервного сервера. Затронуты следующие параметры:
max_connections
max_prepared_transactions
max_locks_per_transaction
max_wal_senders
max_worker_processes
Самый простой способ гарантировать, что это не станет проблемой, - установить эти параметры на резервных серверах в значениях, равных или больших, чем на основном сервере. Поэтому, если нужно увеличить эти значения, вы должны сделать это сначала на всех резервных серверах, прежде чем применять изменения на основном сервере. Напротив, если нужно уменьшить эти значения, вы должны сделать это сначала на основном сервере, прежде чем применять изменения на всех резервных серверах. Имейте в виду, что при повышении резервного сервера до основного, он становится новым эталоном для требуемых параметров на резервных серверах, следующих за ним. Поэтому, чтобы избежать проблем при переключении или отказе, рекомендуется сохранять одинаковые настройки на всех резервных серверах.
WAL отслеживает изменения этих параметров на основном сервере. Если горячий резервный сервер обрабатывает WAL, который указывает, что текущее значение на основном сервере выше, чем его собственное значение, он зарегистрирует предупреждение и приостановит восстановление, например:
WARNING: hot standby is not possible because of insufficient parameter settings DETAIL: max_connections = 80 is a lower setting than on the primary server, where its value was 100. LOG: recovery has paused DETAIL: If recovery is unpaused, the server will shut down. HINT: You can then restart the server after making the necessary configuration changes.
На этом этапе необходимо обновить настройки на резервной копии и перезапустить экземпляр, прежде чем восстановление может продолжиться. Если резервная копия не является горячей, то при обнаружении несовместимого изменения параметра она немедленно завершит работу без паузы, так как в этом случае нет смысла ее поддерживать.
Важно, чтобы администратор выбрал соответствующие настройки для max_standby_archive_delay и max_standby_streaming_delay. Лучший выбор зависит от бизнес-приоритетов. Например, если сервер в основном используется в качестве сервера высокой доступности, то вам понадобятся настройки с низкой задержкой, возможно, даже нулевой, хотя это очень агрессивная настройка. Если резервный сервер используется в качестве дополнительного сервера для запросов поддержки принятия решений, то можно установить максимальные значения задержки на несколько часов или даже -1, что означает бесконечное ожидание завершения запросов.
Статус транзакции "hint bits", записанный на основном сервере, не записывается в WAL, поэтому данные на резервном сервере, скорее всего, снова перезапишут подсказки на резервном сервере. Таким образом, резервный сервер все равно будет выполнять записи на диск, даже если все пользователи только для чтения; сами значения данных не изменяются. Пользователи все равно будут записывать большие временные файлы сортировки и пересоздавать файлы информации о кеше отношений, поэтому ни одна часть базы данных на самом деле не является полностью только для чтения в режиме горячего резервного копирования. Обратите также внимание, что записи в удаленные базы данных с использованием модуля dblink и другие операции вне базы данных с использованием PL-функций все равно будут возможны, даже если транзакция является локально только для чтения.
Следующие типы команд администрирования не принимаются в режиме восстановления:
Язык определения данных (DDL): например,
CREATE INDEX
Привилегии и владение:
GRANT
,REVOKE
,REASSIGN
Команды обслуживания:
ANALYZE
,VACUUM
,CLUSTER
,REINDEX
Снова обратите внимание, что некоторые из этих команд фактически разрешены во время транзакций в режиме "только для чтения" на основном сервере.
В результате нельзя создавать дополнительные индексы, которые существуют только на резервном сервере, а также статистику, которая существует только на резервном сервере. Если требуется выполнить эти команды администрирования, они должны быть выполнены на основном сервере, и со временем эти изменения будут распространяться на резервный сервер.
pg_cancel_backend()
и pg_terminate_backend()
будут работать с пользовательскими процессами бэкендаи,
но не с процессом запуска, который выполняет
восстановление. pg_stat_activity
не показывает
восстанавливающиеся транзакции как активные. В результате,
pg_prepared_xacts
всегда пуст во время
восстановления. Если нужно разрешить неопределенные подготовленные транзакции, просмотрите
pg_prepared_xacts
на основном сервере и выполните команды для
разрешения транзакций там или разрешите их после окончания восстановления.
pg_locks
покажет блокировки, удерживаемые процессами бэкендаи, как обычно. pg_locks
также показывает виртуальную транзакцию, управляемую процессом запуска, которая владеет всеми AccessExclusiveLocks
, удерживаемыми транзакциями, воспроизводимыми восстановлением. Обратите внимание, что процесс запуска не получает блокировки для внесения изменений в базу данных, и поэтому блокировки, отличные от AccessExclusiveLocks
, не отображаются в pg_locks
для процесса запуска; они просто предполагаются существующими.
Плагин Nagios check_pgsql будет работать, потому что он проверяет наличие простой информации. Скрипт мониторинга check_postgres также будет работать, хотя некоторые отчетные значения могут давать разные или запутанные результаты. Например, время последней операции очистки не будет поддерживаться, так как на резервном сервере не выполняется очистка. Операции очистки, выполняемые на основном сервере, все равно отправляют свои изменения на резервный сервер.
WAL-команды управления файлами не будут работать во время восстановления,
например, pg_backup_start
, pg_switch_wal
и т. д.
Динамически загружаемые модули работают, включая pg_stat_statements
.
Рекомендательные блокировки работают нормально в режиме восстановления, включая обнаружение взаимоблокировок. Обратите внимание, что рекомендательные блокировки никогда не записываются в WAL, поэтому невозможно, чтобы рекомендательная блокировка на основном или резервном сервере конфликтовала с воспроизведением WAL. Также невозможно получить рекомендательную блокировку на основном сервере и инициировать аналогичную рекомендательную блокировку на резервном сервере. Рекомендательные блокировки относятся только к серверу, на котором они были получены.
Системы репликации на основе триггеров, такие как Slony, Londiste и Bucardo, не будут работать на резервном сервере вообще, хотя они будут работать на основном сервере, пока изменения не будут отправлены на резервные серверы для применения. Воспроизведение WAL не основано на триггерах, поэтому вы не можете передавать данные с резервного сервера на любую систему, которая требует дополнительной записи в базу данных или полагается на использование триггеров.
В новых OID не может быть назначено, хотя некоторые генераторы UUID могут продолжать работать, пока они не полагаются на запись нового статуса в базу данных.
В настоящее время создание временных таблиц не разрешено во время только для чтения транзакций, поэтому в некоторых случаях существующие скрипты не будут выполняться правильно. Это ограничение может быть смягчено в последующих версиях. Это одновременно проблема соответствия стандарту SQL и техническая проблема.
DROP TABLESPACE
может выполниться только в том случае, если табличнoe пространствo пусто. Некоторые резервные пользователи могут активно использовать табличнoe пространствo через свой параметр temp_tablespaces
. Если в табличном пространстве есть временные файлы, все активные запросы отменяются, чтобы убедиться, что временные файлы удалены, и табличнoe пространствo может быть удалено, а воспроизведение WAL может продолжаться.
Совершение команды DROP DATABASE
или ALTER DATABASE ... SET
TABLESPACE
на основном сервере
приведет к созданию записи WAL, которая приведет к принудительному отключению всех пользователей, подключенных к этой
базе данных на резервном сервере. Это действие происходит
немедленно, независимо от значения
max_standby_streaming_delay
. Обратите внимание, что
команда ALTER DATABASE ... RENAME
не отключает пользователей, что
в большинстве случаев остается незамеченным, хотя в некоторых случаях может вызвать
путаницу в программе, если она зависит от имени базы данных.
В обычном (не восстановительном) режиме, если вы выполняете команду DROP USER
или DROP ROLE
для роли с возможностью входа, пока этот пользователь все еще подключен, то ничего не происходит с подключенным пользователем - он остается подключенным. Однако пользователь не может повторно подключиться. Это поведение также применяется в режиме восстановления, поэтому команда DROP USER
на основном сервере не отключает этого пользователя на резервном сервере.
Система накопительной статистики активна во время восстановления. Все сканирования, чтения, блоки, использование индексов и т. д. будут нормально записываться на резервной копии. Однако, воспроизведение WAL не будет увеличивать счетчики отношений и баз данных. То есть, воспроизведение не будет увеличивать столбцы pg_stat_all_tables (например, n_tup_ins), также чтения или записи, выполненные процессом запуска, не будут отслеживаться в представлениях pg_statio, и столбцы связанные с pg_stat_database не будут увеличиваться.
Автоочистка не активен во время восстановления. Он будет запущен нормально в конце восстановления.
Процессы checkpointer и background writer активны во время восстановления. Процесс checkpointer выполняет restartpoint (аналогично точкам контроля на основном сервере), а процесс background writer выполняет обычные операции по очистке блоков. Это может включать обновление информации о подсказке, хранящейся на резервном сервере.
Команда CHECKPOINT
принимается во время восстановления, хотя выполняется restartpoint, а не новая контрольная точка.
25.4.4. Справочник параметров горячего резервирования #
Различные параметры были упомянуты выше в Раздел 25.4.2 и Раздел 25.4.3.
На первичном сервере можно использовать параметр wal_level. max_standby_archive_delay и max_standby_streaming_delay не имеют эффекта, если установлены на первичном сервере.
На резервном сервере можно использовать параметры hot_standby, max_standby_archive_delay и max_standby_streaming_delay.
25.4.5. Ограничения в использовании #
Есть несколько ограничений горячего резервирования. Эти ограничения могут и, вероятно, будут исправлены в будущих версиях:
Полное знание выполнения транзакций требуется перед созданием снимков. Транзакции, которые используют большое количество подтранзакций (в настоящее время более 64), будут задерживать начало только для чтения соединений до завершения самой длительной записи транзакции. Если возникнет такая ситуация, в журнал сервера будут отправлены пояснительные сообщения.
Все допустимые точки начала для запросов на резервном сервере генерируются на каждой контрольной точке на основном сервере. Если резервный сервер выключен во время выключения основного сервера, возможно, не удастся снова войти в режим горячего резервного сервера, пока основной сервер не будет запущен, чтобы он сгенерировал дополнительные точки начала в журналах WAL. Эта ситуация не является проблемой в наиболее распространенных ситуациях, когда она может возникнуть. Обычно, если основной сервер выключен и больше недоступен, это, вероятно, связано с серьезной ошибкой, которая требует преобразования резервного сервера для работы в качестве нового основного сервера в любом случае. И в ситуациях, когда основной сервер намеренно выключается, координация для обеспечения плавного перехода резервного сервера в режим нового основного сервера также является стандартной процедурой.
По окончании восстановления,
AccessExclusiveLocks
, удерживаемые подготовленными транзакциями, потребуют в два раза больше записей в таблице блокировок, чем обычно. Если вы планируете запускать большое количество одновременных подготовленных транзакций, которые обычно используютAccessExclusiveLocks
, или планируете иметь одну большую транзакцию, которая использует многоAccessExclusiveLocks
, рекомендуется выбрать большее значение параметраmax_locks_per_transaction
, возможно, в два раза больше значения параметра на основном сервере. Вы не должны обращать на это внимание, если ваше значение параметраmax_prepared_transactions
равно 0.Уровень изоляции транзакций Serializable пока не доступен в режиме горячего резервирования. (См. Раздел 13.2.3 и Раздел 13.4.1 для получения подробной информации). Попытка установить транзакцию на уровень изоляции Serializable в режиме горячего резервирования вызовет ошибку.