#### 17.5.1.39 复制和变量

[](<>)[](<>)[](<>)[](<>)[](<>)

使用时系统变量未正确复制`陈述`模式，但以下变量与会话范围一起使用时除外：

-   [`auto_increment_increment`](replication-options-source.html#sysvar_auto_increment_increment)

-   [`auto_increment_offset`](replication-options-source.html#sysvar_auto_increment_offset)

-   [`character_set_client`](server-system-variables.html#sysvar_character_set_client)

-   [`字符集连接`](server-system-variables.html#sysvar_character_set_connection)

-   [`字符集数据库`](server-system-variables.html#sysvar_character_set_database)

-   [`character_set_server`](server-system-variables.html#sysvar_character_set_server)

-   [`collat​​ion_connection`](server-system-variables.html#sysvar_collation_connection)

-   [`collat​​ion_database`](server-system-variables.html#sysvar_collation_database)

-   [`collat​​ion_server`](server-system-variables.html#sysvar_collation_server)

-   [`foreign_key_checks`](server-system-variables.html#sysvar_foreign_key_checks)

-   [`身份`](server-system-variables.html#sysvar_identity)

-   [`last_insert_id`](server-system-variables.html#sysvar_last_insert_id)

-   [`lc_time_names`](server-system-variables.html#sysvar_lc_time_names)

-   [`伪线程 ID`](server-system-variables.html#sysvar_pseudo_thread_id)

-   [`sql_auto_is_null`](server-system-variables.html#sysvar_sql_auto_is_null)

-   [`时区`](server-system-variables.html#sysvar_time_zone)

-   [`时间戳`](server-system-variables.html#sysvar_timestamp)

-   [`unique_checks`](server-system-variables.html#sysvar_unique_checks)

    什么时候`混合`使用模式时，前面列表中的变量与会话范围一起使用时，会导致从基于语句的日志记录切换到基于行的日志记录。看[第 5.4.4.3 节，“混合二进制日志记录格式”](binary-log-mixed.html).

[`sql_mode`](server-system-variables.html#sysvar_sql_mode)也被复制除了[`NO_DIR_IN_CREATE`](sql-mode.html#sqlmode_no_dir_in_create)模式;副本始终保留自己的价值[`NO_DIR_IN_CREATE`](sql-mode.html#sqlmode_no_dir_in_create)，无论源上的更改如何。这适用于所有复制格式。

然而，当[**mysqlbinlog**](mysqlbinlog.html)解析一个`设置@@sql_mode = *`模式`*`声明，完整的*`模式`*价值，包括[`NO_DIR_IN_CREATE`](sql-mode.html#sqlmode_no_dir_in_create), 被传递给接收服务器。因此，在以下情况下复制此类语句可能不安全`陈述`模式正在使用中。

这[`default_storage_engine`](server-system-variables.html#sysvar_default_storage_engine)无论记录模式如何，系统变量都不会被复制；这旨在促进不同存储引擎之间的复制。

这[`只读`](server-system-variables.html#sysvar_read_only)系统变量不被复制。此外，启用此变量对临时表、表锁定和[`设置密码`](set-password.html)不同 MySQL 版本中的语句。

这[`max_heap_table_size`](server-system-variables.html#sysvar_max_heap_table_size)系统变量不被复制。尝试执行时在源上增加此变量的值而不在副本上这样做最终会导致副本上的 Table is full 错误[`插入`](insert.html)关于 a 的声明[`记忆`](memory-storage-engine.html)因此，允许源上的表比副本上的对应表更大。有关详细信息，请参阅[第 17.5.1.21 节，“复制和内存表”](replication-features-memory.html).

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

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

这不适用于公共序列：

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

当使用基于行的复制时，会话变量的复制不是问题，在这种情况下，会话变量总是被安全地复制。看[第 17.2.1 节，“复制格式”](replication-formats.html).

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

-   [`sql_mode`](server-system-variables.html#sysvar_sql_mode)

-   [`foreign_key_checks`](server-system-variables.html#sysvar_foreign_key_checks)

-   [`unique_checks`](server-system-variables.html#sysvar_unique_checks)

-   [`character_set_client`](server-system-variables.html#sysvar_character_set_client)

-   [`collat​​ion_connection`](server-system-variables.html#sysvar_collation_connection)

-   [`collat​​ion_database`](server-system-variables.html#sysvar_collation_database)

-   [`collat​​ion_server`](server-system-variables.html#sysvar_collation_server)

-   [`sql_auto_is_null`](server-system-variables.html#sysvar_sql_auto_is_null)

重要的

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

为了帮助减少可能的混淆，我们建议您始终使用相同的设置[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)源和副本上的系统变量，尤其是当您在具有区分大小写的文件系统的平台上运行 MySQL 时。这[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)设置只能在初始化服务器时进行配置。
