使用STATEMENT模式时,系统变量不能正确复制 ,但以下变量与会话范围一起使用时除外:
auto_increment_increment
auto_increment_offset
character_set_client
character_set_connection
character_set_database
character_set_server
collation_connection
collation_database
collation_server
foreign_key_checks
identity
last_insert_id
lc_time_names
pseudo_thread_id
sql_auto_is_null
time_zone
timestamp
unique_checks
使用MIXEDmode时,上一列表中的变量与会话作用域一起使用时,会导致从基于语句的日志记录切换到基于行的日志记录。请参见 第5.4.4.3节“混合二进制日志记录格式”。
sql_mode除了NO_DIR_IN_CREATE模式外,也被复制 ;从属设备始终为保留自己的值 NO_DIR_IN_CREATE,而不管主控设备上的更改如何。所有复制格式都是如此。
但是,当mysqlbinlog解析一条 语句时,包括在内的完整 值 将传递到接收服务器。因此,在使用模式时,复制这样的语句可能并不安全。 SET @@sql_mode = modemodeNO_DIR_IN_CREATESTATEMENT
的default_storage_engine和 storage_engine系统变量不会被复制,而不考虑记录模式的; 这旨在促进不同存储引擎之间的复制。
该read_only系统变量是不可复制的。另外,启用此变量对临时表,表锁定和SET PASSWORD 不同MySQL版本中的语句有不同的影响。
该max_heap_table_size系统变量是不可复制的。尝试在主服务器上执行表上的语句时,如果在主服务器上执行此语句的值大于在从属服务器上的对应表的语句, 则在从属服务器上增加此变量的值而不在从属服务器上执行此操作的值最终会导致表错误。 。有关更多信息,请参见 第17.4.1.20节“复制和内存表”。 INSERTMEMORY
在基于语句的复制中,会话变量在更新表的语句中使用时无法正确复制。例如,以下语句序列将不会在主服务器和从服务器上插入相同的数据:
SET max_join_size=1000;
INSERT INTO mytable VALUES(@@max_join_size);
这不适用于通用序列:
SET time_zone=…;
INSERT INTO mytable VALUES(CONVERT_TZ(…, …, @@time_zone));
使用基于行的复制时,会话变量的复制不是问题,在这种情况下,会话变量始终被安全地复制。请参见 第17.1.2节“复制格式”。
在MySQL 5.6中,以下会话变量将被写入二进制日志,并在解析二进制日志时由复制从属服务器遵循,而与日志记录格式无关:
sql_mode
foreign_key_checks
unique_checks
character_set_client
collation_connection
collation_database
collation_server
sql_auto_is_null
重要
即使与字符集和归类有关的会话变量已写入二进制日志,也不支持不同字符集之间的复制。
为了帮助减少可能的混乱,我们建议始终lower_case_table_names在主服务器和从服务器上对系统变量使用相同的设置 ,尤其是在具有区分大小写的文件系统的平台上运行MySQL时。
注意
在以前的MySQL版本中,当使用区分大小写的文件系统时,在从属服务器上将此变量设置为1,在主服务器上将此变量设置为其他值可能会导致复制失败。此问题已在MySQL 5.6.1中修复。(缺陷#37656)




