Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

19.5.1.39 复制和变量

系统变量在使用 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 节,“复制格式”

以下会话变量将被写入二进制日志,并在副本服务器上解析二进制日志时被尊重,不管日志格式如何:

Important

尽管会话变量与字符集和排序规则相关的信息被写入二进制日志,但是在不同字符集之间的复制不受支持。

为了减少可能的混淆,我们建议您在源服务器和副本服务器上始终使用相同的 lower_case_table_names 系统变量设置,特别是在运行 MySQL 的平台上具有大小写敏感的文件系统时。 lower_case_table_names 设置只能在服务器初始化时配置。