49.8. Поддержка синхронной репликации для логического декодирования #
49.8.1. Обзор #
Логическое декодирование может использоваться для реализации синхронной репликации с тем же внешним интерфейсом, что и синхронная репликация поверх потоковой репликации. Для этого потоковая передача данных должна происходить через интерфейс потоковой репликации (см. Раздел 49.3). Клиенты такой репликации должны посылать сообщения Обновление состояния резервного сервера (F)
(см. Раздел 55.4), как и клиенты потоковой репликации.
Примечание
Синхронная реплика, получающая изменения через логическое декодирование, будет работать в рамках одной базы данных. Так как synchronous_standby_names
в настоящее время, напротив, устанавливается на уровне сервера, это означает, что этот подход не будет работать корректно при использовании нескольких баз данных.
49.8.2. Ограничения #
В схеме с логической репликацией возможна взаимоблокировка, если транзакция в исключительном режиме заблокирует таблицы каталога (в том числе пользовательские). Пользовательские таблицы каталога описаны в Подразделе 49.6.2. Это происходит, потому что в процессе логического декодирования транзакций при обращении к таблицам каталога они блокируются. Во избежание этого пользователи должны воздерживаться от исключительной блокировки таблиц каталога (в том числе пользовательских). Вызвать такую блокировку могут следующие обстоятельства:
Установление явной блокировки (командой
LOCK
) для каталогаpg_class
в транзакции.Выполнение
CLUSTER
для каталогаpg_class
в транзакции.Выполнение
PREPARE TRANSACTION
после командыLOCK
, блокирующейpg_class
, при работающем логическом декодировании двухфазных транзакций.Выполнение
PREPARE TRANSACTION
после командыCLUSTER
дляpg_trigger
при работающем логическом декодировании двухфазных транзакций. Это приведёт к взаимоблокировке только в том случае, если у публикуемой таблицы есть триггер.Выполнение
TRUNCATE
для таблицы каталога (в том числе пользовательской) в транзакции.
Заметьте, что эти команды способны вызвать взаимоблокировку не только для указанных выше таблиц системного каталога, но и для любых других таблиц каталога.