本节介绍了您可以在复制源服务器上使用的服务器选项和系统变量。您可以在 命令行 或 选项文件 中指定选项。您可以使用 SET
指定系统变量值。
在源和每个副本上,您必须设置 server_id
系统变量以建立唯一的复制 ID。对于每个服务器,您应该选择 1 到 232 − 1 范围内的唯一正整数,并且每个 ID 必须与复制拓扑中任何其他源或副本使用的任何其他 ID 不同。例如:server-id=3
。
有关在源上用于控制二进制日志记录的选项,请参见 第 19.1.6.4 节,“二进制日志记录选项和变量”.
以下列表介绍了用于控制复制源服务器的启动选项。复制相关的系统变量将在本节后面讨论。
-
命令行格式 --show-replica-auth-info[={OFF|ON}]
类型 布尔值 默认值 OFF
使用
--show-replica-auth-info
,它将在源上使用--report-user
和--report-password
选项启动的副本的SHOW REPLICAS
输出中显示复制用户名和密码。 -
命令行格式 --show-slave-auth-info[={OFF|ON}]
已弃用 是 类型 布尔值 默认值 OFF
--show-replica-auth-info
的已弃用别名。
以下系统变量用于或由复制源服务器使用
-
命令行格式 --auto-increment-increment=#
系统变量 auto_increment_increment
范围 全局,会话 动态 是 SET_VAR
提示适用是 类型 整数 默认值 1
最小值 1
最大值 65535
auto_increment_increment
和auto_increment_offset
旨在用于循环(源到源)复制,并且可用于控制AUTO_INCREMENT
列的操作。这两个变量都具有全局值和会话值,并且每个变量都可以取 1 到 65,535(含)之间的整数值。将这两个变量中的任何一个的值设置为 0,将导致其值设置为 1。尝试将这两个变量中的任何一个的值设置为大于 65,535 或小于 0 的整数,将导致其值设置为 65,535。尝试将auto_increment_increment
或auto_increment_offset
设置为非整数值会导致错误,并且变量的实际值保持不变。注意auto_increment_increment
也支持用于NDB
表。当在服务器上启动组复制时,
auto_increment_increment
的值将更改为group_replication_auto_increment_increment
的值,默认值为 7,auto_increment_offset
的值将更改为服务器 ID。当组复制停止时,更改将被还原。这些更改仅在auto_increment_increment
和auto_increment_offset
各自具有其默认值 1 时才进行并还原。如果它们的值已经从默认值修改,则组复制不会更改它们。当组复制处于单主模式(仅一个服务器写入)时,也不会修改这些系统变量。auto_increment_increment
和auto_increment_offset
影响AUTO_INCREMENT
列的行为,如下所示auto_increment_increment
控制连续列值之间的间隔。例如mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> CREATE TABLE autoinc1 -> (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY); Query OK, 0 rows affected (0.04 sec) mysql> SET @@auto_increment_increment=10; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.01 sec) mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec)
auto_increment_offset
确定AUTO_INCREMENT
列值的起始点。考虑以下情况,假设这些语句在与auto_increment_increment
描述中给出的示例相同的会话期间执行mysql> SET @@auto_increment_offset=5; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> CREATE TABLE autoinc2 -> (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY); Query OK, 0 rows affected (0.06 sec) mysql> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc2; +-----+ | col | +-----+ | 5 | | 15 | | 25 | | 35 | +-----+ 4 rows in set (0.02 sec)
当
auto_increment_offset
的值大于auto_increment_increment
的值时,将忽略auto_increment_offset
的值。
如果更改了这两个变量中的任何一个,然后将新行插入到包含
AUTO_INCREMENT
列的表中,则结果可能看起来不直观,因为AUTO_INCREMENT
值序列的计算不考虑列中已存在的任何值,并且插入的下一个值是序列中大于AUTO_INCREMENT
列中最大现有值的最小值。序列的计算方式如下auto_increment_offset
+N
×auto_increment_increment
其中
N
是序列 [1, 2, 3, ...] 中的正整数值。例如mysql> SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 5 | +--------------------------+-------+ 2 rows in set (0.00 sec) mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | +-----+ 4 rows in set (0.00 sec) mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT col FROM autoinc1; +-----+ | col | +-----+ | 1 | | 11 | | 21 | | 31 | | 35 | | 45 | | 55 | | 65 | +-----+ 8 rows in set (0.00 sec)
显示的
auto_increment_increment
和auto_increment_offset
值将生成序列 5 +N
× 10,即 [5, 15, 25, 35, 45, ...]。在执行INSERT
之前,col
列中存在的最高值为 31,并且AUTO_INCREMENT
序列中下一个可用值为 35,因此col
的插入值从该点开始,结果如SELECT
查询所示。无法将这两个变量的影响限制在单个表中;这些变量控制 MySQL 服务器上 所有 表中所有
AUTO_INCREMENT
列的行为。如果设置了任一变量的全局值,则其影响将持续存在,直到全局值被更改或被设置会话值覆盖,或者直到 mysqld 重新启动。如果设置了本地值,则新值将影响当前用户在整个会话期间插入新行的所有表的AUTO_INCREMENT
列,除非该会话期间更改了这些值。auto_increment_increment
的默认值为 1。请参阅 第 19.5.1.1 节,“复制和 AUTO_INCREMENT”。 -
命令行格式 --auto-increment-offset=#
系统变量 auto_increment_offset
范围 全局,会话 动态 是 SET_VAR
提示适用是 类型 整数 默认值 1
最小值 1
最大值 65535
此变量的默认值为 1。如果将其保留为默认值,并且在服务器上以多主模式启动组复制,则它将更改为服务器 ID。有关更多信息,请参阅
auto_increment_increment
的描述。注意auto_increment_offset
也支持用于NDB
表。 -
系统变量 immediate_server_version
范围 会话 动态 是 SET_VAR
提示适用否 类型 整数 默认值 999999
最小值 0
最大值 999999
供复制内部使用。此会话系统变量保存作为复制拓扑中直接来源的服务器的 MySQL Server 版本号(例如,MySQL 9.1.0 服务器实例为
90000
)。如果此直接服务器处于不支持此会话系统变量的版本中,则该变量的值将设置为 0 (UNKNOWN_SERVER_VERSION
)。该变量的值将从源复制到副本。通过此信息,副本可以正确处理源自较旧版本的源的数据,方法是识别涉及的版本之间语法更改或语义更改发生的位置,并适当地处理这些更改。此信息也可用于组复制环境,其中复制组的一个或多个成员处于比其他成员更新的版本中。该变量的值可以在每个事务的二进制日志中查看(作为
Gtid_log_event
的一部分,如果服务器未使用 GTID,则为Anonymous_gtid_log_event
),并且可能有助于调试跨版本复制问题。设置此系统变量的会话值是一个受限操作。会话用户必须具有
REPLICATION_APPLIER
权限(请参阅 第 19.3.3 节,“复制权限检查”),或具有足够的权限来设置受限会话变量(请参阅 第 7.1.9.1 节,“系统变量权限”)。但是,请注意,该变量并非旨在供用户设置;它是由复制基础设施自动设置的。 -
系统变量 original_server_version
范围 会话 动态 是 SET_VAR
提示适用否 类型 整数 默认值 999999
最小值 0
最大值 999999
供复制内部使用。此会话系统变量保存事务最初提交的服务器的 MySQL Server 版本号(例如,MySQL 9.0.0 服务器实例为
90000
)。如果此原始服务器处于不支持此会话系统变量的版本中,则该变量的值将设置为 0 (UNKNOWN_SERVER_VERSION
)。请注意,当原始服务器设置版本号时,如果直接服务器或复制拓扑中任何其他中间服务器不支持此会话系统变量,并且因此不复制其值,则该变量的值将重置为 0。该变量的值以与
immediate_server_version
系统变量相同的方式设置和使用。如果该变量的值与immediate_server_version
系统变量的值相同,则仅在二进制日志中记录后者,并带有指示原始服务器版本相同的指示符。在组复制环境中,当新的成员加入组时,每个组成员排队的特殊事务(视图更改日志事件)将使用排队事务的组成员的服务器版本进行标记。这确保了加入的成员知道原始捐赠者的服务器版本。由于为特定视图更改排队的视图更改日志事件在所有成员上具有相同的 GTID,因此,对于这种情况,相同 GTID 的实例可能具有不同的原始服务器版本。
设置此系统变量的会话值是一个受限操作。会话用户必须具有
REPLICATION_APPLIER
权限(请参阅 第 19.3.3 节,“复制权限检查”),或具有足够的权限来设置受限会话变量(请参阅 第 7.1.9.1 节,“系统变量权限”)。但是,请注意,该变量并非旨在供用户设置;它是由复制基础设施自动设置的。 -
命令行格式 --rpl-semi-sync-master-enabled[={OFF|ON}]
系统变量 rpl_semi_sync_master_enabled
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
rpl_semi_sync_source_enabled
的已弃用同义词。 -
命令行格式 --rpl-semi-sync-master-timeout=#
系统变量 rpl_semi_sync_master_timeout
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 10000
最小值 0
最大值 4294967295
单位 毫秒 rpl_semi_sync_source_timeout
的已弃用同义词。 rpl_semi_sync_master_trace_level
命令行格式 --rpl-semi-sync-master-trace-level=#
系统变量 rpl_semi_sync_master_trace_level
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 32
最小值 0
最大值 4294967295
rpl_semi_sync_source_trace_level
的已弃用同义词。rpl_semi_sync_master_wait_for_slave_count
命令行格式 --rpl-semi-sync-master-wait-for-slave-count=#
系统变量 rpl_semi_sync_master_wait_for_slave_count
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 1
最小值 1
最大值 65535
rpl_semi_sync_master_wait_no_slave
命令行格式 --rpl-semi-sync-master-wait-no-slave[={OFF|ON}]
系统变量 rpl_semi_sync_master_wait_no_slave
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
rpl_semi_sync_source_wait_no_replica
的已弃用同义词。rpl_semi_sync_master_wait_point
命令行格式 --rpl-semi-sync-master-wait-point=value
系统变量 rpl_semi_sync_master_wait_point
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 AFTER_SYNC
有效值 AFTER_SYNC
AFTER_COMMIT
rpl_semi_sync_source_wait_point
的已弃用同义词。-
命令行格式 --rpl-semi-sync-source-enabled[={OFF|ON}]
系统变量 rpl_semi_sync_source_enabled
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 OFF
rpl_semi_sync_source_enabled
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件以设置半同步复制时可用。rpl_semi_sync_source_enabled
控制源服务器上是否启用了半同步复制。要启用或禁用插件,请将此变量分别设置为ON
或OFF
(或 1 或 0)。默认值为OFF
。 -
命令行格式 --rpl-semi-sync-source-timeout=#
系统变量 rpl_semi_sync_source_timeout
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 10000
最小值 0
最大值 4294967295
单位 毫秒 rpl_semi_sync_source_timeout
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件时可用。rpl_semi_sync_source_timeout
控制源在对事务进行确认的副本超时之前等待多长时间,然后超时并恢复到异步复制。该值以毫秒为单位,默认值为 10000(10 秒)。 rpl_semi_sync_source_trace_level
命令行格式 --rpl-semi-sync-source-trace-level=#
系统变量 rpl_semi_sync_source_trace_level
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 32
最小值 0
最大值 4294967295
rpl_semi_sync_source_trace_level
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件时可用。rpl_semi_sync_source_trace_level
指定源服务器上的半同步复制调试跟踪级别。定义了四个级别1 = 常规级别(例如,时间函数失败)
16 = 详细级别(更详细的信息)
32 = 网络等待级别(有关网络等待的更多信息)
64 = 函数级别(有关函数进入和退出的信息)
rpl_semi_sync_source_wait_for_replica_count
命令行格式 --rpl-semi-sync-source-wait-for-replica-count=#
系统变量 rpl_semi_sync_source_wait_for_replica_count
范围 全局 动态 是 SET_VAR
提示适用否 类型 整数 默认值 1
最小值 1
最大值 65535
rpl_semi_sync_source_wait_for_replica_count
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件以设置半同步复制时可用。rpl_semi_sync_source_wait_for_replica_count
指定源必须为每个事务接收的副本确认数量,然后才能继续。默认情况下,rpl_semi_sync_source_wait_for_replica_count
为1
,这意味着半同步复制在收到单个副本确认后继续。此变量的值越小,性能越好。例如,如果
rpl_semi_sync_source_wait_for_replica_count
为2
,则在rpl_semi_sync_source_timeout
配置的超时时间内,必须有 2 个副本确认已收到该事务,半同步复制才能继续。如果在超时时间内较少的副本确认已收到该事务,则源将恢复到正常复制。注意此行为还取决于
rpl_semi_sync_source_wait_no_replica
。rpl_semi_sync_source_wait_no_replica
命令行格式 --rpl-semi-sync-source-wait-no-replica[={OFF|ON}]
系统变量 rpl_semi_sync_source_wait_no_replica
范围 全局 动态 是 SET_VAR
提示适用否 类型 布尔值 默认值 ON
rpl_semi_sync_source_wait_no_replica
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件时可用。rpl_semi_sync_source_wait_no_replica
控制源是否等待rpl_semi_sync_source_timeout
配置的超时时间到期,即使副本数量在超时时间内下降到小于rpl_semi_sync_source_wait_for_replica_count
配置的副本数量。当
rpl_semi_sync_source_wait_no_replica
的值为ON
(默认值)时,允许副本数量在超时时间内下降到小于rpl_semi_sync_source_wait_for_replica_count
。只要在超时时间到期之前有足够的副本确认了该事务,半同步复制就会继续。当
rpl_semi_sync_source_wait_no_replica
的值为OFF
时,如果在rpl_semi_sync_source_timeout
配置的超时时间内的任何时间点,副本数量下降到小于rpl_semi_sync_source_wait_for_replica_count
中配置的数量,则源将恢复到正常复制。rpl_semi_sync_source_wait_point
命令行格式 --rpl-semi-sync-source-wait-point=value
系统变量 rpl_semi_sync_source_wait_point
范围 全局 动态 是 SET_VAR
提示适用否 类型 枚举 默认值 AFTER_SYNC
有效值 AFTER_SYNC
AFTER_COMMIT
rpl_semi_sync_source_wait_point
在副本上安装了rpl_semi_sync_source
(semisync_source.so
库) 插件时可用。rpl_semi_sync_source_wait_point
控制半同步复制源服务器在向提交该事务的客户端返回状态之前,等待副本确认已收到事务的点。允许以下值AFTER_SYNC
(默认值):源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。源在同步后等待副本确认已收到事务。收到确认后,源将事务提交到存储引擎并向客户端返回结果,然后客户端可以继续。AFTER_COMMIT
:源将每个事务写入其二进制日志和副本,同步二进制日志,并将事务提交到存储引擎。源在提交后等待副本确认已收到事务。收到确认后,源向客户端返回结果,然后客户端可以继续。
这些设置的复制特征差异如下
使用
AFTER_SYNC
,所有客户端都同时看到已提交的事务:在副本确认并将其提交到源上的存储引擎之后。因此,所有客户端在源上看到相同的数据。如果源发生故障,所有在源上提交的事务都已复制到副本(保存到其中继日志)。源服务器意外退出并故障转移到副本是无损的,因为副本是最新的。但是,请注意,在这种情况下,源无法重启,必须丢弃,因为它的二进制日志可能包含未提交的事务,这些事务在二进制日志恢复后被外部化时会导致与副本冲突。
使用
AFTER_COMMIT
,发出事务的客户端只有在服务器提交到存储引擎并收到副本确认后才能获得返回状态。在提交和副本确认之间,其他客户端可以在提交客户端之前看到已提交的事务。如果发生错误,例如副本没有处理该事务,那么如果源服务器意外退出并故障转移到副本,则这些客户端可能会看到相对于他们在源上看到的数据丢失。