19.5.1.31 Репликация и временные таблицы
В MySQL 8.4, когда binlog_format установлено в ROW или MIXED, операторы, которые исключительно используют временные таблицы, не регистрируются на источнике, и поэтому временные таблицы не реплицируются. Операторы, которые включают в себя смесь временных и постоянных таблиц, регистрируются на источнике только для операций с постоянными таблицами, а операции с временными таблицами не регистрируются. Это означает, что на реплике никогда не будет временных таблиц, которые могут быть потеряны в случае непредвиденной остановки реплики. Дополнительную информацию о репликации на основе строк и временных таблицах см. в разделе Репликация временных таблиц на основе строк.
Когда binlog_format установлено в STATEMENT, операции с временными таблицами регистрируются на источнике и реплицируются на реплике, при условии, что операторы, включающие временные таблицы, могут быть безопасно зарегистрированы с помощью формата на основе операторов. В этой ситуации потеря реплицированных временных таблиц на реплике может быть проблемой. В режиме репликации на основе операторов операторы CREATE TEMPORARY
TABLE и DROP TEMPORARY
TABLE не могут использоваться внутри транзакции, процедуры, функции или триггера, когда идентификаторы GTID используются на сервере (то есть, когда переменная системы enforce_gtid_consistency установлена в ON). Они могут использоваться вне этих контекстов, когда GTID используются, при условии, что autocommit=1 установлено.
Из-за различий в поведении между режимом репликации на основе строк или смешанным режимом и режимом репликации на основе операторов, касающихся временных таблиц, вы не можете переключать формат репликации во время выполнения, если изменение относится к контексту (глобальному или сеансовому), который содержит открытые временные таблицы. Более подробную информацию см. в описании параметра binlog_format.
Безопасная остановка реплики при использовании временных таблиц. В режиме репликации на основе операторов временные таблицы реплицируются, за исключением случаев, когда вы останавливаете сервер реплики (а не только потоки репликации) и у вас есть реплицированные временные таблицы, которые открыты для использования в обновлениях, которые еще не были выполнены на реплике. Если вы остановите сервер реплики, временные таблицы, необходимые для этих обновлений, больше не будут доступны при перезапуске реплики. Чтобы избежать этой проблемы, не останавливайте реплику, пока в ней открыты временные таблицы. Вместо этого используйте следующую процедуру:
Выполните оператор
STOP REPLICA SQL_THREAD.Используйте
SHOW STATUSдля проверки значения переменной состоянияReplica_open_temp_tables.Если значение не равно 0, перезапустите поток SQL репликации с
START REPLICA SQL_THREADи повторите процедуру позже.Когда значение равно 0, выполните команду mysqladmin shutdown для остановки реплики.
Временные таблицы и параметры репликации. По умолчанию, при репликации на основе операторов, все временные таблицы реплицируются; это происходит независимо от наличия или отсутствия соответствующих параметров --replicate-do-db, --replicate-do-table или --replicate-wild-do-table. Однако, параметры --replicate-ignore-table и --replicate-wild-ignore-table учитываются для временных таблиц. Исключением является то, что для правильного удаления временных таблиц в конце сеанса реплика всегда реплицирует оператор DROP
TEMPORARY TABLE IF EXISTS, независимо от каких-либо правил исключения, которые обычно применяются для указанной таблицы.
Рекомендуемой практикой при использовании репликации на основе операторов является назначение префикса для исключительного использования при именовании временных таблиц, которые вы не хотите реплицировать, а затем использование параметра --replicate-wild-ignore-table для сопоставления с этим префиксом. Например, вы можете дать всем таким таблицам имена, начинающиеся с norep (например, norepmytable, norepyourtable и так далее), а затем использовать --replicate-wild-ignore-table=norep%, чтобы предотвратить их репликацию.
© 2025 Oracle
Licensed under the GPLv2 License.