系统变量在使用 STATEMENT
模式时不能正确地复制,除非以下变量在会话作用域中使用:
当使用 MIXED
模式时,这些变量在会话作用域中使用时,会导致从基于语句的日志记录切换到基于行的日志记录。见 第 7.4.4.3 节,“Mixed Binary Logging Format”。
sql_mode
也被复制,除了 NO_DIR_IN_CREATE
模式;副本总是保留自己的 NO_DIR_IN_CREATE
值,不管源上的变化如何。这适用于所有复制格式。
然而,当 mysqlbinlog 解析 SET @@sql_mode =
语句时,完整的 mode
mode
值,包括 NO_DIR_IN_CREATE
,将被传递给接收服务器。因此,在 STATEMENT
模式下复制这种语句可能不安全。
系统变量 default_storage_engine
不被复制,不管日志模式如何;这旨在促进不同存储引擎之间的复制。
系统变量 read_only
不被复制。此外,在不同的 MySQL 版本中,该变量对临时表、表锁定和 SET PASSWORD
语句的影响不同。
系统变量 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
设置只能在服务器初始化时配置。