19.5.1.39 Репликация и переменные
Системные переменные не реплицируются корректно при использовании режима STATEMENT, за исключением следующих переменных, когда они используются в контексте сеанса:
При использовании режима MIXED, переменные в вышеприведённом списке, используемые в контексте сеанса, вызывают переключение с протокола логгирования на основе операторов на протокол логгирования на основе строк. См. Раздел 7.4.4.3, «Формат смешанного двоичного протокола логгирования».
sql_mode также реплицируется, за исключением режима NO_DIR_IN_CREATE; реплика всегда сохраняет собственное значение для NO_DIR_IN_CREATE, независимо от изменений на источнике. Это справедливо для всех форматов репликации.
Однако, когда mysqlbinlog анализирует оператор SET @@sql_mode =
, полное значение modemode, включая NO_DIR_IN_CREATE, передаётся на принимающий сервер. По этой причине репликация такого оператора может быть небезопасной при использовании режима STATEMENT.
Системная переменная default_storage_engine не реплицируется, независимо от режима логгирования; это сделано для поддержки репликации между различными движками хранения.
Системная переменная read_only не реплицируется. Кроме того, включение этой переменной имеет разные последствия в отношении временных таблиц, блокировки таблиц и оператора SET PASSWORD в разных версиях MySQL.
Системная переменная max_heap_table_size не реплицируется. Увеличение значения этой переменной на источнике без аналогичного изменения на реплике может привести к ошибкам Таблица заполнена на реплике при попытке выполнения операторов INSERT над таблицей MEMORY на источнике, которая, таким образом, может стать больше, чем её аналог на реплике. Для получения дополнительной информации см. Раздел 19.5.1.21, «Репликация и таблицы MEMORY».
При репликации на основе операторов сеансовые переменные не реплицируются должным образом при использовании в операторах, обновляющих таблицы. Например, следующая последовательность операторов не вставит одинаковые данные на источнике и реплике:
SET max_join_size=1000;
INSERT INTO mytable VALUES(@@max_join_size);
Это не относится к общепринятой последовательности:
SET time_zone=...;
INSERT INTO mytable VALUES(CONVERT_TZ(..., ..., @@time_zone));
Репликация сеансовых переменных не является проблемой при использовании репликации на основе строк, в этом случае сеансовые переменные всегда реплицируются безопасно. См. Раздел 19.2.1, «Форматы репликации».
Следующие сеансовые переменные записываются в двоичный лог и учитываются репликой при анализе двоичного лога, независимо от формата логгирования:
Несмотря на то, что сеансовые переменные, относящиеся к наборам символов и сортировкам, записываются в двоичный лог, репликация между различными наборами символов не поддерживается.
Для предотвращения возможных ошибок рекомендуется всегда использовать одинаковые значения для системной переменной lower_case_table_names как на источнике, так и на реплике, особенно при использовании MySQL на платформах с регистрозависимыми файловыми системами. Значение lower_case_table_names может быть настроено только при инициализации сервера.
© 2025 Oracle
Licensed under the GPLv2 License.