文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制源选项和变量

19.1.6.2 复制源选项和变量

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

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

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

复制源服务器的启动选项

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

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

以下系统变量用于复制源服务器或由复制源服务器使用

  • auto_increment_increment

    命令行格式 --auto-increment-increment=#
    系统变量 auto_increment_increment
    范围 全局、会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 1
    最小值 1
    最大值 65535

    auto_increment_incrementauto_increment_offset 用于循环(源到源)复制,可用于控制 AUTO_INCREMENT 列的操作。这两个变量都有全局值和会话值,并且每个变量都可以取 1 到 65,535(包含)之间的整数值。将这两个变量中的任何一个的值设置为 0 会导致其值被设置为 1。尝试将这两个变量中的任何一个的值设置为大于 65,535 或小于 0 的整数会导致其值被设置为 65,535。尝试将 auto_increment_incrementauto_increment_offset 设置为非整数值会导致错误,并且变量的实际值保持不变。

    注意

    auto_increment_increment 也支持与 NDB 表一起使用。

    在服务器上启动组复制时,auto_increment_increment 的值将更改为 group_replication_auto_increment_increment 的值,默认值为 7,并且 auto_increment_offset 的值将更改为服务器 ID。当组复制停止时,这些更改将被恢复。只有当 auto_increment_incrementauto_increment_offset 每个都具有其默认值 1 时,才会进行这些更改和恢复。如果它们的值已经从默认值修改,组复制不会改变它们。当组复制处于单主模式(只有一个服务器写入)时,这些系统变量也不会被修改。

    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_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_incrementauto_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=#
    系统变量 auto_increment_offset
    范围 全局、会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 1
    最小值 1
    最大值 65535

    此变量的默认值为 1。如果保留其默认值,并且在服务器上以多主模式启动组复制,则它将更改为服务器 ID。有关更多信息,请参见 auto_increment_increment 的描述。

    注意

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

  • immediate_server_version

    系统变量 immediate_server_version
    范围 会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 999999
    最小值 0
    最大值 999999

    用于复制的内部使用。此会话系统变量保存复制拓扑中直接源服务器的 MySQL 服务器版本号(例如,MySQL 8.4.0 服务器实例为 80400)。如果此直接服务器的版本不支持此会话系统变量,则该变量的值将设置为 0 (UNKNOWN_SERVER_VERSION)。

    该变量的值从源服务器复制到从服务器。通过此信息,从服务器可以正确地处理来自较旧版本源服务器的数据,方法是识别在相关版本之间发生的语法更改或语义更改的位置,并适当处理这些更改。此信息也可用于组复制环境,其中复制组的一个或多个成员的版本比其他成员新。可以在每个事务的二进制日志中查看该变量的值(作为 Gtid_log_event 的一部分,如果服务器上没有使用 GTID,则为 Anonymous_gtid_log_event),这可能有助于调试跨版本复制问题。

    设置此系统变量的会话值是一个受限制的操作。会话用户必须具有 REPLICATION_APPLIER 权限(请参见 第 19.3.3 节,“复制权限检查”),或者具有设置受限会话变量的足够权限(请参见 第 7.1.9.1 节,“系统变量权限”)。但是,请注意,该变量并非供用户设置,它由复制基础设施自动设置。

  • original_server_version

    系统变量 original_server_version
    范围 会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 999999
    最小值 0
    最大值 999999

    用于复制的内部使用。此会话系统变量保存事务最初提交的服务器的 MySQL 服务器版本号(例如,MySQL 8.4.0 服务器实例为 80400)。如果此原始服务器的版本不支持此会话系统变量,则该变量的值将设置为 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

    命令行格式 --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=#
    系统变量 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_source_wait_for_replica_count 的弃用同义词。

  • 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

    命令行格式 --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 控制源服务器是否启用半同步复制。要启用或禁用插件,请将此变量分别设置为 ONOFF(或 1 或 0)。默认值为 OFF

  • rpl_semi_sync_source_timeout

    命令行格式 --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_count1,这意味着在收到单个复制服务器确认后,半同步复制将继续。此变量的值越小,性能越好。

    例如,如果 rpl_semi_sync_source_wait_for_replica_count2,则必须有 2 个复制服务器确认收到该事务,才能在由 rpl_semi_sync_source_timeout 配置的超时期限内执行半同步复制。如果在超时期限内,少于该数量的复制服务器确认收到事务,则源服务器将恢复为正常复制。

    注意

    此行为还取决于 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,发出事务的客户端仅在服务器提交到存储引擎并收到复制服务器确认后,才获得返回状态。在提交之后和收到复制服务器确认之前,其他客户端可以在提交客户端之前看到已提交的事务。

      如果出现问题,导致复制服务器无法处理事务,那么在源服务器意外退出并故障转移到复制服务器的情况下,这些客户端可能看到与他们在源服务器上看到的数据相比,数据丢失。