Documentation Home

16.4.1.37 复制和变量

使用模式时,系统变量不会正确复制 STATEMENT,但以下变量与会话范围一起使用时除外:

使用MIXED模式时,前面列表中的变量在与会话范围一起使用时会导致从基于语句的日志记录切换到基于行的日志记录。请参阅 第 5.4.4.3 节,“混合二进制日志记录格式”

sql_mode除了模式外,也被复制 NO_DIR_IN_CREATE;副本始终为 保留其自身的值 NO_DIR_IN_CREATE,而不管源上对其的更改如何。这适用于所有复制格式。

但是,当mysqlbinlog解析一条 语句 时,包括 在内的完整值 将传递给接收服务器。出于这个原因,在使用模式时复制这样的语句可能不安全。 SET @@sql_mode = modemodeNO_DIR_IN_CREATESTATEMENT

无论记录模式如何,都不会复制default_storage_enginestorage_engine系统变量;这是为了促进不同存储引擎之间的复制。

read_only不复制系统变量 。另外,开启此变量对于临时表、表锁定、SET PASSWORD 不同MySQL版本的语句都有不同的影响。

max_heap_table_size不复制系统变量 。在源上增加此变量的值而不在副本上这样做最终可能导致Table is full当尝试 在源INSERT上的表上执行语句 时副本上的错误MEMORY,因此允许增长大于副本上的对应表. 有关详细信息,请参阅 第 16.4.1.20 节,“复制和内存表”

在基于语句的复制中,会话变量在更新表的语句中使用时不会正确复制。例如,以下语句序列不会在源和副本上插入相同的数据:

SET max_join_size=1000;
INSERT INTO mytable VALUES(@@max_join_size);

这不适用于公共序列:

SET time_zone=...;
INSERT INTO mytable VALUES(CONVERT_TZ(..., ..., @@time_zone));

当使用基于行的复制时,会话变量的复制不是问题,在这种情况下,会话变量总是被安全地复制。请参阅 第 16.2.1 节,“复制格式”

以下会话变量被写入二进制日志,并在解析二进制日志时由副本接受,无论日志格式如何:

重要的

即使与字符集和排序规则相关的会话变量被写入二进制日志,也不支持不同字符集之间的复制。

为了帮助减少可能的混淆,我们建议您始终 lower_case_table_names对源和副本上的系统变量使用相同的设置,尤其是当您在具有区分大小写的文件系统的平台上运行 MySQL 时。