使用 STATEMENT
模式时,系统变量不会被正确复制,以下变量除外,这些变量在与会话范围一起使用时除外
使用 MIXED
模式时,上述列表中的变量(与会话范围一起使用时)会导致从基于语句的日志记录切换到基于行的日志记录。参见 第 7.4.4.3 节,“混合二进制日志记录格式”。
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
语句时最终出现 表已满 错误,而该语句在源上被允许增长,超过其在副本上的对应表的大小。有关更多信息,请参见 第 19.5.1.22 节,“复制和 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
设置只能在初始化服务器时配置。