• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 复制主选项和变量

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

    在主服务器和每个从服务器上,必须设置server_id系统变量以建立唯一的复制ID。对于每个服务器,应选择一个介于1到2 32 − 1之间的唯一正整数,并且每个ID必须与其他复制主服务器或从属正在使用的每个其他ID不同。范例:server-id=3

    有关在主服务器上用于控制二进制日志记录的选项,请参见“二进制日志记录选项和变量”。

    复制母版的启动选项

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

    • --show-slave-auth-info

      属性
      命令行格式--show-slave-auth-info[={OFF|ON}]
      类型布尔型
      默认值OFF

      SHOW SLAVE HOSTS在主服务器的输出中,显示以--report-user--report-password选项开头的从属服务器的从属用户名和密码。

    复制主机上使用的系统变量

    以下系统变量用于复制原版或由复制原版使用:

    • auto_increment_increment

      属性
      命令行格式--auto-increment-increment=#
      系统变量auto_increment_increment
      范围Global, Session
      动态
      SET_VAR提示适用
      类型整数
      默认值1
      最低值1
      最大值65535

      auto_increment_incrementauto_increment_offset旨在用于主机到主复制的使用,并且可以用于控制其操作AUTO_INCREMENT的列。这两个变量都具有全局值和会话值,并且每个变量都可以采用1到65535(含)之间的整数值。将这两个变量之一的值设置为0会导致其值设置为1。尝试将这两个变量中的任何一个的值设置为大于65,535或小于0的整数会导致其值设置为65,535。尝试设置auto_increment_increment或的值auto_increment_offset非整数值产生错误,并且变量的实际值保持不变。

      注意

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

      从MySQL 8.0.18开始,设置此系统变量的会话值不再是受限制的操作。

      在服务器上启动组复制时,的值auto_increment_increment更改为的值group_replication_auto_increment_increment,默认为7,而的值auto_increment_offset更改为服务器ID。停止组复制时,将还原更改。仅当auto_increment_incrementauto_increment_offset每个更改的默认值均为1时,才进行并还原这些更改。如果已将其值从默认值进行了修改,则组复制不会更改它们。从MySQL 8.0开始,当组复制处于只有一个服务器写入的单主模式下时,系统变量也不会被修改。

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

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

      默认值为auto_increment_increment1。请参见“InnoDB中的AUTO_INCREMENT处理”。

    • auto_increment_offset

      属性
      命令行格式--auto-increment-offset=#
      系统变量auto_increment_offset
      范围Global, Session
      动态
      SET_VAR提示适用
      类型整数
      默认值1
      最低值1
      最大值65535

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

      注意

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

      从MySQL 8.0.18开始,设置此系统变量的会话值不再是受限制的操作。

    • immediate_server_version

      属性
      介绍了8.0.14
      系统变量immediate_server_version
      范围Session
      动态
      SET_VAR提示适用没有
      类型整数

      供复制内部使用。该会话系统变量保存服务器的MySQL服务器发行版号,该服务器是复制拓扑中的直接主服务器(例如,80014对于MySQL 8.0.14服务器实例)。如果此即时服务器的发行版不支持会话系统变量,则该变量的值将设置为0(UNKNOWN_SERVER_VERSION)。

      变量的值从主机复制到从机。通过识别这些信息,从属可以通过识别所涉及的版本之间在何处发生语法更改或语义更改并进行适当的处理,来正确处理来自较旧版本的主服务器的数据。该信息还可以在组复制环境中使用,在该环境中,复制组的一个或多个成员的版本比其他成员的版本高。可以在每个交易的二进制日志中参见变量的值(作为Gtid_log_event,或Anonymous_gtid_log_event(如果服务器上未使用GTID),则可能有助于调试跨版本复制问题。

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

    • original_server_version

      属性
      介绍了8.0.14
      系统变量original_server_version
      范围Session
      动态
      SET_VAR提示适用没有
      类型整数

      供复制内部使用。此会话系统变量保存最初提交事务的服务器的MySQL Server版本号(例如,80014对于MySQL 8.0.14服务器实例)。如果此原始服务器的发行版不支持会话系统变量,则该变量的值将设置为0(UNKNOWN_SERVER_VERSION)。请注意,当原始服务器设置发行版号时,如果复制拓扑中的直接服务器或任何其他中介服务器不支持会话系统变量,则该变量的值重置为0,因此不复制其值。

      变量的值的设置和使用方式与immediate_server_version系统变量相同。如果该变量的值与immediate_server_version系统变量的值相同,则仅将后者记录在二进制日志中,并指示原始服务器版本是相同的。

      在组复制环境中,参见更改日志事件(这些事件是新成员加入组时每个组成员排队的特殊事务)被标记为使该成员排队的服务器版本。这样可确保加入成员知道原始施主的服务器版本。因为排队等待特定视图更改的视图更改日志事件在所有成员上都具有相同的GTID,所以仅在这种情况下,同一GTID的实例可能具有不同的原始服务器版本。

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

    • rpl_semi_sync_master_enabled

      属性
      命令行格式--rpl-semi-sync-master-enabled[={OFF|ON}]
      系统变量rpl_semi_sync_master_enabled
      范围Global
      动态
      SET_VAR提示适用没有
      类型布尔型
      默认值OFF

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

      仅当安装了主端半同步复制插件时,此变量才可用。

    • rpl_semi_sync_master_timeout

      属性
      命令行格式--rpl-semi-sync-master-timeout=#
      系统变量rpl_semi_sync_master_timeout
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值10000

      以毫秒为单位的值,用于控制主服务器在超时并恢复为异步复制之前,等待提交等待从属服务器进行确认的时间。默认值为10000(10秒)。

      仅当安装了主端半同步复制插件时,此变量才可用。

    • rpl_semi_sync_master_trace_level

      属性
      命令行格式--rpl-semi-sync-master-trace-level=#
      系统变量rpl_semi_sync_master_trace_level
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值32

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

      • 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
      范围Global
      动态
      SET_VAR提示适用没有
      类型整数
      默认值1
      最低值1
      最大值65535

      主机在继续之前必须为每个事务接收的从机确认数。默认情况下rpl_semi_sync_master_wait_for_slave_count1,表示半同步复制在收到单个从属确认后继续进行。对于此变量的较小值,性能最佳。

      例如,如果rpl_semi_sync_master_wait_for_slave_count is为2,则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
      范围Global
      动态
      SET_VAR提示适用没有
      类型布尔型
      默认值ON

      控制主服务器是否等待由配置的超时周期rpl_semi_sync_master_timeout过期,即使从设备的计数下降到小于由超时配置的从设备数量rpl_semi_sync_master_wait_for_slave_count

      当的值rpl_semi_sync_master_wait_no_slaveON(默认值),则允许用于从属计数下降到小于rpl_semi_sync_master_wait_for_slave_count在超时期限内。只要有足够多的从服务器在超时期限到期之前确认该事务,半同步复制就会继续。

      当的值rpl_semi_sync_master_wait_no_slaveOFF,如果从计数降到比配置数量较少rpl_semi_sync_master_wait_for_slave_count期间由配置的超时时间段在任何时候rpl_semi_sync_master_timeout,主回复到正常的复制。

      仅当安装了主端半同步复制插件时,此变量才可用。

    • rpl_semi_sync_master_wait_point

      属性
      命令行格式--rpl-semi-sync-master-wait-point=value
      系统变量rpl_semi_sync_master_wait_point
      范围Global
      动态
      SET_VAR提示适用没有
      类型列举
      默认值AFTER_SYNC
      有效值

      AFTER_SYNC

      AFTER_COMMIT

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

      • AFTER_SYNC(默认值):主服务器将每个事务写入其二进制日志,而从服务器则将二进制日志同步到磁盘。同步后,主服务器等待从设备对交易收据的确认。收到确认后,主服务器将事务提交到存储引擎,并将结果返回给客户端,然后客户端可以继续进行。
      • AFTER_COMMIT:主服务器将每个事务写入其二进制日志,而从服务器将其同步到二进制日志,然后将事务提交到存储引擎。提交后,主机等待从机对交易收据的确认。接收到确认后,主机将结果返回给客户端,然后客户端可以继续进行。

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

      • 使用AFTER_SYNC,所有客户端可以同时看到已提交的事务:从属服务器确认了该事务并提交给了主服务器上的存储引擎之后。因此,所有客户端都可以在主服务器上看到相同的数据。

        如果主服务器发生故障,则在主服务器上提交的所有事务都将复制到从服务器(保存到其中继日志中)。由于从属服务器是最新的,因此主服务器崩溃和故障转移到从属服务器是无损的。但是请注意,在这种情况下不能重新启动主服务器,而必须将其丢弃,因为其二进制日志可能包含未提交的事务,这些事务在二进制日志恢复后被外部化时会与从服务器发生冲突。

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

        如果出现问题,导致从服务器无法处理事务,则在主服务器崩溃并故障转移到从服务器的情况下,此类客户端可能会看到相对于其在主服务器上看到的数据丢失的情况。

      仅当安装了主端半同步复制插件时,此变量才可用。

      rpl_semi_sync_master_wait_point在MySQL 5.7中添加了,从而创建了版本兼容性约束,因为它会增加半同步接口版本:MySQL 5.7及更高版本的服务器不适用于旧版本的半同步复制插件,旧版本的服务器也不适用于半同步复制插件。适用于MySQL 5.7及更高版本。