Documentation Home

16.1.6.2 复制源选项和变量

本节介绍可在复制源服务器上使用的服务器选项和系统变量。您可以在 命令行选项文件中指定选项。您可以使用指定系统变量值 SET

在源和每个副本上,您必须设置 server_id系统变量以建立唯一的复制 ID。对于每个服务器,您应该在 1 到 2 ·32 − 1的范围内选择一个唯一的正整数,并且每个 ID 必须不同于复制拓扑中任何其他源或副本使用的每个其他 ID。例子: server-id=3

有关源上用于控制二进制日志记录的选项,请参阅 第 16.1.6.4 节,“二进制日志记录选项和变量”

复制源服务器的启动选项

以下列表描述了用于控制复制源服务器的启动选项。与复制相关的系统变量将在本节后面讨论。

复制源服务器上使用的系统变量

以下系统变量用于控制源:

  • auto_increment_increment

    命令行格式 --auto-increment-increment=#
    系统变量 auto_increment_increment
    范围 全局,会话
    动态的 是的
    类型 整数
    默认值 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表格一起使用。

    在服务器上启动Group Replication时,将 的值 auto_increment_increment更改为 的值 group_replication_auto_increment_increment,默认为7,并将 的值 auto_increment_offset更改为服务器ID。当 Group Replication 停止时,更改将恢复。只有当每个更改的默认值为 1时,才会进行和恢复这些更改 auto_increment_incrementauto_increment_offset 如果它们的值已经从默认值修改,组复制不会更改它们。

    auto_increment_incrementauto_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_offsetAUTO_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, ...]。之前列中的最大值colINSERT31,系列中的下一个可用值AUTO_INCREMENT 是 35,因此从该点开始插入的值 col和结果如SELECT 查询所示。

    不可能将这两个变量的影响限制在一个表中;这些变量控制MySQL 服务器上所有AUTO_INCREMENT表中所有列 的行为。如果设置了任一变量的全局值,它的影响将持续到全局值被更改或通过设置会话值覆盖,或者直到mysqld重新启动。如果设置了本地值,则新值将影响 当前用户在会话期间插入新行的所有表的列,除非在该会话期间更改了值。 AUTO_INCREMENT

    默认值为 auto_increment_increment1。请参阅 第 16.4.1.1 节,“复制和 AUTO_INCREMENT”

  • auto_increment_offset

    命令行格式 --auto-increment-offset=#
    系统变量 auto_increment_offset
    范围 全局,会话
    动态的 是的
    类型 整数
    默认值 1
    最小值 1
    最大值 65535

    此变量的默认值为 1。如果保留默认值,并且在服务器上启动了组复制,则会将其更改为服务器 ID。有关详细信息,请参阅 的说明 auto_increment_increment

    笔记

    auto_increment_offset也支持与NDB表格一起使用。

  • rpl_semi_sync_master_enabled

    命令行格式 --rpl-semi-sync-master-enabled[={OFF|ON}]
    系统变量 rpl_semi_sync_master_enabled
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 OFF

    控制是否在源上启用半同步复制。要启用或禁用插件,请分别将此变量设置为ONOFF (或 1 或 0)。默认值为 OFF

    此变量仅在安装源端半同步复制插件时可用。

  • rpl_semi_sync_master_timeout

    命令行格式 --rpl-semi-sync-master-timeout=#
    系统变量 rpl_semi_sync_master_timeout
    范围 全球的
    动态的 是的
    类型 整数
    默认值 10000
    最小值 0
    最大值 4294967295
    单元 毫秒

    一个以毫秒为单位的值,它控制源在超时和恢复到异步复制之前等待提交以确认来自副本的时间。默认值为 10000(10 秒)。

    此变量仅在安装源端半同步复制插件时可用。

  • rpl_semi_sync_master_trace_level

    命令行格式 --rpl-semi-sync-master-trace-level=#
    系统变量 rpl_semi_sync_master_trace_level
    范围 全球的
    动态的 是的
    类型 整数
    默认值 32
    最小值 0
    最大值 4294967295

    源上的半同步复制调试跟踪级别。定义了四个级别:

    • 1 = 一般级别(例如,时间功能故障)

    • 16 = 详细程度(更详细的信息)

    • 32 = 净等待级别(有关网络等待的更多信息)

    • 64 = 功能级别(有关功能进入和退出的信息)

    此变量仅在安装源端半同步复制插件时可用。

  • rpl_semi_sync_master_wait_for_slave_count

    命令行格式 --rpl-semi-sync-master-wait-for-slave-count=#
    系统变量 rpl_semi_sync_master_wait_for_slave_count
    范围 全球的
    动态的 是的
    类型 整数
    默认值 1
    最小值 1
    最大值 65535

    源在继续之前每个事务必须接收的副本确认数。默认情况下 rpl_semi_sync_master_wait_for_slave_count1,这意味着半同步复制在收到单个副本确认后继续进行。此变量的小值性能最佳。

    例如,如果 rpl_semi_sync_master_wait_for_slave_count2,则 2 个副本必须在为半同步复制配置的超时期限之前确认收到事务 rpl_semi_sync_master_timeout 。如果在超时期间确认收到事务的副本较少,则源恢复正常复制。

    笔记

    这种行为也取决于 rpl_semi_sync_master_wait_no_slave

    此变量仅在安装源端半同步复制插件时可用。

  • rpl_semi_sync_master_wait_no_slave

    命令行格式 --rpl-semi-sync-master-wait-no-slave[={OFF|ON}]
    系统变量 rpl_semi_sync_master_wait_no_slave
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 ON

    控制源是否等待由配置的超时期限 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只要在超时期限到期之前有足够的副本确认事务,半同步复制就会继续。

    当 的值为 时 rpl_semi_sync_master_wait_no_slave, 如果副本计数 在 的配置的超时期限内的任何时候 OFF下降到小于配置的数量 ,则源恢复正常复制。 rpl_semi_sync_master_wait_for_slave_countrpl_semi_sync_master_timeout

    此变量仅在安装源端半同步复制插件时可用。

  • rpl_semi_sync_master_wait_point

    命令行格式 --rpl-semi-sync-master-wait-point=value
    系统变量 rpl_semi_sync_master_wait_point
    范围 全球的
    动态的 是的
    类型 枚举
    默认值 AFTER_SYNC
    有效值

    AFTER_SYNC

    AFTER_COMMIT

    此变量控制半同步源在将状态返回给提交事务的客户端之前等待事务接收的副本确认的时间点。这些值是允许的:

    • AFTER_SYNC(默认):源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。同步后,源等待事务接收的副本确认。收到确认后,源将事务提交给存储引擎并将结果返回给客户端,然后客户端可以继续进行。

    • AFTER_COMMIT:源将每个事务写入其二进制日志和副本,同步二进制日志,并将事务提交给存储引擎。源在提交后等待事务接收的副本确认。收到确认后,源将结果返回给客户端,然后客户端可以继续。

    这些设置的复制特征不同如下:

    • 使用AFTER_SYNC,所有客户端同时看到提交的事务:在它被副本确认并提交到源上的存储引擎之后。因此,所有客户端都在源上看到相同的数据。

      在源发生故障的情况下,在源上提交的所有事务都已复制到副本(保存到其中继日志)。源意外退出和故障转移到副本是无损的,因为副本是最新的。但是请注意,在这种情况下不能重新启动源,必须将其丢弃,因为其二进制日志可能包含未提交的事务,这些事务在二进制日志恢复后外部化时会导致与副本发生冲突。

    • 使用AFTER_COMMIT,发出事务的客户端只有在服务器提交到存储引擎并收到副本确认后才会获得返回状态。在提交之后和副本确认之前,其他客户端可以在提交客户端之前看到提交的事务。

      如果出现问题导致副本无法处理事务,那么在源意外退出并故障转移到副本的情况下,此类客户端可能会看到与他们在源上看到的数据相关的数据丢失。

    此变量仅在安装源端半同步复制插件时可用。

    rpl_semi_sync_master_wait_point 在 MySQL 5.7.2 中添加。对于旧版本,半同步源行为等同于AFTER_COMMIT.

    此更改引入了版本兼容性约束,因为它增加了半同步接口版本:MySQL 5.7.2 及更高版本的服务器不能使用旧版本的半同步复制插件,旧版本的服务器也不能使用 MySQL 5.7.2 的半同步复制插件及以上。