16.1.6.2 复制源选项和变量
本节介绍可在复制源服务器上使用的服务器选项和系统变量。您可以在command line或option file中指定选项。您可以使用SET指定系统变量值。
在源和每个副本上,必须设置server_id系统变量以构建唯一的复制 ID。对于每个服务器,应该选择一个介于 1 到 232-1 之间的唯一正整数,并且每个 ID 必须与复制拓扑中任何其他源或副本使用的每个其他 ID 不同。示例:server-id=3
。
有关在源上用于控制二进制日志记录的选项,请参见第 16.1.6.4 节“二进制日志记录选项和变量”。
复制源服务器的启动选项
下 table 描述了用于控制复制源服务器的启动选项。与复制相关的系统变量将在本节后面讨论。
Property | Value |
---|---|
Command-Line Format | --show-slave-auth-info[={OFF|ON}] |
Type | Boolean |
Default Value | OFF |
在源服务器上显示从主机的输出中显示以--report-user和--report-password选项开头的副本的副本用户名和密码。
复制源服务器上使用的系统变量
以下系统变量用于控制源:
Property | Value |
---|---|
Command-Line Format | --auto-increment-increment=# |
System Variable | auto_increment_increment |
Scope | Global, Session |
Dynamic | Yes |
Type | Integer |
Default Value | 1 |
Minimum Value | 1 |
Maximum Value | 65535 |
auto_increment_increment和auto_increment_offset旨在与源到源复制一起使用,并且可用于控制AUTO_INCREMENT
列的操作。这两个变量都具有全局值和会话值,并且每个变量都可以采用 1 到 65535(含)之间的整数值。将这两个变量之一的值设置为 0 会导致其值设置为 1.尝试将这两个变量的值设置为大于 65,535 或小于 0 的整数会导致其值设置为 65,535.尝试将auto_increment_increment或auto_increment_offset的值设置为非整数值会产生错误,并且变量的实际值保持不变。
Note
auto_increment_increment也支持与NDB个 table 一起使用。
在服务器上启动组复制时,值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
列的 table 中,则结果似乎违反直觉,因为计算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查询所示。
不可能将这两个变量的作用限制在一个 table 中。这些变量控制 MySQL 服务器上* all *table 中所有AUTO_INCREMENT
列的行为。如果设置了其中一个变量的全局值,则其效果将持续到通过设置会话值更改或覆盖全局值,或者直到重新启动mysqld为止。如果设置了本地值,则新值将影响会话期间当前用户在其中插入新行的所有 table 的AUTO_INCREMENT
列,除非在该会话期间更改了值。
auto_increment_increment的默认值为 1.请参见第 16.4.1.1 节“复制和 AUTO_INCREMENT”。
Property | Value |
---|---|
Command-Line Format | --auto-increment-offset=# |
System Variable | auto_increment_offset |
Scope | Global, Session |
Dynamic | Yes |
Type | Integer |
Default Value | 1 |
Minimum Value | 1 |
Maximum Value | 65535 |
此变量的默认值为 1.如果保留其默认值,并且在服务器上启动了组复制,则将其更改为服务器 ID。有关更多信息,请参见auto_increment_increment的描述。
Note
NDBtable 也支持auto_increment_offset
。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-enabled[={OFF|ON}] |
System Variable | rpl_semi_sync_master_enabled |
Scope | Global |
Dynamic | Yes |
Type | Boolean |
Default Value | OFF |
控制是否在源上启用半同步复制。要启用或禁用插件,请将此变量分别设置为ON
或OFF
(或 1 或 0)。默认值为OFF
。
仅当安装了源端半同步复制插件时,此变量才可用。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-timeout=# |
System Variable | rpl_semi_sync_master_timeout |
Scope | Global |
Dynamic | Yes |
Type | Integer |
Default Value | 10000 |
以毫秒为单位的值,用于控制源在超时并恢复为异步复制之前 await 复制副本提交确认的 await 时间。默认值为 10000(10 秒)。
仅当安装了源端半同步复制插件时,此变量才可用。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-trace-level=# |
System Variable | rpl_semi_sync_master_trace_level |
Scope | Global |
Dynamic | Yes |
Type | Integer |
Default Value | 32 |
源上的半同步复制调试跟踪级别。定义了四个级别:
-
1 =常规级别(例如,时间函数故障)
-
16 =详细程度(更多详细信息)
-
32 =净 await 级别(有关网络 await 的更多信息)
-
64 =功能级别(有关功能进入和退出的信息)
-
仅当安装了源端半同步复制插件时,此变量才可用。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-wait-for-slave-count=# |
System Variable | rpl_semi_sync_master_wait_for_slave_count |
Scope | Global |
Dynamic | Yes |
Type | Integer |
Default Value | 1 |
Minimum Value | 1 |
Maximum Value | 65535 |
源在 continue 之前必须为每个事务接收的副本确认的数量。默认情况下,rpl_semi_sync_master_wait_for_slave_count
为1
,这意味着半同步复制在收到单个副本确认后 continue 进行。对于此变量的较小值,性能最佳。
例如,如果rpl_semi_sync_master_wait_for_slave_count
为2
,则 2 个副本必须在rpl_semi_sync_master_timeout配置的超时期限之前确认事务的接收,才能 continue 进行半同步复制。如果在超时期间确认接收到事务的副本较少,则源将恢复为正常复制。
Note
仅当安装了源端半同步复制插件时,此变量才可用。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-wait-no-slave[={OFF|ON}] |
System Variable | rpl_semi_sync_master_wait_no_slave |
Scope | Global |
Dynamic | Yes |
Type | Boolean |
Default Value | ON |
控制源是否 await 由rpl_semi_sync_master_timeout配置的超时时间到期,即使副本计数在该超时时间内下降到小于由rpl_semi_sync_master_wait_for_slave_count配置的副本数。
当rpl_semi_sync_master_wait_no_slave
的值为ON
(默认值)时,在超时期间,允许副本数降至小于rpl_semi_sync_master_wait_for_slave_count。只要有足够的副本在超时期限到期之前确认该事务,半同步复制就会 continue。
当rpl_semi_sync_master_wait_no_slave
的值为OFF
时,如果在rpl_semi_sync_master_timeout配置的超时时间段内的任何时候副本数下降到小于rpl_semi_sync_master_wait_for_slave_count配置的数量,则源将恢复为正常复制。
仅当安装了源端半同步复制插件时,此变量才可用。
Property | Value |
---|---|
Command-Line Format | --rpl-semi-sync-master-wait-point=value |
System Variable | rpl_semi_sync_master_wait_point |
Scope | Global |
Dynamic | Yes |
Type | Enumeration |
Default Value | AFTER_SYNC |
Valid Values | AFTER_SYNC |
AFTER_COMMIT |
此变量控制半同步源在向提交事务的 Client 端返回状态之前 await 事务接收的副本确认的时间点。这些值是允许的:
-
AFTER_SYNC
(默认值):源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。同步后,源 awaitTransaction 收据的副本确认。收到确认后,源将事务提交到存储引擎,然后将结果返回给 Client 端,然后 Client 端可以 continue 进行。AFTER_COMMIT
:源将每个事务写入其二进制日志和副本,同步二进制日志,然后将事务提交到存储引擎。提交后,源将 await 事务接收的副本确认。收到确认后,源将结果返回给 Client 端,然后 Client 端可以 continue 进行。
这些设置的复制 Feature 不同,如下所示:
- 使用
AFTER_SYNC
,所有 Client 端都可以同时看到已提交的事务:在副本确认了事务并将其提交到源上的存储引擎之后。因此,所有 Client 端都在源上看到相同的数据。
如果发生源故障,则已将在源上提交的所有事务复制到副本(保存到其中继日志)。源的崩溃和到副本的故障转移是无损的,因为副本是最新的。但是请注意,在这种情况下无法重新启动源,必须将其丢弃,因为其二进制日志可能包含未提交的事务,这些事务在二进制日志恢复后被外部化时会与副本产生冲突。
- 使用
AFTER_COMMIT
,发出事务的 Client 端仅在服务器提交到存储引擎并收到副本确认后才获得返回状态。在提交之后和副本确认之前,其他 Client 端可以在提交 Client 端之前看到提交的事务。
如果出现问题,导致副本无法处理事务,则在源崩溃和故障转移到副本的情况下,此类 Client 端可能会看到相对于其在源上看到的数据丢失的数据。
仅当安装了源端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_point已在 MySQL 5.7.2 中添加。对于较旧的版本,半同步源行为等效于AFTER_COMMIT
的设置。
此更改引入了版本兼容性约束,因为它会增加半同步接口版本:MySQL 5.7.2 及更高版本的服务器不适用于旧版本的半同步复制插件,旧版本的服务器也不适用于 MySQL 5.7.2 的半同步复制插件。及以上。