20
Конфликты: решения
Решение 0: избегать конфликтов
не выполнять команды, вызывающие блокировки
отменить усечение файла в конце очистки: параметр хранения
vacuum_truncate = off
Решение 1: откладывать применение конфликтующих
записей
max_standby_streaming_delay
max_standby_archive_delay
кроме взаимоблокировок, DROP TABLESPACE, DROP DATABASE
Один из путей борьбы с конфликтами — избегать действий на мастере,
приводящих к исключительным блокировкам. Например, можно не
выполнять команды DROP TABLE, TRUNCATE, LOCK, DROP INDEX,
DROP TRIGGER и т. п. или выполнять их в то время, когда на реплике
заведомо нет выполняющихся запросов.
Некоторых неявных блокировок можно избежать, отключая
соответствующую функциональность на мастере. Например, если
в результате очистки освободились страницы в конце файла, при
уменьшении его размера устанавливается исключительная блокировка
таблицы. Но можно отменить усечение файла, задав параметр
хранения таблицы vacuum_truncate = off. Однако отменять или надолго
откладывать очистку нельзя, поэтому избежать конфликта в случае
очистки нужных запросу версий строк таким образом не получится.
Другой способ — откладывать применение полученных несовместимых
журнальных записей на реплике. Этот способ работает и при потоковой
репликации, и при использовании архива; он откладывает записи,
относящиеся и к очистке, и к исключительным блокировкам.
В параметрах устанавливается максимальная задержка применения
(от времени получения записи). Если к этому моменту конфликтующий
запрос не успеет завершиться, он будет прерван.
Однако конфликты, вызванные редкими причинами (удаление базы
данных или табличного пространства, взаимоблокировки) не
откладываются и разрешаются немедленной отменой запроса.