第17章复制

目录

17.1配置复制
17.1.1基于二进制日志文件位置的复制配置概述
17.1.2设置基于二进制日志文件位置的复制
17.1.3使用全局事务标识符进行复制
17.1.4 MySQL多源复制
17.1.5更改在线服务器上的复制模式
17.1.6复制和二进制日志记录选项和变量
17.1.7常见复制管理任务
17.2复制实施
17.2.1复制格式
17.2.2复制实施细节
17.2.3复制通道
17.2.4复制中继和状态日志
17.2.5服务器如何评估复制过滤规则
17.3复制解决方案
17.3.1使用复制备份
17.3.2处理复制从属的意外停止
17.3.3监控基于行的复制
17.3.4使用具有不同主存储引擎和从存储引擎的复制
17.3.5使用复制进行横向扩展
17.3.6将不同的数据库复制到不同的从属服务器
17.3.7提高复制性能
17.3.8故障转移期间切换主站
17.3.9设置复制以使用加密连接
17.3.10加密二进制日志文件和中继日志文件
17.3.11半同步复制
17.3.12延迟复制
17.4复制说明和提示
17.4.1复制功能和问题
17.4.2 MySQL版本之间的复制兼容性
17.4.3升级复制设置
17.4.4复制故障排除
17.4.5如何报告复制错误或问题

复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。 默认情况下,复制是异步的 从站不需要永久连接以接收来自主站的更新。 根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。

MySQL中复制的优点包括:

有关如何在此类方案中使用复制的信息,请参见 第17.3节“复制解决方案”

MySQL 8.0支持不同的复制方法。 传统方法基于从主机的二进制日志复制事件,并要求其中的日志文件和位置在主机和从机之间同步。 基于 全局事务标识符 (GTID) 的较新方法 是事务性的,因此不需要处理这些文件中的日志文件或位置,这极大地简化了许多常见的复制任务。 只要在主服务器上提交的所有事务也已应用于从服务器,使用GTID进行复制可确保主服务器和从服务器之间的一致性。 有关MySQL中基于GTID和GTID的复制的更多信息,请参见 第17.1.3节“使用全局事务标识符复制” 有关使用基于二进制日志文件位置的复制的信息,请参见 第17.1节“配置复制”

MySQL中的复制支持不同类型的同步。 原始类型的同步是单向异步复制,其中一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。 这与 作为NDB Cluster特征 同步 复制 形成对比 (参见 第22章, MySQL NDB Cluster 8.0 )。 在MySQL 8.0中,除了内置的异步复制之外,还支持半同步复制。 使用半同步复制,在返回执行事务的会话之前对主块执行提交,直到至少一个从服务器确认已接收并记录事务的事件为止; 看到 第17.3.11节“半同步复制” MySQL 8.0还支持延迟复制,使得从属服务器故意滞后于主服务器至少一段指定的时间; 请参见 第17.3.12节“延迟复制” 对于 需要 同步 复制的 方案 ,请使用NDB Cluster(请参阅 第22章, MySQL NDB Cluster 8.0 )。

有许多解决方案可用于在服务器之间设置复制,最佳使用方法取决于您使用的数据和引擎类型的存在。 有关可用选项的更多信息,请参见 第17.1.2节“设置基于二进制日志文件位置的复制”

有两种核心类型的复制格式:基于语句的复制(SBR),它复制整个SQL语句,以及基于行的复制(RBR),它仅复制已更改的行。 您还可以使用第三种混合复制(MBR)。 有关不同复制格式的更多信息,请参见 第17.2.1节“复制格式”

通过许多不同的选项和变量来控制复制。 有关更多信息,请参见 第17.1.6节“复制和二进制日志记录选项和变量”

您可以使用复制来解决许多不同的问题,包括性能,支持不同数据库的备份,以及作为缓解系统故障的更大解决方案的一部分。 有关如何解决这些问题的信息,请参见 第17.3节“复制解决方案”

有关如何在复制期间处理不同数据类型和语句的说明和提示,包括复制功能,版本兼容性,升级和潜在问题及其解决方案的详细信息,请参见 第17.4节“复制说明和提示” 有关MySQL Replication新手经常提出的一些问题的答案,请参见 第A.13节“MySQL 8.0 FAQ:复制”

有关复制实现,复制如何工作,二进制日志的过程和内容,后台线程以及用于决定如何记录和复制语句的规则的详细信息,请参见 第17.2节“复制实现”

17.1配置复制

本节介绍如何配置MySQL中可用的不同类型的复制,并包括复制环境所需的设置和配置,包括创建新复制环境的分步说明。 本节的主要组成部分是:

17.1.1基于二进制日志文件位置的复制配置概述

本节介绍基于二进制日志文件位置方法的MySQL服务器之间的复制,其中作为主服务器运行的MySQL实例(数据库源更改)将更新和更改作为 事件 写入 二进制日志。 二进制日志中的信息根据记录的数据库更改以不同的日志记录格式存储。 从站配置为从主站读取二进制日志,并在从站的本地数据库上执行二进制日志中的事件。

每个从站都会收到二进制日志的全部内容的副本。 从属设备负责决定应该执行二进制日志中的哪些语句。 除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。 如果需要,您可以将从站配置为仅处理适用于特定数据库或表的事件。

重要

您无法将主服务器配置为仅记录特定事件。

每个从站都会记录二进制日志坐标:文件名和文件中它从主站读取和处理的位置。 这意味着可以将多个从站连接到主站并执行同一二进制日志的不同部分。 由于从站控制此过程,因此可以在服务器上连接和断开各个从站,而不会影响主站的操作。 此外,由于每个从站都记录了二进制日志中的当前位置,因此可以断开从站的连接,重新连接然后恢复处理。

必须使用唯一ID配置主站和每个从站(使用该 server-id 选项)。 此外,必须为每个从站配置有关主主机名,日志文件名和该文件中位置的信息。 可以使用 CHANGE MASTER TO 从属语句在 MySQL会话中控制这些详细信息 详细信息存储在从属主信息存储库中(请参见 第17.2.4节“复制中继和状态日志” )。

17.1.2设置基于二进制日志文件位置的复制

本节介绍如何设置MySQL服务器以使用基于二进制日志文件位置的复制。 设置复制有许多不同的方法,确切的使用方法取决于您如何设置复制,以及您是否已在主数据库中拥有数据。

所有设置都有一些通用的通用任务:

  • 在主服务器上,您必须确保启用了二进制日志记录,并配置唯一的服务器ID。 这可能需要重新启动服务器。 请参见 第17.1.2.1节“设置复制主配置”

  • 在要连接到主服务器的每个从服务器上,必须配置唯一的服务器ID。 这可能需要重新启动服务器。 请参见 第17.1.2.2节“设置复制从站配置”

  • (可选)在读取二进制日志以进行复制时,为主服务器创建一个单独的用户,以便在与主服务器进行身份验 请参见 第17.1.2.3节“为复制创建用户”

  • 在创建数据快照或启动复制过程之前,您应该在主服务器上记录二进制日志中的当前位置。 配置从站时需要此信息,以便从站知道二进制日志中的哪个位置开始执行事件。 请参见 第17.1.2.4节“获取复制主二进制日志坐标”

  • 如果您已经拥有主服务器上的数据并希望使用它来同步从服务器,则需要创建数据快照以将数据复制到从服务器。 您使用的存储引擎会影响您创建快照的方式。 在使用时 MyISAM ,必须停止处理主服务器上的语句以获取读锁定,然后获取其当前的二进制日志坐标并转储其数据,然后才允许主服务器继续执行语句。 如果不停止执行语句,则数据转储和主状态信息将不匹配,从而导致从站上的数据库不一致或损坏。 有关复制 MyISAM 主服务器的 更多信息 ,请参阅 第17.1.2.4节“获取复制主二进制日志坐标” 如果您正在使用 InnoDB ,则不需要读锁定,并且足够长的事务来传输数据快照就足够了。 有关更多信息,请参见 第15.18节“InnoDB和MySQL复制”

  • 使用用于连接到主服务器的设置配置从服务器,例如主机名,登录凭据和二进制日志文件名和位置。 请参见 第17.1.2.7节“在从站上设置主站配置”

注意

设置过程中的某些步骤需要该 SUPER 权限。 如果您没有此权限,则可能无法启用复制。

配置基本选项后,选择您的方案:

在管理MySQL复制服务器之前,请阅读整章并尝试 第13.4.1节“用于控制主服务器的SQL语句” 第13.4.2节“用于控制从属服务器的SQL语句 ”中 提到的所有语句 还要熟悉 第17.1.6节“复制和二进制日志记录选项和变量”中 所述的复制启动选项

17.1.2.1设置复制主配置

要将主服务器配置为使用基于二进制日志文件位置的复制,必须确保启用二进制日志记录,并建立唯一的服务器ID。 如果尚未执行此操作,则需要重新启动服务器。

主服务器上需要二进制日志记录,因为二进制日志是将更改从主服务器复制到其从服务器的基础。 默认情况下启用二进制日志记录( log_bin 系统变量设置为ON)。 --log-bin 选项告诉服务器用于二进制日志文件的基本名称。 建议您指定此选项以为二进制日志文件提供非默认基本名称,以便在主机名更改时,您可以轻松地继续使用相同的二进制日志文件名(请参见 第B.4.7节“已知” MySQL中的问题“ )。

必须使用唯一的服务器ID配置复制拓扑中的每个服务器,您可以使用该 --server-id 选项 指定该服务器ID 此服务器标识用于标识复制拓扑中的各个服务器,并且必须是介于1和(2 32 )-1 之间的正整数 如果在主服务器上设置服务器ID为0,则拒绝来自从服务器的任何连接,如果在从服务器上设置服务器ID为0,则拒绝连接到主服务器。 除此之外,您可以选择如何组织和选择数字,只要每个服务器ID与复制拓扑中任何其他服务器使用的每个其他服务器ID不同即可。 server_id 系统变量默认设置为1。 可以使用此默认服务器ID启动服务器,但如果未明确指定服务器ID,则会发出信息性消息。

注意

以下选项也会对复制主机产生影响:

  • 为了在使用 InnoDB with transaction 的复制设置中实现最大的持久性和一致性 ,您应该 在复制主 文件中 使用 innodb_flush_log_at_trx_commit=1 sync_binlog=1 my.cnf

  • 确保 skip-networking 未在复制主机上启用 选项。 如果已禁用网络,则从属设备无法与主服务器通信,并且复制失败。

17.1.2.2配置复制从站配置

每个复制从站必须具有唯一的服务器ID。 如果尚未完成此操作,则从属设置的这一部分需要重新启动服务器。

如果尚未设置从属服务器ID,或者当前值与您为主服务器选择的值冲突,请关闭从属服务器并编辑 [mysqld] 配置文件 部分以指定唯一的服务器ID。 例如:

的[mysqld]
服务器ID = 2

进行更改后,重新启动服务器。

如果要设置多个从站,则每个从站必须具有唯一的非零 server-id 值,该值不同于主站和任何其他从站的 非零 值。

默认情况下,在所有服务器上启用二进制日志记录 从站不需要启用二进制日志记录以进行复制。 但是,从站上的二进制日志记录意味着从站的二进制日志可用于数据备份和崩溃恢复。

启用了二进制日志记录的从站也可以用作更复杂的复制拓扑的一部分。 例如,您可能希望使用此链式排列设置复制服务器:

A  - > B  - > C.

在这里, A 作为奴隶的主人 B ,并 B 作为奴隶的主人 C 为此, B 必须是主人 奴隶。 收到的更新 A 必须记录 B 到其二进制日志中,以便传递给 C 除二进制日志记录外,此复制拓扑还需要 --log-slave-updates 启用 选项。 使用此选项,从站将从主服务器接收并由从属SQL线程执行的更新写入从属自己的二进制日志。 --log-slave-updates 默认情况下启用 选项。

如果需要在从属服务器上禁用二进制日志记录或从属更新日志记录,则可以通过为从属服务器指定 --skip-log-bin --skip-log-slave-updates 选项 来执行此操作

17.1.2.3创建用于复制的用户

每个从站使用MySQL用户名和密码连接到主站,因此主站上必须有用户帐户,从站可以使用该帐户进行连接。 设置复制从站时 ,用户名由 命令 MASTER_USER 选项 指定 CHANGE MASTER TO 任何帐户都可以用于此操作,只要它已被授予 REPLICATION SLAVE 特权。 您可以选择为每个从站创建不同的帐户,也可以使用每个从站的相同帐户连接到主站。

虽然您不必专门为复制创建帐户,但您应该知道复制用户名和密码以纯文本形式存储在主信息存储库表中 mysql.slave_master_info (请参见 第17.2.4.2节“从属状态日志” )。 因此,您可能希望创建一个仅具有复制过程权限的单独帐户,以最大程度地降低对其他帐户的危害。

要创建新帐户,请使用 CREATE USER 要授予此帐户复制所需的权限,请使用该 GRANT 语句。 如果您仅为复制目的创建帐户,则该帐户仅需要该 REPLICATION SLAVE 权限。 例如,要设置 repl 可以从 example.com 域中的 任何主机连接进行复制 的新用户,请 在主服务器上发出以下语句:

mysql> 
mysql>CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

有关 操作用户帐户的语句的更多信息 请参见 第13.7.1节“帐户管理语句”

重要

要使用使用 caching_sha2_password 插件进行 身份验证的用户帐户连接到复制主 服务器,必须按 第17.3.9节“设置复制以使用加密连接”中 所述设置安全连接 ,或启用未加密连接以支持密码使用RSA密钥对进行交换。 caching_sha2_password 认证插件是从MySQL 8.0中创建新用户的默认(详见 第6.4.1.3,“缓存SHA-2插入式验证” )。 如果您创建或用于复制的用户帐户(由 MASTER_USER 选项)使用此身份验证插件,并且您没有使用安全连接,必须启用基于RSA密钥对的密码交换才能成功连接。

17.1.2.4获取Replication Master二进制日志坐标

要将从站配置为在正确的位置启动复制过程,您需要在其二进制日志中记下主站的当前坐标。

警告

此过程使用 FLUSH TABLES WITH READ LOCK ,它阻止 表的 COMMIT 操作 InnoDB

如果您计划关闭主服务器以创建数据快照,则可以选择跳过此过程,而是存储二进制日志索引文件的副本以及数据快照。 在这种情况下,主服务器会在重新启动时创建新的二进制日志文件。 因此,从属服务器必须启动复制过程的主二进制日志坐标是该新文件的开始,该文件是在复制的二进制日志索引文件中列出的文件之后的主服务器上的下一个二进制日志文件。

要获取主二进制日志坐标,请按照下列步骤操作:

  1. 通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下 FLUSH TABLES WITH READ LOCK 语句 来刷新所有表和阻止写 语句:

    MySQL的> FLUSH TABLES WITH READ LOCK;
    
    警告

    让发出 FLUSH TABLES 语句 的客户端保持 运行状态,以使读锁定保持有效。 如果退出客户端,则会释放锁定。

  2. 在master上的不同会话中,使用该 SHOW MASTER STATUS 语句确定当前二进制日志文件的名称和位置:

    mysql> SHOW MASTER STATUS;
    + ------------------ + ---------- + -------------- + ---- -------------- +
    | 档案| 职位| Binlog_Do_DB | Binlog_Ignore_DB |
    + ------------------ + ---------- + -------------- + ---- -------------- +
    | mysql-bin.000003 | 73 | 测试| manual,mysql |
    + ------------------ + ---------- + -------------- + ---- -------------- +
    

    File 列显示日志文件的名称,列显示文件 Position 中的位置。 在此示例中,二进制日志文件是 mysql-bin.000003 ,位置为73.记录这些值。 您在以后设置奴隶时需要它们。 它们表示从属服务器应从主服务器开始处理新更新的复制坐标。

    如果主服务器先前已禁用二进制日志记录,则由 mysqldump SHOW MASTER STATUS master-data 显示的日志文件名和位置值 将为空。 在这种情况下,稍后在指定从属日志文件和位置时需要使用的值是空字符串( '' )和 4

现在,您可以获得所需的信息,以使从服务器能够从正确的位置开始读取二进制日志以开始复制。

下一步取决于您是否在主服务器上有现有数据。 选择以下选项之一:

17.1.2.5选择数据快照的方法

如果主数据库包含现有数据,则必须将此数据复制到每个从站。 有多种方法可以从master数据库转储数据。 以下部分描述了可能的选项。

要选择转储数据库的适当方法,请在以下选项之间进行选择:

  • 使用 mysqldump 工具创建要复制的所有数据库的转储。 这是推荐的方法,尤其是在使用时 InnoDB

  • 如果数据库存储在二进制可移植文件中,则可以将原始数据文件复制到从属数据库。 这比使用 mysqldump 并在每个slave上导入文件 更有效 ,因为它会 INSERT 在重放语句 时跳过更新索引的开销 InnoDB 不建议使用 此类存储引擎

17.1.2.5.1使用mysqldump创建数据快照

要在现有主数据库中创建数据的快照,请使用 mysqldump 工具。 完成数据转储后,在开始复制过程之前将此数据导入从属服务器。

以下示例将所有数据库转储到名为的文件 dbdump.db ,并包含一个 --master-data 选项, 选项会自动附加 CHANGE MASTER TO 从属服务器上所需 语句以启动复制过程:

外壳> mysqldump --all-databases --master-data > dbdump.db
注意

如果不使用 --master-data ,则需要手动锁定单独会话中的所有表。 请参见 第17.1.2.4节“获取复制主二进制日志坐标”

可以使用 mysqldump 工具 从转储中排除某些数据库 如果要选择要包含在转储中的数据库,请不要使用 --all-databases 选择以下选项之一:

  • 使用 --ignore-table 选项 排除数据库中的所有表

  • 仅命名要使用该 --databases 选项 转储的数据库

有关更多信息,请参见 第4.5.4节“ mysqldump - 数据库备份程序”

要导入数据,请将转储文件复制到从站,或者在远程连接到从站时从主站访问该文件。

17.1.2.5.2使用原始数据文件创建数据快照

本节介绍如何使用组成数据库的原始文件创建数据快照。 将此方法与使用具有复杂缓存或记录算法的存储引擎的表一起使用需要额外的步骤来生成完美的 时间点 快照:初始复制命令可能会遗漏缓存信息并记录更新,即使您已获得了全局读锁。 存储引擎如何响应这取决于其崩溃恢复能力。

如果使用 InnoDB 表,则可以使用 MySQL Enterprise Backup组件中 mysqlbackup 命令生成一致的快照。 此命令记录与从站上使用的快照对应的日志名称和偏移量。 MySQL Enterprise Backup是一种商业产品,作为MySQL Enterprise订阅的一部分包含在内。 有关 详细信息 请参见 第30.2节“MySQL Enterprise备份概述”

这种方法还不能可靠地工作,如果主机和从机有不同的价值观 ft_stopword_file ft_min_word_len 或者 ft_max_word_len 你是具有全文索引复制表。

假设上述异常不适用于您的数据库,请使用 冷备份 技术获取 InnoDB 的可靠二进制快照 :执行 MySQL服务器 慢速关闭 ,然后手动复制数据文件。

MyISAM 在单个文件系统上存在MySQL数据文件时 创建 的原始数据快照 ,可以使用标准文件复制工具(如 cp copy) ,远程复制工具(如 scp rsync) ,归档工具(如 zip tar ,或 转储 等文件系统快照工具 如果仅复制某些数据库,请仅复制与这些表相关的文件。 对于 InnoDB ,所有数据库中的所有表都存储在 系统表空间中 文件,除非您 innodb_file_per_table 启用 了该 选项。

复制不需要以下文件:

  • mysql 数据库 相关的 文件。

  • 主信息存储库文件 master.info (如果使用); 现在不推荐使用此文件(请参见 第17.2.4节“复制中继和状态日志” )。

  • 主服务器的二进制日志文件,但二进制日志索引文件除外,如果您要使用它来定位从服务器的主二进制日志坐标。

  • 任何中继日志文件。

根据您是否使用 InnoDB 表,请选择以下选项之一:

如果您正在使用 InnoDB 表,并且还要使用原始数据快照获得最一致的结果,请在此过程中关闭主服务器,如下所示:

  1. 获取读锁定并获取主控状态。 请参见 第17.1.2.4节“获取复制主二进制日志坐标”

  2. 在单独的会话中,关闭主服务器:

    外壳> mysqladmin shutdown
    
  3. 制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 您只需要选择其中一个:

    shell> 
    shell> 
    shell>tar cf /tmp/db.tar ./datazip -r /tmp/db.zip ./datarsync --recursive ./data /tmp/dbdata
    
  4. 重新启动主服务器。

如果您不使用 InnoDB 表,则可以从主服务器获取系统的快照,而无需按照以下步骤中所述关闭服务器:

  1. 获取读锁定并获取主控状态。 请参见 第17.1.2.4节“获取复制主二进制日志坐标”

  2. 制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 您只需要选择其中一个:

    shell> 
    shell> 
    shell>tar cf /tmp/db.tar ./datazip -r /tmp/db.zip ./datarsync --recursive ./data /tmp/dbdata
    
  3. 在获取读锁定的客户端中,释放锁定:

    MySQL的> UNLOCK TABLES;
    

创建数据库的存档或副本后,在启动从属复制过程之前将文件复制到每个从属服务器。

17.1.2.6设置复制从站

以下部分描述了如何设置从站。 在继续之前,请确保您拥有:

接下来的步骤取决于您是否有现有数据导入到从属设备。 有关 更多信息 请参见 第17.1.2.5节“为数据快照选择方法” 选择以下之一:

17.1.2.6.1使用新主服务器和从服务器设置复制

如果没有要导入的先前数据库的快照,请配置从属服务器以从新主服务器启动复制。

要在主服务器和新服务器之间设置复制:

  1. 启动MySQL slave。

  2. 执行 CHANGE MASTER TO 语句以设置主复制服务器配置。 请参见 第17.1.2.7节“在从站上设置主站配置”

在每个从站上执行这些从站设置步骤。

如果要设置新服务器但是要从要加载到复制配置中的其他服务器中转储现有数据库,也可以使用此方法。 通过将数据加载到新主服务器中,数据将自动复制到从服务器。

如果要使用来自其他现有数据库服务器的数据设置新的复制环境以创建新主服务器,请在新主服务器上运行从该服务器生成的转储文件。 数据库更新会自动传播到从属服务器:

外壳> mysql -h master < fulldb.dump
17.1.2.6.2使用现有数据设置复制

使用现有数据设置复制时,请在开始复制之前将快照从主服务器传输到从服务器。 将数据导入从站的过程取决于您在主站上创建数据快照的方式。

选择以下之一:

如果你使用 mysqldump

  1. 使用该 --skip-slave-start 选项 启动从站, 以便不启动复制。

  2. 导入转储文件:

    外壳> mysql < fulldb.dump
    

如果使用原始数据文件创建了快照:

  1. 将数据文件解压缩到从属数据目录中。 例如:

    外壳> tar xvf dbdump.tar
    

    您可能需要设置文件的权限和所有权,以便从服务器可以访问和修改它们。

  2. 使用该 --skip-slave-start 选项 启动从站, 以便不启动复制。

  3. 使用主服务器的复制坐标配置从服务器。 这告诉从服务器二进制日志文件和复制需要启动的文件中的位置。 此外,使用主服务器的登录凭据和主机名配置从服务器。 有关 CHANGE MASTER TO 所需语句的 更多信息 ,请参见 第17.1.2.7节“在从站上设置主站配置”

  4. 启动从属线程:

    MySQL的> START SLAVE;
    

执行此过程后,从属设备将连接到主服务器,并复制自拍摄快照以来主服务器上发生的所有更新。 如果由于任何原因无法复制,则会向从属的错误日志发出错误消息。

从站使用记录在其主信息日志和中继日志信息日志中的信息来跟踪它已处理的主站二进制日志的数量。 从MySQL 8.0,默认情况下,这些奴隶状态日志存储库是命名表 slave_master_info ,并 slave_relay_log_info mysql 数据库中。 替代设置 --master-info-repository=FILE 以及 --relay-log-info-repository=FILE 存储库是命名文件 master.info relay-log.info 数据目录 中的文件 现在已弃用,将在以后的版本中删除。

不要 删除或修改这些表(或文件,如果使用的话),除非你知道自己在做什么并完全理解的含义。 即使在这种情况下,也最好使用该 CHANGE MASTER TO 语句来更改复制参数。 从站使用语句中指定的值自动更新从站状态日志。 有关 更多信息 请参见 第17.2.4节“复制中继和状态日志”

注意

主信息日志的内容会覆盖命令行或中指定的某些服务器选项 my.cnf 有关 更多详细信息 请参见 第17.1.6节“复制和二进制日志记录选项和变量”

主站的单个快照足以满足多个从站的需要。 要设置其他从站,请使用相同的主快照,并按照上述过程的从属部分进行操作。

17.1.2.7在从设备上设置主配置

要将从站设置为与主站通信以进行复制,请使用必要的连接信息配置从站。 为此,请在从站上执行以下语句,将选项值替换为与系统相关的实际值:

mysql> CHANGE MASTER TO
    - >      
    - >      
    - >      
    - >      
    - >     MASTER_HOST='master_host_name',MASTER_USER='replication_user_name',MASTER_PASSWORD='replication_password',MASTER_LOG_FILE='recorded_log_file_name',MASTER_LOG_POS=recorded_log_position;
注意

复制不能使用Unix套接字文件。 您必须能够使用TCP / IP连接到主MySQL服务器。

CHANGE MASTER TO 声明还有其他选择。 例如,可以使用SSL设置安全复制。 有关选项的完整列表以及有关字符串值选项的最大允许长度的信息,请参见 第13.4.2.1节“将语法更改为语法”

重要

第17.1.2.3节“为复制创建用户”中所述 ,如果未使用安全连接且 MASTER_USER 选项中 指定的用户帐户 使用 caching_sha2_password 插件进行 身份验证 (默认情况下为MySQL 8.0),则必须指定 MASTER_PUBLIC_KEY_PATH GET_MASTER_PUBLIC_KEY 选项在 CHANGE MASTER TO 语句中启用基于RSA密钥对的密码交换。

17.1.2.8将从站添加到复制环境

您可以将另一个从站添加到现有复制配置,而无需停止主站。 为此,您可以通过复制现有从站的数据目录并为新从站提供不同的服务器ID(由用户指定)和服务器UUID(在启动时生成)来设置新从站。

要复制现有的从属:

  1. 停止现有从站并记录从站状态信息,尤其是主二进制日志文件和中继日志文件位置。 您可以在性能架构复制表中查看从站状态(请参见 第26.12.11节“性能架构复制表” ),或者按以下方式发出 SHOW SLAVE STATUS 以下命令:

    mysql> STOP SLAVE;
    mysql>SHOW SLAVE STATUS\G
    
  2. 关闭现有的奴隶:

    外壳> mysqladmin shutdown
    
  3. 将数据目录从现有从站复制到新从站,包括日志文件和中继日志文件。 您可以通过创建归档做到这一点 焦油 WinZip ,或通过使用工具,如进行直接复制 的cp rsync的

    重要
    • 在复制之前,请验证与现有从站相关的所有文件是否实际存储在数据目录中。 例如, InnoDB 系统表空间,撤消表空间和重做日志可能存储在备用位置。 InnoDB 表空间文件和每表文件表空间可能已在其他目录中创建。 从站的二进制日志和中继日志可能位于数据目录之外的自己的目录中。 检查为现有从站设置的系统变量,并查找已指定的任何备用路径。 如果找到任何内容,请同时复制这些目录。

    • 在复制期间,如果文件已用于主信息和中继日志信息存储库(请参见 第17.2.4节“复制中继和状态日志” ),请确保还将这些文件从现有从属文件复制到新从属文件。 如果表已用于存储库(默认情况下是MySQL 8.0),则表位于数据目录中。

    • 复制后, auto.cnf 从新从属服务器上的数据目录副本中 删除该 文件,以便使用不同的生成服务器UUID启动新从属服务器。 服务器UUID必须是唯一的。

    添加新复制从属设备时遇到的一个常见问题是新的从属服务器失败并出现一系列警告和错误消息,如下所示:

    071118 16:44:10 [警告]没有使用--relay-log和--relay-log-index; 所以
    当此MySQL服务器充当从属服务器并具有其主机名时,复制可能会中断
    变!请使用'--relay-log = new_slave_hostname-relay-bin'来避免此问题。
    071118 16:44:10 [错误]无法打开中继日志'./ old_slave_hostname-relay-bin.003525'
    (relay_log_pos 22940879) 
    071118 16:44:10 [错误]在中继日志初始化期间找不到目标日志 
    071118 16:44:10 [错误]无法初始化主信息结构
    

    如果 --relay-log 未指定选项, 则会出现这种情况 ,因为中继日志文件包含主机名作为其文件名的一部分。 如果 --relay-log-index 未使用 选项 ,则中继日志索引文件也是如此 有关这些选项的更多信息 请参见 第17.1.6节“复制和二进制日志记录选项和变量”

    要避免此问题,请 --relay-log 在现有从站上使用的新从站上 使用相同的值 如果未在现有从站上明确设置此选项,请使用 existing_slave_hostname-relay-bin 如果无法做到这一点,请将现有从站的中继日志索引文件复制到新从站,并在新从站上设置 --relay-log-index 选项以匹配现有从站上使用 选项。 如果未在现有从站上明确设置此选项,请使用 existing_slave_hostname-relay-bin.index 或者,如果您已按照本节中的其余步骤尝试启动新从站并遇到前面描述的错误,请执行以下步骤:

    1. 如果您还没有这样做,请 STOP SLAVE 在新的奴隶上发布。

      如果您已经再次启动现有从站,也可以在现有从站上发出 STOP SLAVE

    2. 将现有slave的中继日志索引文件的内容复制到新slave的中继日志索引文件中,确保覆盖该文件中已有的任何内容。

    3. 继续本节中的其余步骤。

  4. 复制完成后,重新启动现有从站。

  5. 在新从站上,编辑组态并为新从站提供唯一的服务器ID(使用该 server-id 选项),主服务器或任何现有从站未 使用该服务器ID

  6. 启动新的从属服务器,指定该 --skip-slave-start 选项,以便尚未启动复制。 SHOW SLAVE STATUS 与现有从站相比, 使用性能架构复制表或问题 确认新从站具有正确的设置。 还显示服务器ID和服务器UUID,并验证这些对于新从站是否正确且唯一。

  7. 通过发出 START SLAVE 语句 启动从属线程

    MySQL的> START SLAVE;

    新的slave现在使用其主信息库中的信息来启动复制过程。

17.1.3使用全局事务标识符进行复制

本节介绍使用 全局事务标识符 的基于事务的复制 (GTIDs)。 使用GTID时,可以在原始服务器上提交并由任何从属应用时识别和跟踪每个事务; 这意味着在启动新从站或故障转移到新主站时使用GTID来引用日志文件或这些文件中的位置是不必要的,这极大地简化了这些任务。 由于基于GTID的复制完全基于事务,因此很容易确定主服务器和从服务器是否一致; 只要在主服务器上提交的所有事务也在从服务器上提交,两者之间的一致性就得到保证。 您可以使用基于语句或基于行的复制与GTID(请参见 第17.2.1节“复制格式”) ); 但是,为了获得最佳效果,我们建议您使用基于行的格式。

GTID始终保留在主站和从站之间。 这意味着您始终可以通过检查其二进制日志来确定应用于任何从站的任何事务的源。 此外,一旦在给定服务器上提交具有给定GTID的事务,则该服务器将忽略具有相同GTID的任何后续事务。 因此,在主服务器上提交的事务可以在从服务器上应用不超过一次,这有助于保证一致性。

本节讨论以下主题:

有关MySQL服务器选项和与基于GTID的复制相关的变量的信息,请参见 第17.1.6.5节“全局事务ID选项和变量” 另请参见 第12.18节“与全局事务标识符(GTID) 一起使用的函数 ,其中描述了MySQL 8.0支持的与GTID一起使用的SQL函数。

17.1.3.1 GTID格式和存储

全局事务标识符(GTID)是创建的唯一标识符,并与在源服务器(主服务器)上提交的每个事务相关联。 此标识符不仅对其发起的服务器是唯一的,而且在给定复制拓扑中的所有服务器上都是唯一的。

GTID分配区分在主服务器上提交的客户端事务和在从服务器上复制的复制事务。 在主服务器上提交客户端事务时,如果事务已写入二进制日志,则会为其分配新的GTID。 保证客户交易具有单调增加的GTID,而生成的数字之间没有间隙。 如果未将客户端事务写入二进制日志(例如,因为事务已被过滤掉,或者事务是只读的),则不会在源服务器上为其分配GTID。

复制的事务保留与分配给源服务器上的事务相同的GTID。 GTID在复制事务开始执行之前存在,并且即使复制的事务未写入从服务器上的二进制日志,或者在从服务器上过滤掉,也会持久存在。 MySQL系统表 mysql.gtid_executed 用于保存MySQL服务器上应用的所有事务的已分配GTID,但存储在当前活动的二进制日志文件中的事务除外。

GTID的自动跳过功能意味着在主服务器上提交的事务可以在从服务器上应用不超过一次,这有助于保证一致性。 一旦在给定服务器上提交了具有给定GTID的事务,则该服务器将忽略使用相同GTID执行后续事务的任何尝试。 不会引发错误,并且不会执行事务中的语句。

如果具有给定GTID的事务已开始在服务器上执行但尚未提交或回滚,则任何在具有相同GTID的服务器上启动并发事务的尝试都将被阻止。 服务器既不开始执行并发事务也不将控制权返回给客户端。 一旦第一次尝试事务提交或回滚,就可以继续在同一GTID上阻塞的并发会话。 如果第一次尝试回滚,则一个并发会话继续尝试该事务,并且在同一GTID上阻塞的任何其他并发会话仍然被阻止。 如果第一次尝试提交,则所有并发会话都将被阻止,并自动跳过事务的所有语句。

GTID表示为一对坐标,用冒号字符( : 分隔 ,如下所示:

GTID = source_idtransaction_id

source_id 标识的源服务器。 通常,主人 server_uuid 用于此目的。 transaction_id 是一个序列号,由在主服务器上提交事务的顺序确定。 例如,要提交的第一个事务具有 1 transaction_id ,并且被分配一个相同的始发服务器上被提交第十交易 transaction_id 10 事务不可能 0 在GTID中具有序列号。 例如,最初在具有UUID的服务器上提交的第二十三个事务 3E11FA47-71CA-11E1-9E33-C80AA9429562 具有以下GTID:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

事务的GTID显示在 mysqlbinlog 的输出中 ,例如,它用于标识性能模式复制状态表中的单个事务 replication_applier_status_by_worker gtid_next 系统变量( @@GLOBAL.gtid_next 存储的值 是单个GTID。

GTID集

GTID集合是包括一个或多个单个GTID或GTID范围的集合。 GTID集以多种方式用于MySQL服务器。 例如,由 系统变量 gtid_executed gtid_purged 系统变量 存储的值 是GTID集。 START SLAVE 条款 UNTIL SQL_BEFORE_GTIDS UNTIL SQL_AFTER_GTIDS 可以用来做一个奴隶交易过程最多只在GTID组第一GTID,或在GTID集中的最后GTID后停止。 内置函数 GTID_SUBSET() GTID_SUBTRACT() 要求GTID集作为输入。

源自同一服务器的一系列GTID可以折叠为单个表达式,如下所示:

3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

上面的例子表示第一至始发MySQL服务器,其上第五交易 server_uuid 3E11FA47-71CA-11E1-9E33-C80AA9429562 源自同一服务器的多个单GTID或GTID范围也可以包含在单个表达式中,GTID或范围由冒号分隔,如下例所示:

3E11FA47-71CA-11E1-9E33-C80AA9429562:1-3:11:47-49

GTID集可以包括单个GTID和GTID范围的任意组合,并且它可以包括源自不同服务器的GTID。 此示例显示存储在 已从多个主服务器应用事务的从服务器 gtid_executed 系统变量( @@GLOBAL.gtid_executed )中 的GTID集

2174B383-5441-11E8-B90A-C80AA9429562:1-3,24DA167-0C0C-11E8-8442-00059A3C7B00:1-19

当从服务器变量返回GTID集时,UUID按字母顺序排列,并且数值间隔按升序合并。

GTID集的语法如下:

gtid_setuuid_set[,uuid_set] ......
    | “”

uuid_setuuidinterval[:interval] ...

uuidhhhhhhhh- hhhh- hhhh- hhhh-hhhhhhhhhhhh

h
    [0-9 | AF]

intervaln[ - n]
n> = 1)
mysql.gtid_executed表

GTID存储在 数据库 中名为的表 gtid_executed mysql 对于它表示的每个GTID或GTID集合,该表中的一行包含始发服务器的UUID,以及该集合的起始和结束事务ID; 对于仅引用单个GTID的行,这两个最后两个值是相同的。

mysql.gtid_executed 创建表(如果它不存在),当MySQL服务器安装或升级,采用了 CREATE TABLE 如下所示类似的语句:

CREATE TABLE gtid_executed(
    source_uuid CHAR(36)NOT NULL,
    interval_start BIGINT(20)NOT NULL,
    interval_end BIGINT(20)NOT NULL,                                                                                                                                                                                  
    PRIMARY KEY(source_uuid,interval_start)
警告

与其他MySQL系统表一样,请勿尝试自行创建或修改此表。

mysql.gtid_executed 表供MySQL服务器内部使用。 它允许从设备在从设备上禁用二进制日志记录时使用GTID,并且当二进制日志丢失时,它允许保留GTID状态。 mysql.gtid_executed 表重置为 RESET MASTER

GTIDs存储在 mysql.gtid_executed 表中,只有当 gtid_mode ON ON_PERMISSIVE 存储GTID的点取决于是启用还是禁用二进制日志记录:

  • 如果禁用( log_bin is OFF 二进制日志记录 ,或者 禁用了二进制日志记录 log_slave_updates ,则服务器将属于每个事务的GTID与表中的事务一起存储。 此外,该表以用户可配置的速率定期压缩; 有关详细信息, 请参阅 mysql.gtid_executed表压缩 此情况仅适用于禁用二进制日志记录或从站更新日志记录的复制从站。 它不适用于复制主机,因为在主机上,必须启用二进制日志记录才能进行复制。

  • 如果启用了二进制日志记录( log_bin ON ),则无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志的所有事务的GTID写入 mysql.gtid_executed 表中。 这种情况适用于复制主服务器或启用了二进制日志记录的复制从服务器。

    如果服务器意外停止,则当前二进制日志文件中的GTID集不会保存在 mysql.gtid_executed 表中。 在恢复期间,这些GTID将从二进制日志文件添加到表中。 例外情况是,如果在重新启动服务器时禁用二进制日志记录(使用 --skip-log-bin --disable-log-bin )。 在这种情况下,服务器无法访问二进制日志文件以恢复GTID,因此无法启动复制。

    启用二进制日志记录后,该 mysql.gtid_executed 表不会保存所有已执行事务的GTID的完整记录。 该信息由 gtid_executed 系统变量 的全局值提供 始终使用 @@GLOBAL.gtid_executed ,在每次提交后更新,以表示MySQL服务器的GTID状态,并且不查询 mysql.gtid_executed 表。

mysql.gtid_executed 即使服务器处于只读模式或超级只读模式, MySQL服务器也可以写入 表,这样二进制日志文件仍然可以在这些模式下旋转。 如果 mysql.gtid_executed 无法访问表以进行写入,并且由于除了达到最大文件大小( max_binlog_size 之外的任何原因而旋转 二进制日志文件,则继续使用当前二进制日志文件。 将错误消息返回给请求轮换的客户端,并在服务器上记录警告。 如果 mysql.gtid_executed 无法访问表并进行写入 max_binlog_size ,则服务器将根据其 binlog_error_action 设置进行 响应 如果 IGNORE_ERROR 如果设置,则在服务器上记录错误并停止二进制日志记录,或者如果 ABORT_SERVER 设置,则服务器将关闭。

mysql.gtid_executed表压缩

随着时间的推移, mysql.gtid_executed 表可以填充许多行,这些行指的是源自同一服务器的各个GTID,其事务ID构成一个范围,类似于此处所示:

+ -------------------------------------- + ---------- ------ + -------------- +
| source_uuid | interval_start | interval_end |
| -------------------------------------- + ---------- ------ + -------------- |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 37 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 38 | 38 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 39 | 39 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 40 | 40 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 41 | 41 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 42 | 42 |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 43 | 43 |
...

为了节省空间,MySQL服务器 mysql.gtid_executed 通过将每个这样的行集替换为跨越整个事务标识符间隔的行来定期 压缩 表,如下所示:

+ -------------------------------------- + ---------- ------ + -------------- +
| source_uuid | interval_start | interval_end |
| -------------------------------------- + ---------- ------ + -------------- |
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 43 |
...

您可以通过设置 gtid_executed_compression_period 系统变量 来控制压缩表之前允许的事务数,从而控制压缩率 此变量的默认值为1000,这意味着默认情况下,在每1000次事务之后执行表的压缩。 设置 gtid_executed_compression_period 为0可以防止执行压缩,如果执行此操作,您应该为 gtid_executed 可能需要的磁盘空间量的大幅增加做好准备

注意

当启用二进制日志,价值 gtid_executed_compression_period 使用和 mysql.gtid_executed 表上的每个二进制日志旋转压缩。

mysql.gtid_executed 表的 压缩 由名为的专用前台线程执行 thread/sql/compress_gtid_table 此线程未在输出中列出 SHOW PROCESSLIST ,但可以将其视为 threads 表中 的一行 ,如下所示:

MySQL的> SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G
*************************** 1。排******************** *******
          THREAD_ID:26
               名称:thread / sql / compress_gtid_table
               类型:FOREGROUND
     PROCESSLIST_ID:1
   PROCESSLIST_USER:NULL
   PROCESSLIST_HOST:NULL
     PROCESSLIST_DB:NULL
PROCESSLIST_COMMAND:守护进程
   PROCESSLIST_TIME:1509
  PROCESSLIST_STATE:暂停
   PROCESSLIST_INFO:NULL
   PARENT_THREAD_ID:1
               角色:空
       仪表:是的
            历史:是的
    CONNECTION_TYPE:NULL
       THREAD_OS_ID:18677

thread/sql/compress_gtid_table 螺纹通常休眠,直到 gtid_executed_compression_period 交易已经被执行,那么唤醒到的执行压缩 mysql.gtid_executed 如前所述表。 然后它休眠直到另一个 gtid_executed_compression_period 事务发生,然后唤醒再次执行压缩,无限期地重复此循环。 禁用二进制日志记录时将此值设置为0意味着线程始终处于休眠状态且从不唤醒。

17.1.3.2 GTID生命周期

GTID的生命周期包括以下步骤:

  1. 事务在主服务器上执行并提交。 此客户端事务被分配一个GTID,该GTID由主服务器的UUID和此服务器上尚未使用的最小非零事务序列号组成。 GTID被写入主服务器的二进制日志(紧接在日志中的事务本身之前)。 如果未将客户端事务写入二进制日志(例如,因为事务已被过滤掉,或者事务是只读的),则不会为其分配GTID。

  2. 如果为事务分配了GTID,则通过在事务开始时将其写入二进制日志(作为a Gtid_log_event ,GTID在提交时保持原子性 无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志文件的所有事务的GTID写入 mysql.gtid_executed 表中。

  3. 如果为事务分配了GTID,则通过将GTID添加到 gtid_executed 系统变量( @@GLOBAL.gtid_executed )中 的GTID集合,非原子化(在事务提交后不久)外部化 此GTID集包含所有已提交的GTID事务集的表示形式,并在复制中用作表示服务器状态的标记。 启用二进制日志记录(根据主服务器的要求), gtid_executed 系统变量中 的GTID集 是应用事务的完整记录,但 mysql.gtid_executed 表不是,因为最新的历史记录仍在当前的二进制日志文件中。

  4. 在将二进制日志数据传输到从站并存储在从站的中继日志中之后(使用已建立的此过程机制,请参见 第17.2节“复制实现” ,详细信息),从站读取GTID并设置其 gtid_next 系统 的值 变量作为这个GTID。 这告诉从服务器必须使用此GTID记录下一个事务。 重要的是要注意从属设置 gtid_next 在会话上下文中。

  5. 从站验证没有线程已经获得GTID的所有权 gtid_next 以便处理该事务。 通过首先读取和检查复制事务的GTID,在处理事务本身之前,从设备不仅保证在从设备上没有应用具有此GTID的先前事务,而且还保证没有其他会话已经读取此GTID但尚未提交了相关的交易。 因此,如果多个客户端尝试同时应用同一事务,则服务器只允许其中一个执行,从而解决此问题。 gtid_owned 系统变量( @@GLOBAL.gtid_owned )对于slave,显示当前正在使用的每个GTID以及拥有它的线程的ID。 如果已经使用了GTID,则不会引发错误,并且使用自动跳过功能来忽略该事务。

  6. 如果尚未使用GTID,则从属应用复制的事务。 因为 gtid_next 设置为主设备已分配的GTID,所以从设备不会尝试为此事务生成新的GTID,而是使用存储在其中的GTID gtid_next

  7. 如果在从属设备上启用了二进制日志记录,则GTID会在事务开始时将其写入二进制日志(作为a Gtid_log_event ), 在提交时保持原子状态 无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志文件的所有事务的GTID写入 mysql.gtid_executed 表中。

  8. 如果在从站上禁用二进制日志记录,则通过将GTID直接写入 mysql.gtid_executed 表中来 原子性地保留GTID MySQL在事务中附加一条语句,将GTID插入表中。 从MySQL 8.0开始,此操作对于DDL语句和DML语句都是原子操作。 在这种情况下,该 mysql.gtid_executed 表是从站上应用的事务的完整记录。

  9. 在从属设备上提交复制事务后不久,GTID通过将其添加到 gtid_executed 系统变量( @@GLOBAL.gtid_executed )中的从属 GTID集合而非原子化外部化 至于主数据库,此GTID集包含所有已提交的GTID事务集的表示。 如果在从站上禁用二进制日志记录,则该 mysql.gtid_executed 表也​​是从站上应用的事务的完整记录。 如果在从站上启用了二进制日志记录,这意味着某些GTID仅记录在二进制日志中,则 gtid_executed 系统变量中 的GTID集 是唯一的完整记录。

在主服务器上完全过滤掉的客户端事务未分配GTID,因此它们不会添加到 gtid_executed 系统变量中 的事务集中,也不会添加到 mysql.gtid_executed 表中。 但是,在从属设备上完全过滤掉的复制事务的GTID是持久的。 如果在从属设备上启用了二进制日志记录,则过滤掉的事务将作为a Gtid_log_event 后跟仅包含 BEGIN COMMIT 语句 的空事务 写入二进制日志 如果禁用二进制日志记录,则已过滤掉的事务的GTID将写入 mysql.gtid_executed 表中。 为过滤掉的事务保留GTID确保了 mysql.gtid_executed gtid_executed 可以压缩 表和 系统变量中 的GTID集 它还确保如果从站重新连接到主站,则不会再次检索过滤掉的事务,如 第17.1.3.3节“GTID自动定位”中所述

在多线程复制从属(带 slave_parallel_workers > 0 )上,可以并行应用事务,因此复制的事务可以无序提交(除非 slave_preserve_commit_order=1 已设置)。 当发生这种情况时, gtid_executed 系统变量中的GTID 将包含多个GTID范围,它们之间存在间隙。 (在主机或单线程复制从机上,将会有单调增加的GTID,数字之间没有间隙。)多线程复制从机上的间隙仅发生在最近应用的事务中,并在复制过程中填充。 使用时干净地停止复制线程 STOP SLAVE 语句,应用正在进行的事务以填补空白。如果发生关闭(如服务器故障或使用 KILL 语句停止复制线程),则可能会出现间隙。

GTID分配了哪些变化?

典型情况是服务器为已提交的事务生成新的GTID。 但是,除了交易之外,GTID还可以分配给其他变更,在某些情况下,可以为单个交易分配多个GTID。

写入二进制日志的每个数据库更改(DDL或DML)都会分配一个GTID。 这包括自动提交的更改以及使用 BEGIN 和/ COMMIT START TRANSACTION 语句 提交的更改 GTID还分配给数据库的创建,更改或删除,以及非表数据库对象,例如过程,函数,触发器,事件,视图,用户,角色或授权。

非事务性更新以及事务性更新都分配了GTID。 此外,对于非事务性更新,如果在尝试写入二进制日志高速缓存时发生磁盘写入故障,因此在二进制日志中创建了间隙,则会为生成的事件日志事件分配GTID。

当二进制日志中的生成语句自动删除表时,会为该语句分配GTID。 当复制从服务器开始应用刚刚启动的主服务器以及基于语句的复制正在使用( binlog_format=STATEMENT )和具有打开的临时表断开连接的用户会话时, 将自动删除 临时表。 使用 MEMORY 存储引擎的 在服务器启动后第一次访问时会自动删除,因为在关闭期间行可能已丢失。

当事务未写入源服务器上的二进制日志时,服务器不会为其分配GTID。 这包括回滚的事务和在源服务器上禁用二进制日志记录时执行的事务,全局( --skip-log-bin 在服务器的配置中指定)或会话( SET @@SESSION.sql_log_bin = 0 )。 当使用基于行的复制时,这还包括无操作事务( binlog_format=ROW )。

XA事务被分配单独的GTIDs用于 XA PREPARE 交易的相位和 XA COMMIT XA ROLLBACK 交易的阶段。 XA事务是持久准备的,以便用户可以在发生故障时将其提交或回滚(在复制拓扑中可能包括故障转移到另一个服务器)。 因此,事务的两个部分是分开复制的,因此它们必须有自己的GTID,即使回滚的非XA事务没有GTID。

在以下特殊情况下,单个语句可以生成多个事务,因此可以分配多个GTID:

  • 调用存储过程以提交多个事务。 为过程提交的每个事务生成一个GTID。

  • 多表 DROP TABLE 语句删除不同类型的表。 如果任何表使用不支持原子DDL的存储引擎,或者任何表是临时表,则可以生成多个GTID。

  • 一个 CREATE TABLE ... SELECT 当基于行的复制是在使用语句发出( binlog_format=ROW )。 为该 CREATE TABLE 动作 生成 一个GTID,并为行插入动作生成一个GTID。

gtid_next 系统变量

默认情况下,对于在用户会话中提交的新事务,服务器会自动生成并分配新的GTID。 在复制从属服务器上应用事务时,将保留来自原始服务器的GTID。 您可以通过设置 gtid_next 系统变量 的会话值来更改此行为

  • 如果 gtid_next 设置为 AUTOMATIC 默认值,并且事务已提交并写入二进制日志,则服务器会自动生成并分配新的GTID。 如果由于其他原因而回滚事务或未将事务写入二进制日志,则服务器不会生成并分配GTID。

  • 如果设置 gtid_next 为有效的GTID(由UUID和事务序列号组成,用冒号分隔),服务器会将GTID分配给您的事务。 gtid_executed 即使事务未写入二进制日志,或者事务为空 也会 分配和添加此GTID

请注意,在设置 gtid_next 为特定GTID并且已提交或回滚事务之后, SET @@SESSION.gtid_next 必须在任何其他语句之前发出 显式 语句。 AUTOMATIC 如果您不想明确分配任何更多 GTID,可以使用此选项将GTID值设置回

当复制应用程序线程应用复制事务时,它们使用此技术, @@SESSION.gtid_next 显式 设置 为在源服务器上分配的复制事务的GTID。 这意味着保留来自原始服务器的GTID,而不是由复制从站生成和分配的新GTID。 这也意味着 gtid_executed 即使在从站上禁用二进制日志记录或从站更新日志记录,或者当事务是无操作或在从站上过滤掉时 ,GTID也会添加到 复制从站上。

客户端可以通过 @@SESSION.gtid_next 在执行事务之前 设置 为特定GTID 来模拟复制 的事务。 mysqlbinlog 使用此技术 生成二进制日志的转储,客户端可以重放该转储以保留GTID。 通过客户端提交的模拟复制事务完全等同于通过复制应用程序线程提交的复制事务,并且事后无法区分它们。

gtid_purged 系统变量

该集在GTIDs的 gtid_purged 系统变量( @@GLOBAL.gtid_purged )包含已提交在服务器上,但在任何服务器上的二进制日志文件不存在,所有交易的GTIDs。 gtid_purged 是一个子集 gtid_executed 以下类别的GTID包括 gtid_purged

  • 在从站上禁用二进制日志记录时提交的复制事务的GTID。

  • 已写入已清除的二进制日志文件的事务的GTID。

  • 由语句明确添加到集合中的GTID SET @@GLOBAL.gtid_purged

您可以更改值, gtid_purged 以便在服务器上记录已应用某个GTID集中的事务,尽管它们不存在于服务器上的任何二进制日志中。 当您添加GTID时 gtid_purged ,它们也会被添加到 gtid_executed 此操作的示例用例是在服务器上还原一个或多个数据库的备份时,但您没有包含服务器上的事务的相关二进制日志。 在MySQL 8.0之前,你只能改变 gtid_purged when 的值 gtid_executed (因此 gtid_purged )是空的。 从MySQL 8.0开始,此限制不适用,您还可以选择是 gtid_purged 使用指定的GTID集 替换整个 GTID集,还是将指定的GTID集添加到已经存在的GTID中 gtid_purged 有关如何执行此操作的详细信息,请参阅说明 gtid_purged

在GTIDs的集合 gtid_executed ,并 gtid_purged 在服务器启动时系统变量初始化。 每个二进制日志文件都以事件开头,该事件 Previous_gtids_log_event 包含所有先前二进制日志文件中的GTID集合(由前面文件中的 Previous_gtids_log_event GTID和 Gtid_log_event 前面文件本身中 的每个GTID组成 )。 的内容 Previous_gtids_log_event 在最早和最近的二进制日志文件来计算的 gtid_executed ,并 gtid_purged 套在服务器启动时:

  • gtid_executed 计算为 Previous_gtids_log_event 最新二进制日志文件中GTID的并集,该二进制日志文件中的事务的GTID以及存储在 mysql.gtid_executed 表中 的GTID 此GTID集包含已 gtid_purged 在服务器上 使用(或明确添加 )的 所有GTID ,无论它们当前是否位于服务器上的二进制日志文件中。 它不包括当前正在服务器上处理的事务的GTID( @@GLOBAL.gtid_owned )。

  • gtid_purged 通过首先 Previous_gtids_log_event 在最新的二进制日志文件中 添加GTID并 在该二进制日志文件中添加事务的GTID来计算。 此步骤提供当前或曾经记录在服务器上的二进制日志中的GTID集( gtids_in_binlog )。 接下来,从中 Previous_gtids_log_event 减去最旧的二进制日志文件中 的GTID gtids_in_binlog 此步骤提供当前记录在服务器( gtids_in_binlog_not_purged 上的二进制日志中的一组GTID 最后, gtids_in_binlog_not_purged 从中减去 gtid_executed 结果是已在服务器上使用的GTID集,但当前未记录在服务器上的二进制日志文件中,并且此结果用于初始化 gtid_purged

如果从MySQL 5.7.7或以上的二进制日志都参与了这些计算,有可能不正确GTID设置要计算的 gtid_executed ,并 gtid_purged 和他们保持,即使服务器重新启动后不正确。 有关详细信息,请参阅 binlog_gtid_simple_recovery 系统变量 的说明,该 变量控制如何迭代二进制日志以计算GTID集。 如果其中描述的某种情况适用于服务器,请进行设置 binlog_gtid_simple_recovery=FALSE 在启动它之前在服务器的配置文件中。 该设置使服务器迭代所有二进制日志文件(不仅是最新和最旧的)以查找GTID事件开始出现的位置。 如果服务器具有大量没有GTID事件的二进制日志文件,则此过程可能需要很长时间。

发出 RESET MASTER 导致将值 gtid_purged 重置为空字符串,并使全局值(但不是会话值) gtid_executed 重置为空字符串。

17.1.3.3 GTID自动定位

GTID替换先前所需的文件偏移对,以确定启动,停止或恢复主设备和从设备之间的数据流的点。 当使用GTID时,从属设备需要与主设备同步的所有信息都直接从复制数据流中获取。

要使用基于GTID的复制启动从属服务器,请不要 用于指示从属服务器从给定主服务器进行复制 语句中 包含 MASTER_LOG_FILE MASTER_LOG_POS 选项 CHANGE MASTER TO 这些选项指定日志文件的名称和文件中的起始位置,但是对于GTID,从站不需要此非本地数据。 相反,您需要启用该 MASTER_AUTO_POSITION 选项。 有关使用基于GTID的复制配置和启动主站和从站的完整说明,请参见 第17.1.3.4节“ 使用GTID 设置复制”

MASTER_AUTO_POSITION 默认情况下禁用 选项。 如果在从属设备上启用了多源复制,则需要为每个适用的复制通道设置选项。 禁用 MASTER_AUTO_POSITION 再次选项使从恢复到基于文件的复制,在这种情况下,你还必须指定的一个或两个 MASTER_LOG_FILE MASTER_LOG_POS 选项。

当复制从站启用GTID( GTID_MODE=ON ON_PERMISSIVE, OFF_PERMISSIVE )并 MASTER_AUTO_POSITION 启用 选项时,将激活自动定位以连接到主站。 必须 GTID_MODE=ON 设置 主服务器 才能使连接成功。 在初始握手中,从站发送一个GTID集,其中包含已经收到,已提交或两者都已完成的事务。 此GTID集等于 gtid_executed 系统变量( @@GLOBAL.gtid_executed )中GTID集的并集,以及性能模式 replication_connection_status 表中 记录 为接收事务(语句结果 SELECT RECEIVED_TRANSACTION_SET FROM PERFORMANCE_SCHEMA.replication_connection_status 的GTID集

主设备通过发送其二进制日志中记录的所有事务来响应,其GTID不包括在从设备发送的GTID集中。 此交换确保主服务器仅使用从服务器尚未接收或提交的GTID发送事务。 如果从属设备从多个主设备接收事务,如菱形拓扑结构,则自动跳过功能可确保事务不会应用两次。

如果主服务器应发送的任何事务已从主服务器的二进制日志中清除,或 gtid_purged 通过其他方法 添加到 系统变量中 的GTID集中 ,则主服务器将错误 ER_MASTER_HAS_PURGED_REQUIRED_GTIDS 发送 给从服务器,并且复制不会开始。 将识别丢失的清除事务的GTID,并在警告消息 ER_FOUND_MISSING_GTIDS 中的主控错误日志中 列出 从站无法自动从此错误中恢复,因为已清除了赶上主站所需的部分事务历史记录。 试图重新连接没有 MASTER_AUTO_POSITION 启用选项只会导致从站上清除的事务丢失。 从这种情况中恢复的正确方法是从 服务器 从另一个源 复制 ER_FOUND_MISSING_GTIDS 消息中 列出的丢失事务 ,或者从更新的备份创建的新从服务器替换从服务器。 考虑修改主服务器上的二进制日志有效期( binlog_expire_logs_seconds )以确保不再发生这种情况。

如果在事务交换期间发现从服务器已经在GTID中接收或提交了与主服务器UUID的事务,但主服务器本身没有它们的记录,则主服务器将错误 ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER 发送 给从服务器并且复制不会开始。 如果没有的主人可能会发生这种情况 sync_binlog=1 设置遇到电源故障或操作系统崩溃,并丢失尚未同步到二进制日志文件但已由从属设备接收的已提交事务。 如果任何客户端在重新启动后在主服务器上提交事务,则主服务器和从服务器可以发散,这可能导致主服务器和从服务器对不同的事务使用相同的GTID。 从这种情况中恢复的正确方法是手动检查主设备和从设备是否已发散。 如果现在对不同的事务使用相同的GTID,则需要根据需要对各个事务执行手动冲突解决,或者从复制拓扑中删除主服务器或从服务器。

17.1.3.4使用GTID设置复制

本节介绍在MySQL 8.0中配置和启动基于GTID的复制的过程。 这是一个 冷启动 过程,它假定您是第一次启动复制主服务器,或者可以停止它; 有关使用来自正在运行的主服务器的GTID供应复制从服务器的信息,请参见 第17.1.3.5节“使用GTID进行故障转移和扩展” 有关在线更改服务器上的GTID模式的信息,请参见 第17.1.5节“在线服务器上更改复制模式”

此启动过程中最简单的GTID复制拓扑的关键步骤(包括一个主服务器和一个从服务器)如​​下所示:

  1. 如果复制已在运行,请通过将两个服务器设置为只读来同步它们。

  2. 停止两台服务器。

  3. 重启两台服务器并启用GTID并配置正确的选项。

    启动服务器所需 mysqld 选项将在本节后面的示例中讨论。

  4. 指示从站使用主站作为复制数据源并使用自动定位。 完成此步骤所需的SQL语句将在本节后面的示例中介绍。

  5. 采取新的备份。 包含没有GTID的事务的二进制日志不能在启用了GTID的服务器上使用,因此在此之前进行的备份不能与新配置一起使用。

  6. 启动从属设备,然后在两台服务器上禁用只读模式,以便它们可以接受更新。

在以下示例中,使用MySQL的基于二进制日志位置的复制协议,两个服务器已作为主服务器和从服务器运行。 如果 要从 新服务器启动,请参见 第17.1.2.3节“为复制创建用户” 以获取有关为复制连接添加特定用户 的信息,以及有关设置 变量的 信息 ,请参见 第17.1.2.1 节“设置复制主配置” server_id 以下示例显示如何 在服务器的选项文件中 存储 mysqld 启动选项, 有关详细信息 ,请参见 第4.2.2.2节“使用选项文件” 或者,您可以在运行 mysqld 时使用启动选项

以下大多数步骤都需要使用MySQL root 帐户或具有该 SUPER 权限的 其他MySQL用户帐户 mysqladmin shutdown 需要 SUPER 特权或 SHUTDOWN 特权。

第1步:同步服务器。  只有在不使用GTID的情况下复制已经复制的服务器时,才需要执行此步骤。 对于新服务器,请继续执行步骤3. 通过发出以下命令,通过在每台服务器上 设置 read_only 系统变量, 使服务器成为只读 ON

MySQL的> SET @@GLOBAL.read_only = ON;

等待所有正在进行的事务提交或回滚。 然后,让奴隶赶上主人。 在继续之前确保从站已处理所有更新非常重要

如果将二进制日志用于复制以外的任何其他日志,例如进行即时备份和还原,请等到不需要包含没有GTID的事务的旧二进制日志。 理想情况下,等待服务器清除所有二进制日志,并等待任何现有备份过期。

重要

重要的是要了解包含没有GTID的事务的日志不能在启用了GTID的服务器上使用。 在继续之前,您必须确保拓扑中的任何位置都不存在没有GTID的事务。

第2步:停止两台服务器。  使用 mysqladmin 停止每个服务器 ,如下所示, username 具有足够权限关闭服务器的MySQL用户的用户名 在哪里

外壳> mysqladmin -uusername -p shutdown

然后在提示符下提供此用户的密码。

步骤3:启用两台启用了GTID的服务器。  要启用基于GTID的复制,必须通过将 gtid_mode 变量 设置为启用GTID模式来启动每个服务器 ON ,并 enforce_gtid_consistency 启用变量以确保仅记录对基于GTID的复制安全的语句。 例如:

gtid_mode = ON
执行-GTID一致性=真

此外, --skip-slave-start 在配置从站设置之前 ,应该使用该 选项 启动从 站。 有关GTID相关选项和变量的更多信息,请参见 第17.1.6.5节“全局事务ID选项和变量”

在使用 mysql.gtid_executed表 时,不必强制启用二进制日志记录以使用GTID 主人必须始终启用二进制日志记录才能进行复制。 但是,从服务器可以使用GTID但不使用二进制日志记录。 如果需要在从属服务器上禁用二进制日志记录,可以通过指定从属服务器 --skip-log-bin --skip-log-slave-updates 选项 来执行此操作

步骤4:配置从站以使用基于GTID的自动定位。  告诉从属设备使用具有基于GTID的事务的主服务器作为复制数据源,并使用基于GTID的自动定位而不是基于文件的定位。 CHANGE MASTER TO 在奴隶上 发出 声明,包括 MASTER_AUTO_POSITION 声明中 选项,告诉奴隶主人的交易是由GTID识别的。

您可能还需要为主服务器的主机名和端口号提供适当的值,以及复制用户帐户的用户名和密码,从服务器可以使用该帐户连接到主服务器; 如果已经在步骤1之前设置了这些,并且不需要进行进一步的更改,则可以从此处显示的语句中安全地省略相应的选项。

的MySQL> CHANGE MASTER TO
     >      
     >      
     >      
     >      
     >     MASTER_HOST = host,MASTER_PORT = port,MASTER_USER = user,MASTER_PASSWORD = password,MASTER_AUTO_POSITION = 1;

无论是 MASTER_LOG_FILE 选择还是 MASTER_LOG_POS 选择可能与使用 MASTER_AUTO_POSITION 等于1尝试这样做会导致 CHANGE MASTER TO 失败,错误陈述。

第5步:进行新备份。  由于您已启用GTID,因此在启用GTID之前创建的现有备份现在无法在这些服务器上使用。 此时进行新备份,这样您就不会没有可用的备份。

例如,您可以 FLUSH LOGS 在要进行备份的服务器上 执行 然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。

步骤6:启动从站并禁用只读模式。  像这样启动奴隶:

MySQL的> START SLAVE;

仅当您在步骤1中将服务器配置为只读时,才需要执行以下步骤。要允许服务器再次开始接受更新,请发出以下语句:

MySQL的> SET @@GLOBAL.read_only = OFF;

现在应该正在运行基于GTID的复制,您可以像以前一样在主服务器上开始(或恢复)活动。 第17.1.3.5节“使用GTID进行故障转移和扩展” 讨论了在使用GTID时创建新的从服务器。

17.1.3.5使用GTID进行故障转移和扩展

将MySQL Replication与全局事务标识符(GTID)一起使用时,有许多技术可用于配置新的从属设备,然后可以将其用于扩展,并根据故障转移的需要提升为主设备。 本节介绍以下技术:

全局事务标识符已添加到MySQL Replication中,以简化复制数据流和特别是故障转移活动的一般管理。 每个标识符唯一地标识一起构成事务的一组二进制日志事件。 GTID在将更改应用于数据库时起着关键作用:服务器自动跳过具有服务器识别为之前已处理的标识符的任何事务。 此行为对于自动复制定位和正确的故障转移至关重要。

在二进制日志中捕获标识符和包括给定事务的事件集之间的映射。 当使用来自另一个现有服务器的数据配置新服务器时,这会带来一些挑战。 要重现在新服务器上设置的标识符,必须将标识符从旧服务器复制到新服务器,并保留标识符与实际事件之间的关系。 这对于恢复立即可用作故障转移或切换成为新主服务器的候选服务器是必要的。

简单的复制。  在新服务器上重现所有标识符和事务的最简单方法是使新服务器成为具有完整执行历史记录的主服务器的从属服务器,并在两个服务器上启用全局事务标识符。 有关 更多信息 请参见 第17.1.3.4节“使用GTID设置复制”

启动复制后,新服务器将从主服务器复制整个二进制日志,从而获取有关所有GTID的所有信息。

这种方法简单有效,但要求从设备从主设备读取二进制日志; 新的从服务器有时需要相对较长的时间来赶上主服务器,因此这种方法不适合快速故障转移或从备份恢复。 本节介绍如何通过将二进制日志文件复制到新服务器来避免从主服务器获取所有执行历史记录。

将数据和事务复制到从属服务器。  当源服务器先前处理了大量事务时,执行整个事务历史记录可能非常耗时,这可能是设置新复制从站时的主要瓶颈。 为了消除此要求,可以将源服务器包含的数据集快照,二进制日志和全局事务信息导入新从属服务器。 源服务器可以是主服务器,也可以是从服务器,但必须确保源在复制数据之前已处理了所有必需的事务。

这种方法有几种变体,区别在于数据转储和二进制日志中的事务转移到从属的方式,如下所述:

数据集
  1. 在源服务器上 使用 mysqldump 创建转储文件 设置 mysqldump 选项 --master-data (默认值为1)以包含 CHANGE MASTER TO 带有二进制日志记录信息 语句。 --set-gtid-purged 选项 设置 AUTO (缺省值)或 ON ,以包括有关转储中已执行事务的信息。 然后使用 mysql 客户端在目标服务器上导入转储文件。

  2. 或者,使用原始数据文件创建源服务器的数据快照,然后按照 第17.1.2.5节“选择数据快照的方法”中 的说明将这些文件复制到目标服务器 如果使用 InnoDB 表,则可以使用 MySQL Enterprise Backup组件中 mysqlbackup 命令生成一致的快照。 此命令记录与从站上使用的快照对应的日志名称和偏移量。 MySQL Enterprise Backup是一种商业产品,作为MySQL Enterprise订阅的一部分包含在内。 看到 有关详细信息 ,请参见第30.2节“MySQL企业备份概述”

  3. 或者,停止源服务器和目标服务器,将源数据目录的内容复制到新从属数据目录,然后重新启动从属服务器。 如果使用此方法,则必须为从属服务器配置基于GTID的复制,换句话说 gtid_mode=ON 有关此方法的说明和重要信息,请参见 第17.1.2.8节“将从站添加到复制环境”

交易历史

如果源服务器在其二进制日志中具有完整的事务历史记录(即,GTID集 @@GLOBAL.gtid_purged 为空),则可以使用这些方法。

  1. 使用 带有 选项的 mysqlbinlog 将二进制日志从源服务器导入新的从服务器 --read-from-remote-server --read-from-remote-master

  2. 或者,将源服务器的二进制日志文件复制到从属服务器。 您可以使用 带有 选项的 mysqlbinlog 从slave进行复制 通过使用 mysqlbinlog (不带 选项)将二进制日志文件导出到SQL文件,然后将这些文件传递给 mysql 客户端进行处理 ,可以将这些文件 读入从属 服务器。 确保使用单个 mysql 进程 处理所有二进制日志文件 ,而不是使用多个连接。 例如: --read-from-remote-server --raw > file --raw

    外壳> mysqlbinlog copied-binlog.000001 copied-binlog.000002 | mysql -u root -p
    

    有关更多信息,请参见 第4.6.8.3节“使用mysqlbinlog备份二进制日志文件”

这种方法的优点是几乎可以立即使用新的服务器; 只有那些在重放快照或转储文件时提交的事务仍需要从现有主服务器获取。 这意味着从属设备的可用性不是即时的,但是从属设备只需要相对较短的时间来赶上这些剩余的事务。

事先将二进制日志复制到目标服务器通常比从主服务器实时读取整个事务执行历史记录更快。 但是,由于大小或其他考虑因素,在需要时将这些文件移动到目标可能并不总是可行的。 本节中讨论的另外两种配置新从站的方法使用其他方法将有关事务的信息传输到新从站。

注入空交易。  master的全局 gtid_executed 变量包含在 master上 执行的所有事务的集合。 在拍摄快照以配置新服务器时,您可以改为记录 gtid_executed 拍摄快照的服务器上的 内容,而不是复制二进制日志 在将新服务器添加到复制链之前,只需在新服务器上为主服务器中包含的每个事务标识符提交一个空事务 gtid_executed ,如下所示:

SET GTID_NEXT ='aaa-bbb-ccc-ddd:N';

开始;
承诺;

SET GTID_NEXT ='AUTOMATIC';

使用空事务以这种方式恢复所有事务标识符后,必须刷新并清除slave的二进制日志,如此处所示,其中 N 是当前二进制日志文件名的非零后缀:

FLUSH LOGS;
PURGE BINARY登录N' master-bin.00000 ';

您应该执行此操作以防止此服务器在以后将其提升为主服务器时使用虚假事务充斥复制流。 (该 FLUSH LOGS 语句强制创建新的二进制日志文件; PURGE BINARY LOGS 清除空事务,但保留其标识符。)

此方法创建一个本质上是快照的服务器,但由于其二进制日志历史记录与复制流的历史记录收敛(即,当它赶上主服务器或主服务器时),因此能够及时成为主服务器。 该结果与使用剩余供应方法获得的结果类似,我们将在接下来的几段中讨论。

使用gtid_purged排除交易。  master的全局 gtid_purged 变量包含从主服务器的二进制日志中清除的所有事务的集合。 与前面讨论的方法一样(请参阅 注入空事务 ),您可以记录 gtid_executed 从中获取快照的服务器上 的值 (而不是将二进制日志复制到新服务器)。 与以前的方法不同,不需要提交空事务(或发布 PURGE BINARY LOGS ); 相反,您可以 gtid_purged 根据 gtid_executed 从中获取备份或快照的服务器 上的值直接在从站上 进行设置

与使用空事务的方法一样,此方法创建一个功能上为快照的服务器,但由于其二进制日志历史记录与复制主服务器或组的历史记录收敛,因此能够及时成为主服务器。

恢复GTID模式从站。  在遇到错误的基于GTID的复制设置中还原从站时,注入空事务可能无法解决问题,因为事件没有GTID。

使用 mysqlbinlog 查找下一个事务,这可能是事件发生后下一个日志文件中的第一个事务。 将所有内容复制到该 COMMIT 事务,确保包含该事务 SET @@SESSION.gtid_next 即使您不使用基于行的复制,仍可以在命令行客户端中运行二进制日志行事件。

停止从属并运行您复制的事务。 mysqlbinlog可以 输出设置的分隔符 /*!*/; ,所以将其设置回:

MySQL的> DELIMITER ;

自动从正确的位置重新启动复制:

mysql> SET GTID_NEXT=automatic;
mysql> RESET SLAVE;
mysql>START SLAVE;

17.1.3.6使用GTID进行复制的限制

由于基于GTID的复制依赖于事务,因此在使用时不支持MySQL中可用的某些功能。 本节提供有关使用GTID进行复制的限制和限制的信息。

涉及非事务存储引擎的更新。  使用GTID时,使用非事务性存储引擎对表进行更新(例如, MyISAM 无法在与使用事务存储引擎(例如)的表更新相同的语句或事务中) InnoDB

这种限制是由于对使用非事务性存储引擎的表的更新与对同一事务中使用事务存储引擎的表的更新混合的事实可能导致将多个GTID分配给同一事务。

当主设备和从设备使用不同的存储引擎用于同一个表的相应版本时,也会发生这样的问题,其中一个存储引擎是事务性的而另一个不是。 还要注意,定义为在非事务性表上运行的触发器可能是导致这些问题的原因。

在刚刚提到的任何一种情况下,事务和GTID之间的一对一对应关系被破坏,结果是基于GTID的复制无法正常运行。

CREATE TABLE ... SELECT语句。  CREATE TABLE ... SELECT 使用基于GTID的复制时不允许使用语句。 binlog_format 设置为STATEMENT时, CREATE TABLE ... SELECT 语句在二进制日志中记录为具有一个GTID的一个事务,但如果使用ROW格式,则该语句将记录为具有两个GTID的两个事务。 如果主服务器使用STATEMENT格式而从服务器使用ROW格式, CREATE TABLE ... SELECT 则从服务器 将无法正确处理事务,因此 GTID不允许使用 语句来阻止此情况。

临时表。  何时 binlog_format 设置为 STATEMENT CREATE TEMPORARY TABLE 并且 DROP TEMPORARY TABLE 当在服务器上使用GTID时(即,当 enforce_gtid_consistency 系统变量设置为 ON 时,不能在事务,过程,函数和触发器内使用语句 当GTID正在使用时,它们可以在这些上下文之外使用,前提是 autocommit=1 已设置。 从MySQL 8.0.13开始,何时 binlog_format 设置为 ROW MIXED CREATE TEMPORARY TABLE DROP TEMPORARY TABLE 在使用GTID时,允许在事务,过程,函数或触发器内部使用语句。 这些语句不会写入二进制日志,因此不会复制到从属语句。 使用基于行的复制意味着从属服务器保持同步,而无需复制临时表。 如果从事务中删除这些语句导致空事务,则事务不会写入二进制日志。

防止执行不受支持的语句。  要防止执行会导致基于GTID的复制失败的语句,必须 --enforce-gtid-consistency 在启用GTID时 使用该 选项 启动所有服务器 这会导致本节前面讨论的任何类型的语句失败并显示错误。

请注意, --enforce-gtid-consistency 仅在对语句进行二进制日志记录时才会生效。 如果在服务器上禁用了二进制日志记录,或者由于过滤器删除了语句而未将语句写入二进制日志,则不会对未记录的语句检查或强制执行GTID一致性。

有关启用GTID时其他所需启动选项的信息,请参见 第17.1.3.4节“使用GTID设置复制”

跳过交易。  sql_slave_skip_counter 使用GTID时不支持。 如果您需要跳过事务,请使用master的 gtid_executed 变量 ; 有关详细信息, 请参阅 注入空事务

忽略服务器。  CHANGE MASTER TO 使用GTID时,不推荐使用 语句 的IGNORE_SERVER_IDS选项 ,因为已经应用的事务会自动被忽略。 在启动基于GTID的复制之前,请检查并清除之前在相关服务器上设置的所有忽略的服务器ID列表。 SHOW SLAVE STATUS 可以为各个通道发出 语句显示已忽略的服务器ID列表(如果有)。 如果没有列表,则该 Replicate_Ignore_Server_Ids 字段为空。

GTID模式和mysqldump。  如果 目标服务器的二进制日志中没有GTID ,则可以将使用 mysqldump 创建的转储导入 到启用了GTID模式的MySQL服务器中。

GTID模式和mysql_upgrade。  在MySQL 8.0.16之前,当服务器运行时使用全局事务标识符(GTID)enabled( gtid_mode=ON )时,不要通过 mysql_upgrade 启用二进制日志记录 (该 --write-binlog 选项)。 从MySQL 8.0.16开始,服务器执行整个MySQL升级过程,但在升级过程中禁用二进制日志记录,因此没有问题。

17.1.3.7存储函数示例以处理GTID

MySQL包含一些内置(本机)函数,用于基于GTID的复制。 这些功能如下:

GTID_SUBSET(set1,set2)

由于两套全局事务标识符 set1 set2 ,如果所有GTIDs返回true set1 也是 set2 否则返回false。

GTID_SUBTRACT(set1,set2)

由于两套全局事务标识符 set1 set2 ,只返回那些GTIDs set1 不在 set2

WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])

等到服务器应用了包含全局事务标识符的所有事务 gtid_set 在指定的秒数过后,可选的超时会使函数停止等待。

WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel])

喜欢 WAIT_FOR_EXECUTED_GTID_SET(), 但是对于单个启动的复制通道。 使用 WAIT_FOR_EXECUTED_GTID_SET() 而不是保证所有的通道都涵盖所有状态。

有关这些函数的详细信息,请参见 第12.18节“与全局事务标识符(GTID)一起使用的函数”

您可以定义自己的存储函数以使用GTID。 有关定义存储函数的信息,请参见 第24章, 存储对象 以下示例显示了可以基于内置 函数 GTID_SUBSET() GTID_SUBTRACT() 函数 创建的一些有用的存储 函数。

请注意,在这些存储函数中,delimiter命令已用于将MySQL语句分隔符更改为垂直条,如下所示:

mysql>分隔符|

所有这些函数都将GTID集的字符串表示作为参数,因此GTID集在与它们一起使用时必须始终引用。

如果两个GTID集是相同的集,则此函数返回非零(true),即使它们没有以相同的方式格式化。

创建函数GTID_IS_EQUAL(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT)
退货INT
  返回GTID_SUBSET(gtid_set_1,gtid_set_2)和GTID_SUBSET(gtid_set_2,gtid_set_1)|

如果两个GTID集不相交,则此函数返回非零值(true)。

创建函数GTID_IS_DISJOINT(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT)
退货INT
  返回GTID_SUBSET(gtid_set_1,GTID_SUBTRACT(gtid_set_1,gtid_set_2))|

如果两个GTID集是不相交的,则此函数返回非零(true),并且 sum 是两个集合的并集。

创建函数GTID_IS_DISJOINT_UNION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT,总和LONGTEXT)
退货INT
  返回GTID_IS_EQUAL(GTID_SUBTRACT(sum,gtid_set_1),gtid_set_2)AND
         GTID_IS_EQUAL(GTID_SUBTRACT(sum,gtid_set_2),gtid_set_1)|

此函数以全部大写形式返回GTID集的规范化形式,没有空格且没有重复。 UUID按字母顺序排列,间隔按数字顺序排列。

创建功能GTID_NORMALIZE(g LONGTEXT)
退货长期
返回GTID_SUBTRACT(g,'')|

此函数返回两个GTID集的并集。

创建函数GTID_UNION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT)
退货长期
  返回GTID_NORMALIZE(CONCAT(gtid_set_1,',',gtid_set_2))|

此函数返回两个GTID集的交集。

创建函数GTID_INTERSECTION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT)
退货长期
  返回GTID_SUBTRACT(gtid_set_1,GTID_SUBTRACT(gtid_set_1,gtid_set_2))|

此函数返回两个GTID集之间的对称差异,即存在 gtid_set_1 但不 存在的GTID gtid_set_2 ,以及存在 gtid_set_2 但不 存在的GTID gtid_set_1

创建函数GTID_SYMMETRIC_DIFFERENCE(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT)
退货长期
  返回GTID_SUBTRACT(CONCAT(gtid_set_1,',',gtid_set_2),GTID_INTERSECTION(gtid_set_1,gtid_set_2))|

此函数从GTID中删除指定原点的所有GTID,并返回剩余的GTID(如果有)。 UUID是发起事务的服务器使用的标识符,通常是 server_uuid 值。

创建函数GTID_SUBTRACT_UUID(gtid_set LONGTEXT,uuid TEXT)
退货长期
  返回GTID_SUBTRACT(gtid_set,CONCAT(UUID,':1-',(1 << 63) -  2))|

此函数反转先前列出的函数,以仅返回来自具有指定标识符(UUID)的服务器的GTID集中的那些GTID。

创建函数GTID_INTERSECTION_WITH_UUID(gtid_set LONGTEXT,uuid TEXT)
退货长期
  返回GTID_SUBTRACT(gtid_set,GTID_SUBTRACT_UUID(gtid_set,uuid))|

示例17.1验证复制从站是否是最新的

内置的功能 GTID_SUBSET GTID_SUBTRACT 可用于检查复制从具有至少一个主已申请的每个事务应用。

要执行此检查 GTID_SUBSET ,请在从属服务器上执行以下语句:

SELECT GTID_SUBSET(master_gtid_executedslave_gtid_executed

如果返回0(false),则某些GTID master_gtid_executed 不存在 slave_gtid_executed ,因此主机已应用了从站未应用的某些事务,因此从站不是最新的。

要执行检查 GTID_SUBTRACT ,请在从站上执行以下语句:

SELECT GTID_SUBTRACT(master_gtid_executedslave_gtid_executed

此语句返回任何 master_gtid_executed 但不在其中的 GTID slave_gtid_executed 如果返回任何GTID,则主站已应用了从站未应用的一些事务,因此从站不是最新的。


示例17.2备份和还原方案

存储的功能 GTID_IS_EQUAL GTID_IS_DISJOINT 以及 GTID_IS_DISJOINT_UNION 可用于验证备份和恢复涉及多个数据库和服务器操作。 在此示例场景中, server1 包含数据库 db1 ,并 server2 包含数据库 db2 目标是将数据库复制 db2 server1 ,并且结果 server1 应该是两个数据库的并集。 使用的过程是 server2 使用 mysqlpump mysqldump 备份,然后恢复此备份 server1

如果备份程序的选项 --set-gtid-purged 设置为 ON 或默认值 AUTO ,则程序的输出包含一个 SET @@GLOBAL.gtid_purged 语句, 语句将该 gtid_executed 添加 server2 gtid_purged 设置中 server1 gtid_purged 集包含已在服务器上提交但在服务器上的任何二进制日志文件中不存在的所有事务的GTID。 当数据库 db2 被复制到 server1 ,犯下交易的GTIDs server2 ,这是不是在二进制日志文件上 server1 ,必须添加 server1 gtid_purged 设置,使一套完整。

存储的函数可用于协助此方案中的以下步骤:

  • 使用 GTID_IS_EQUAL 来验证备份操作计算的正确GTID一套 SET @@GLOBAL.gtid_purged 说法。 server2 ,从 mysqlpump mysqldump 输出中 提取该语句 ,并将GTID集存储到本地变量中,例如 $gtid_purged_set 然后执行以下语句:

    server2> SELECT GTID_IS_EQUAL($ gtid_purged_set,@@ GLOBAL.gtid_executed); 

    如果结果为1,则两个GTID集相等,并且已正确计算该集。

  • 使用 GTID_IS_DISJOINT 验证,在设定的GTID mysqlpump mysqldump的 输出不与重叠 gtid_executed 设置 server1 如果存在任何重叠,由于某种原因在两台服务器上都存在相同的GTID,则在将数据库复制 db2 时会出现错误 server1 要检查,打开 server1 ,提取 gtid_purged 输出并将输出 存储 到上面的局部变量中,然后执行以下语句:

    server1> SELECT GTID_IS_DISJOINT($ gtid_purged_set,@@ GLOBAL.gtid_executed); 

    如果结果为1,则两个GTID集之间没有重叠,因此不存在重复的GTID。

  • 使用 GTID_IS_DISJOINT_UNION 来验证还原操作导致的正确GTID状态 server1 在恢复备份之前, 通过执行以下语句 server1 获取现有 gtid_executed 集:

    server1> SELECT @@ GLOBAL.gtid_executed;

    将结果存储在局部变量中 $original_gtid_executed 还将 gtid_purged 集合 存储在 如上所述的局部变量中。 备份来自 server2 还原后 server1 ,执行以下语句以验证GTID状态:

    server1> SELECT GTID_IS_DISJOINT_UNION($ original_gtid_executed, 
                                           $ gtid_purged_set, 
                                           @@ GLOBAL.gtid_executed); 

    如果结果是1,存储功能已证实,原来 gtid_executed 设定的从 server1 $original_gtid_executed )和 gtid_purged 一个从添加组 server2 $gtid_purged_set )没有重叠,也更新后的 gtid_executed 设置上 server1 ,现在由以前的 gtid_executed 一组来自 server1 加上 gtid_purged 从集 server2 ,这是理想的结果。 确保在进行任何进一步的事务之前执行此检查 server1 ,否则 gtid_executed 集合中 的新事务 将导致其失败。


例17.3选择最新的从站进行手动故障转移

存储的函数 GTID_UNION 可用于从一组从属中识别最新的复制从属,以便在复制主机意外停止后执行手动故障转移操作。 如果某些从站遇到复制延迟,则此存储的函数可用于计算最新的从站,而无需等待所有从站应用其现有的中继日志,从而最大限度地缩短故障转移时间。 该函数可以返回 gtid_executed 每个从站上的集合与从站接收的事务集合的并集,该集合记录在性能架构表中 replication_connection_status 您可以比较这些结果,以查找哪个奴隶的交易记录是最新的,即使并非所有交易都已提交。

在每个复制从属服务器上,通过发出以下语句来计算完整的事务记录:

SELECT GTID_UNION(RECEIVED_TRANSACTION_SET,@@ GLOBAL.gtid_executed) 
    来自performance_schema.replication_connection_status 
    WHERE channel_name ='name';

然后,您可以比较每个从站的结果,以查看哪个具有最新的事务记录,并将此从站用作新的复制主站。


示例17.4检查复制从站上的无关事务

存储的函数 GTID_SUBTRACT_UUID 可用于检查复制从站是否已收到不是源自其指定主站或主站的事务。 如果有,则可能是您的复制设置或代理,路由器或负载均衡器存在问题。 此功能的工作原理是从GTID中删除指定始发服务器中的所有GTID,并返回剩余的GTID(如果有)。

对于具有单个主服务器的复制从服务器,请发出以下语句,并提供原始复制主服务器的标识符,该标识符通常为以下 server_uuid 值:

SELECT GTID_SUBTRACT_UUID(@@ GLOBAL.gtid_executed,server_uuid_of_master);

  如果结果不为空,则返回的事务是不是源自指定主服务器的额外事务。

对于多主复制拓扑中的从站,请重复该功能,例如:

SELECT GTID_SUBTRACT_UUID(GTID_SUBTRACT_UUID(@@ GLOBAL.gtid_executed,
                                             server_uuid_of_master_1)
                                             server_uuid_of_master_2);

如果结果不为空,则返回的事务是不是来自任何指定主服务器的额外事务。


示例17.5验证复制拓扑中的服务器是否为只读

存储的函数 GTID_INTERSECTION_WITH_UUID 可用于验证服务器是否未发起任何GTID并且处于只读状态。 该函数仅返回来自GTID集的GTID,这些GTID源自具有指定标识符的服务器。 如果服务器 gtid_executed 集中的 任何事务 具有服务器自己的标识符,则服务器本身会发起这些事务。 您可以在服务器上发出以下语句来检查:

SELECT GTID_INTERSECTION_WITH_UUID(@@ GLOBAL.gtid_executed,my_server_uuid);


例17.6在多主复制设置中验证附加从站

存储的函数 GTID_INTERSECTION_WITH_UUID 可用于查明连接到多主复制设置的从属是否已应用源自一个特定主服务器的所有事务。 在这种情况下, master1 并且 master2 都是主人和奴隶,并复制到对方。 master2 也有自己的复制奴隶。 master1 如果 master2 配置了 复制从属设备,它也将接收和应用 事务 log_slave_updates=ON ,但如果 master2 使用 则不会这样做 log_slave_updates=OFF 无论如何,我们目前只想知道复制从站是否是最新的 master2 在这种情况下,存储功能 GTID_INTERSECTION_WITH_UUID 可用于标识 master2 发起的事务,丢弃 master2 已复制 的事务 master1 GTID_SUBSET 然后可以使用 内置函数 将结果 gtid_executed 与从站上的设置 进行比较 如果从站是最新的 master2 gtid_executed 则从站上 设置包含交集中的所有事务(源自的事务 master2 )。

要执行此检查,将商店 master2 gtid_executed set, master2 服务器UUID和slave的 gtid_executed 集合存储到客户端变量中,如下所示:

    $ master2_gtid_executed:=
      master2> SELECT @@ GLOBAL.gtid_executed;
    $ master2_server_uuid:=
      master2> SELECT @@ GLOBAL.server_uuid;
    $ slave_gtid_executed:=
      奴隶> SELECT @@ GLOBAL.gtid_executed;

然后使用 GTID_INTERSECTION_WITH_UUID GTID_SUBSET 将这些变量作为输入,如下所示:

SELECT GTID_SUBSET(GTID_INTERSECTION_WITH_UUID($ master2_gtid_executed,
                                               $ master2_server_uuid)
                                               $ slave_gtid_executed);

来自 master2 $master2_server_uuid 的服务器标识符 用于 GTID_INTERSECTION_WITH_UUID 识别和返回 源自 master2 gtid_executed 集合中的 那些GTID master2 ,省略那些源自 集合 master1 然后使用得到的GTID集与从站上所有已执行GTID的集合进行比较 GTID_SUBSET 如果此语句返回非零(true),则来自 master2 (第一组输入)的 所有标识的GTID 也在从属 gtid_executed 集(第二组输入)中,这意味着从属已复制源自的所有事务 master2


17.1.4 MySQL多源复制

本节介绍MySQL多源复制,它允许您并行地从多个直接主站复制。 本节介绍多源复制,以及如何配置,监视和排除故障。

17.1.4.1 MySQL多源复制概述

MySQL多源复制使复制从站可以同时从多个源接收事务。 多源复制可用于将多个服务器备份到单个服务器,合并表分片,以及将来自多个服务器的数据合并到单个服务器。 应用事务时,多源复制不会实现任何冲突检测或解决,如果需要,这些任务将留给应用程序。 在多源复制拓扑中,从属服务器为每个应从其接收事务的主服务器创建复制通道。 请参见 第17.2.3节“复制通道” 以下部分介绍如何设置多源复制。

17.1.4.2多源复制教程

本节提供有关如何为多源复制配置主站和从站以及如何启动,停止和重置多源从站的教程。

17.1.4.2.1配置多源复制

本节介绍如何配置多源复制拓扑,并提供有关配置主站和从站的详细信息。 这种拓扑需要至少两个主设备和一个从设备配置。

可以将多源复制拓扑中的主服务器配置为使用基于全局事务标识符(GTID)的复制或基于二进制日志位置的复制。 有关 如何使用基于GTID的复制配置主 服务器, 请参见 第17.1.3.4节“ 使用GTID设置复制”。 有关 如何使用基于文件位置的复制配置主 服务器, 请参见 第17.1.2.1节“设置复制主服务器配置”

多源复制拓扑中的从站需要 TABLE 主信息日志和中继日志信息日志的存储库,这是MySQL 8.0中的默认日志。 多源复制与 FILE 基于存储库 不兼容, 现在不推荐使用 --master-info-repository --relay-log-info-repository 选项 的FILE设置

要修改使用 FILE 存储库以使用从属状态日志来使用 TABLE 存储库 的现有复制从属,请 通过运行以下命令动态转换现有复制存储库:

STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
17.1.4.2.2将基于GTID的主服务器添加到多源复制从服务器

本节假定您已在主服务器上启用了基于GTID的事务 gtid_mode=ON ,启用了复制用户,并确保从服务器正在使用 TABLE 基于复制的存储库。 使用该 CHANGE MASTER TO 语句通过使用 子句 将新主服务器添加到通道 有关复制通道的更多信息,请参见 第17.2.3节“复制通道” FOR CHANNEL channel

例如,要 master1 使用端口 3451 将具有 主机名的新主服务器添加 到名为的通道 master-1


CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \
MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';

多源复制与自动定位兼容。 有关 更多信息 请参见 第13.4.2.1节“将语法更改 语法”

对要添加到通道的每个额外主站重复此过程,根据需要更改主机名,端口和通道。

17.1.4.2.3将基于二进制日志的主服务器添加到多源复制从服务器

本节假设在主服务器上启用了二进制日志记录(这是默认设置),从服务器正在使用 TABLE 基于复制的存储库(这是MySQL 8.0中的默认存储库),并且您已启用复制用户并注意到当前的二进制日志位置。 你需要知道当前 MASTER_LOG_FILE MASTER_LOG_POSITION 使用该 CHANGE MASTER TO 语句通过指定 子句 将新主服务器添加到通道 例如,要 使用端口 将具有 主机名的新主服务器添加 到名为的通道 FOR CHANNEL channel master1 3451 master-1


CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='' \
MASTER_LOG_FILE='master1-bin.000006', MASTER_LOG_POS=628 FOR CHANNEL 'master-1';

对要添加到通道的每个额外主站重复此过程,根据需要更改主机名,端口和通道。

17.1.4.2.4启动多源复制从站

添加了要用作复制主服务器的所有通道后,请使用 语句启动复制。 在从站上启用多个通道后,您可以选择启动所有通道,也可以选择要启动的特定通道。 START SLAVE thread_types

  • 要启动所有当前配置的复制通道:

     
    START SLAVE thread_types;
  • 要仅启动命名通道,请使用以下 子句: FOR CHANNEL channel

     
    START SLAVE thread_types FOR CHANNEL channel;
    

使用该 thread_types 选项选择您希望上述语句在从站上启动的特定线程。 有关 更多信息 请参见 第13.4.2.6节“START SLAVE语法”

17.1.4.2.5停止多源复制从站

STOP SLAVE 语句可用于停止多源复制从属。 默认情况下,如果 STOP SLAVE 在多源复制从站上 使用该 语句 ,则 所有通道都将停止。 (可选)使用该 子句仅停止特定通道。 FOR CHANNEL channel

  • 要停止所有当前配置的复制通道:

    
    STOP SLAVE thread_types;
  • 要仅停止命名通道,请使用以下 子句: FOR CHANNEL channel

     
    STOP SLAVE thread_types FOR CHANNEL channel;
    

使用该 thread_types 选项选择您希望上述语句在从站上停止的特定线程。 有关 更多信息 请参见 第13.4.2.7节“STOP SLAVE语法”

17.1.4.2.6重置多源复制从站

RESET SLAVE 语句可用于重置多源复制从站。 默认情况下,如果 RESET SLAVE 在多源复制从站上 使用该 语句,则会重置所有通道。 (可选)使用该 子句仅重置特定通道。 FOR CHANNEL channel

  • 要重置所有当前配置的复制通道:

     
    RESET SLAVE;
  • 要仅重置命名通道,请使用以下 子句: FOR CHANNEL channel

     
    RESET SLAVE FOR CHANNEL channel;
    

有关 更多信息 请参见 第13.4.2.4节“重置从动语法”

17.1.4.3多源复制监控

要监视复制通道的状态,需要以下选项:

  • 使用复制性能架构表。 这些表的第一列是 Channel_Name 这使您可以基于 Channel_Name 来编写复杂查询 请参见 第26.12.11节“性能模式复制表”

  • 默认情况下,如果 未使用 子句,则此语句显示所有通道的从属状态,每个通道一行。 标识符 将作为列添加到结果集中。 如果 提供 子句,则结果仅显示指定复制通道的状态。 SHOW SLAVE STATUS FOR CHANNEL channel FOR CHANNEL channel Channel_name FOR CHANNEL channel

注意

SHOW VARIABLES 语句不适用于多个复制通道。 通过这些变量可用的信息已迁移到复制性能表。 SHOW VARIABLES 在具有多个通道的拓扑中 使用 语句仅显示默认通道的状态。

17.1.4.3.1使用性能模式表监视通道

本节介绍如何使用复制性能架构表来监视通道。 您可以选择监控所有频道或现有频道的子集。

要监控所有通道的连接状态:

MySQL的> SELECT * FROM replication_connection_status\G;
*************************** 1。排******************** *******
CHANNEL_NAME:master1
团队名字:
SOURCE_UUID:046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID:24
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
*************************** 2.排******************** *******
CHANNEL_NAME:master2
团队名字:
SOURCE_UUID:7475e474-a223-11e4-a978-0811960cc264
THREAD_ID:26
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:7475e474-a223-11e4-a978-0811960cc264:4-6
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
2行(0.00秒)
	    

在上面的输出中,有两个通道被启用,并且如 CHANNEL_NAME 字段 所示, 它们被称为 master1 master2

通过添加 CHANNEL_NAME 字段,您可以查询特定通道的性能架构表。 要监视命名通道的连接状态,请使用以下 子句: WHERE CHANNEL_NAME=channel

MySQL的> SELECT * FROM replication_connection_status WHERE CHANNEL_NAME='master1'\G
*************************** 1。排******************** *******
CHANNEL_NAME:master1
团队名字:
SOURCE_UUID:046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID:24
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
1排(0.00秒)

同样,该 子句可用于监视特定通道的其他复制性能架构表。 有关更多信息,请参见 第26.12.11节“性能模式复制表” WHERE CHANNEL_NAME=channel

17.1.4.4多源复制错误消息

错误代码和消息提供有关多源复制拓扑中遇到的错误的信息。 这些错误代码和消息仅在启用多源复制时发出,并提供与生成错误的通道相关的信息。 例如:

从已经在运行 从机已经停止 已经替换 为信道的复制线程(一个或多个) channel_name 已经在运行 ,并 用于信道复制的线程(多个) channel_name 已停止 分别。

服务器日志消息也已更改,以指示日志消息与哪个通道相关。 这使得调试和跟踪更容易。

17.1.5更改在线服务器上的复制模式

本节介绍如何更改正在使用的复制模式,而无需使服务器脱机。

17.1.5.1复制模式概念

为了能够安全地配置在线服务器的复制模式,了解一些关键的复制概念非常重要。 本节介绍了这些概念,在尝试修改在线服务器的复制模式之前,它是必不可少的读物。

MySQL中可用的复制模式依赖于识别记录的事务的不同技术。 复制使用的事务类型如下:

  • GTID事务由表单中的全局事务标识符(GTID)标识 UUID:NUMBER 日志中的每个GTID事务总是以a开头 Gtid_log_event 可以使用GTID或使用文件名和位置来处理GTID事务。

  • 匿名事务没有分配GTID,并且MySQL确保日志中的每个匿名事务都以a开头 Anonymous_gtid_log_event 在以前的版本中,匿名事务之前没有任何特定事件。 匿名事务只能使用文件名和位置来处理。

当使用GTIDs您可以利用自动定位和自动故障转移的,以及使用 WAIT_FOR_EXECUTED_GTID_SET() session_track_gtids 和监控使用Performance模式表复制的事务。 启用GTID后,您无法使用 sql_slave_skip_counter ,而是使用空事务。

从运行MySQL先前版本的主服务器接收的中继日志中的事务可能根本不会出现任何特定事件,但在重放并记录在从属二进制日志中之后,它们前面会有一个 Anonymous_gtid_log_event

在线配置复制模式的能力意味着 gtid_mode enforce_gtid_consistency 变量现在都是动态的,并且可以通过具有足以设置全局系统变量的特权的帐户从顶级语句设置。 请参见 第5.1.9.1节“系统变量权限” 在MySQL 5.6及更早版本中,这两个变量都只能在服务器启动时使用适当的选项进行配置,这意味着对复制模式的更改需要重新启动服务器。 在所有版本中 gtid_mode 都可以设置为 ON OFF ,这与GTID是否用于识别交易相对应。 什么时候 gtid_mode=ON 无法复制匿名事务,并且 gtid_mode=OFF 只能 复制匿名事务 gtid_mode=OFF_PERMISSIVE 然后, 当允许复制的事务为GTID或匿名事务 时, 事务是匿名的。 gtid_mode=ON_PERMISSIVE ,同时允许复制的事务事务使用GTIDs是要么GTID或匿名交易。 这意味着可以拥有一个复制拓扑,其中包含使用匿名和GTID事务的服务器。 例如,一个主人 gtid_mode=ON 可以复制到一个奴隶 gtid_mode=ON_PERMISSIVE 有效值 gtid_mode 如下并按此顺序:

  • OFF

  • OFF_PERMISSIVE

  • ON_PERMISSIVE

  • ON

重要的是要注意,状态 gtid_mode 只能根据上述顺序一次改变一步。 例如,如果 gtid_mode 当前设置为 OFF_PERMISSIVE ,则可以更改为 OFF ON_PERMISSIVE 不更改 ON 这是为了确保服务器正确处理从在线匿名事务更改为GTID事务的过程。 当您在 gtid_mode=ON 之间切换时 gtid_mode=OFF ,GTID状态(换句话说,值 gtid_executed )是持久的。 这可确保始终保留服务器应用的GTID集,而不管类型之间的更改如何 gtid_mode

无论当前选择哪个,与GTID相关的字段都会显示正确的信息 gtid_mode 这意味着,显示GTID组领域,如 gtid_executed gtid_purged RECEIVED_TRANSACTION_SET replication_connection_status 性能架构表,的GTID相关的结果 SHOW SLAVE STATUS ,现在返回空字符串时,有没有存在GTIDs。 现在, 在未使用GTID事务时 ,将显示显示单个GTID的字段,例如 CURRENT_TRANSACTION 性能模式 replication_applier_status_by_worker 中的 字段 ANONYMOUS

从主服务器进行的复制 gtid_mode=ON 提供了使用自动定位的功能,使用该 CHANGE MASTER TO MASTER_AUTO_POSITION = 1; 语句进行 配置 正在使用的复制拓扑影响是否可以启用自动定位,因为此功能依赖于GTID并且与匿名事务不兼容。 如果启用了自动定位并且遇到匿名事务,则会生成错误。 强烈建议在启用自动定位之前确保拓扑中没有剩余匿名事务,请参见 第17.1.5.2节“在线启用GTID事务”

gtid_mode 主站和从站 的有效组合 和自动定位如下表所示,其中主站 gtid_mode 显示在水平上,而从 gtid_mode 站在垂直方向上。 每个条目的含义如下:

  • Y gtid_mode 主和从属兼容

  • N gtid_mode 主机和从机不兼容

  • * :自动定位可与此组合一起使用

表17.1主服务器和从服务器gtid_mode的有效组合

gtid_mode

OFF

OFF_PERMISSIVE

ON_PERMISSIVE

ON

奴隶 OFF

ÿ

ÿ

ñ

ñ

奴隶 OFF_PERMISSIVE

ÿ

ÿ

ÿ

Y *

奴隶 ON_PERMISSIVE

ÿ

ÿ

ÿ

Y *

奴隶 ON

ñ

ñ

ÿ

Y *


当前选择的 gtid_mode 也会影响 gtid_next 变量。 下表显示了服务器的不同价值观的行为 gtid_mode gtid_next 每个条目的含义如下:

  • ANONYMOUS :生成匿名事务。

  • Error :生成错误并且无法执行 SET GTID_NEXT

  • UUID:NUMBER :使用指定的UUID:NUMBER生成GTID。

  • New GTID :使用自动生成的数字生成GTID。

表17.2 gtid_mode和gtid_next的有效组合

gtid_next 自动

二进制登录

gtid_next 自动

二进制注销

gtid_next 匿名

gtid_next UUID:NUMBER

gtid_mode OFF

匿名

匿名

匿名

错误

gtid_mode OFF_PERMISSIVE

匿名

匿名

匿名

UUID:NUMBER

gtid_mode ON_PERMISSIVE

新的GTID

匿名

匿名

UUID:NUMBER

gtid_mode ON

新的GTID

匿名

错误

UUID:NUMBER


当二进制日志关闭并 gtid_next 设置 AUTOMATIC 为时,则不会生成GTID。 这与先前版本的行为一致。

17.1.5.2在线启用GTID事务

本节介绍如何在已联机且使用匿名事务的服务器上启用GTID事务以及(可选)自动定位。 此过程不需要使服务器脱机并且适合在生产中使用。 但是,如果您在启用GTID事务时可以使服务器脱机,则该过程更容易。

在开始之前,请确保服务器满足以下前提条件:

  • 拓扑中的 所有 服务器都必须使用MySQL 5.7.6或更高版本。 除非 拓扑中的 所有 服务器都使用此版本, 否则无法在任何单个服务器上联机启用GTID事务

  • 所有服务器都已 gtid_mode 设置为默认值 OFF

以下程序可以随时暂停,之后可以恢复 原状, 或者通过跳转到 第17.1.5.3节“禁用GTID在线交易” 的相应步骤进行 撤销,这是禁用GTID 的在线程序。 这使得该过程具有容错能力,因为可以像往常一样处理可能出现在过程中间的任何不相关的问题,然后该过程在其停止的地方继续。

注意

在继续下一步之前,完成每个步骤至关重要。

要启用GTID交易:

  1. 在每台服务器上,执行:

    SET @@ GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

    让服务器在正常工作负载下运行一段时间并监控日志。 如果此步骤导致日志中出现任何警告,请调整应用程序,使其仅使用与GTID兼容的功能,并且不会生成任何警告。

    重要

    这是第一个重要的步骤。 在进行下一步之前,必须确保错误日志中未生成警告。

  2. 在每台服务器上,执行:

    SET @@ GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  3. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = OFF_PERMISSIVE;

    哪个服务器首先执行此语句无关紧要,但重要的是所有服务器在任何服务器开始下一步之前完成此步骤。

  4. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = ON_PERMISSIVE;

    哪个服务器首先执行此语句无关紧要。

  5. 在每台服务器上,等待状态变量 ONGOING_ANONYMOUS_TRANSACTION_COUNT 为零。 可以使用以下方法检查:

    显示状态如'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
    注意

    在复制从站上,理论上可能会再次显示零然后非零。 这不是问题,它足以显示零一次。

  6. 等待直到步骤5生成的所有事务都复制到所有服务器。 您可以在不停止更新的情况下执行此操作:唯一重要的是所有匿名事务都会被复制。

    有关 检查所有匿名事务是否已复制到所有服务器的一种方法, 请参见 第17.1.5.4节“验证 匿名事务的复制”。

  7. 如果您将二进制日志用于复制以外的任何其他日志,例如时间点备份和还原,请等到您不需要具有没有GTID的事务的旧二进制日志。

    例如,在步骤6完成后,您可以 FLUSH LOGS 在要进行备份的服务器上 执行 然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。

    理想情况下,等待服务器清除步骤6完成时存在的所有二进制日志。 还要等待在步骤6到期之前进行的任何备份。

    重要

    这是第二个重点。 至关重要的是要了解包含匿名事务的二进制日志,在没有GTID的情况下,在下一步之后无法使用。 完成此步骤后,您必须确保拓扑中的任何位置都不存在没有GTID的事务。

  8. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = ON;
  9. 在每台服务器上,添加 gtid-mode=ON my.cnf

    现在可以保证所有事务都具有GTID(在步骤5或更早版本中生成的事务已经过处理)。 要开始使用GTID协议以便以后执行自动故障转移,请在每个从站上执行以下操作。 (可选)如果使用多源复制,请对每个通道执行此操作并包含以下 子句: FOR CHANNEL channel

    STOP SLAVE [FOR CHANNEL'channel'];
    更改MASTER_AUTO_POSITION = 1 [FOR CHANNEL'channel'];
    START SLAVE [FOR CHANNEL'channel'];

17.1.5.3在线禁用GTID事务

本节介绍如何在已联机的服务器上禁用GTID事务。 此过程不需要使服务器脱机并且适合在生产中使用。 但是,如果您在禁用GTID模式时可以使服务器脱机,则该过程更容易。

该过程类似于在服务器联机时启用GTID事务,但是反转步骤。 唯一不同的是等待记录的事务复制的点。

在开始之前,请确保服务器满足以下前提条件:

  • 拓扑中的 所有 服务器都必须使用MySQL 5.7.6或更高版本。 除非 拓扑中的 所有 服务器都使用此版本, 否则无法在任何单个服务器上联机禁用GTID事务

  • 所有服务器都 gtid_mode 设置为 ON

  • --replicate-same-server-id 选项未在任何服务器上设置。 如果此选项与 --log-slave-updates 选项(默认值) 一起设置 并且启用了二进制日志记录(这也是默认值),则 无法禁用GTID事务 如果没有GTID,这种选项组合会在循环复制中导致无限循环。

  1. 在每个从站上执行以下操作,如果使用多源复制,请为每个通道执行此操作并包含 FOR CHANNEL channel子句:

    STOP SLAVE [FOR CHANNEL'channel'];
    CHANGE MASTER TO MASTER_AUTO_POSITION = 0,MASTER_LOG_FILE = file,\
    MASTER_LOG_POS = position [FOR CHANNEL'channel'];
    START SLAVE [FOR CHANNEL'channel'];
     
  2. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = ON_PERMISSIVE;
  3. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = OFF_PERMISSIVE;
  4. 在每台服务器上,等待变量@@ GLOBAL.GTID_OWNED等于空字符串。 可以使用以下方法检查:

    SELECT @@ GLOBAL.GTID_OWNED;

    在复制从属设备上,理论上可能是空的,然后再次非空。 这不是问题,只要它是空的一次就足够了。

  5. 等待任何二进制日志中当前存在的所有事务都复制到所有从属服务器。 有关 检查所有匿名事务是否已复制到所有服务器的一种方法, 请参见 第17.1.5.4节“验证 匿名事务的复制”。

  6. 如果您将二进制日志用于复制以外的任何其他日志,例如进行时间点备份或还原:请等待,直到您不需要具有GTID事务的旧二进制日志。

    例如,在步骤5完成后,您可以 FLUSH LOGS 在要进行备份的服务器上 执行 然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。

    理想情况下,等待服务器清除步骤5完成时存在的所有二进制日志。 还要等待在步骤5之前进行的任何备份到期。

    重要

    这是此过程中的一个重点。 重要的是要了解包含GTID事务的日志在下一步之后无法使用。 在继续之前,您必须确保拓扑中的任何位置都不存在GTID事务。

  7. 在每台服务器上,执行:

    SET @@ GLOBAL.GTID_MODE = OFF;
  8. 在每个服务器上,设置 gtid-mode=OFF my.cnf

    如果你想设置 enforce_gtid_consistency=OFF ,你现在可以这样做。 设置后,您应该添加 enforce_gtid_consistency=OFF 到配置文件中。

如果要降级到早期版本的MySQL,可以使用正常的降级程序立即降级。

17.1.5.4验证匿名事务的复制

本节介绍如何监视复制拓扑并验证是否已复制所有匿名事务。 这在联机更改复制模式时很有用,因为您可以验证更改为GTID事务是否安全。

有几种方法可以等待事务复制:

最简单的方法,无论您的拓扑结构如何工作,但依赖于时序如下:如果您确定从站永远不会滞后超过N秒,则只需等待超过N秒。 或者等待一天,或者您认为安全部署的任何时间段。

一种更安全的方法,它不依赖于时间:如果您只有一个或多个从站的主站,请执行以下操作:

  1. 在主服务器上,执行:

    显示主要状态;

    记下 File Position 列中 的值

  2. 在每个从站上,使用主站的文件和位置信息执行:

    SELECT MASTER_POS_WAIT(文件,位置);

如果您有一个主站和多个级别的从站,或者换句话说您有从站的从站,请在每个级别上重复步骤2,从主站开始,然后是所有直接从站,然后是从站的所有从站,依此类推。

如果使用循环复制拓扑,其中多个服务器可能具有写入客户端,请对每个主从连接执行步骤2,直到完成整个循环。 重复整个过程,以便完成 两次 完整的循环

例如,假设您有三个服务器A,B和C,以圆形复制,以便A - > B - > C - > A.过程如下:

  • 在A上执行步骤1,在B上执行步骤2。

  • 在B上执行步骤1,在C上执行步骤2。

  • 在C上执行步骤1,在A上执行步骤2。

  • 在A上执行步骤1,在B上执行步骤2。

  • 在B上执行步骤1,在C上执行步骤2。

  • 在C上执行步骤1,在A上执行步骤2。

17.1.6复制和二进制日志记录选项和变量

以下部分包含有关 在复制和控制二进制日志中使用的 mysqld 选项和服务器变量的 信息 复制主服务器和复制从服务器上使用的选项和变量分别包含在内,与二进制日志记录和全局事务标识符(GTID)相关的选项和变量也是如此。 还包括一组快速参考表,提供有关这些选项和变量的基本信息。

特别重要的是 --server-id 选择权。

属性
命令行格式 --server-id=#
系统变量 server_id
范围 全球
动态
SET_VAR 提示适用 没有
类型 整数
默认值 (> = 8.0.3) 1
默认值 (<= 8.0.2) 0
最低价值 0
最大价值 4294967295

指定服务器ID。 server_id 系统变量被默认设置为1。 可以使用此缺省ID启动服务器,但是启用二进制日志记录时,如果未使用该 --server-id 选项 明确指定服务器标识,则会发出信息性消息

对于复制拓扑中使用的服务器,必须为每个复制服务器指定唯一的服务器ID,范围为1到2 32 - 1. 唯一 表示每个ID必须与正在使用的每个其他ID不同任何其他复制主机或从机。 有关其他信息,请参见 第17.1.6.2节“复制主选项和变量” 第17.1.6.3节“复制从选项和变量”

如果服务器ID设置为0,则进行二进制日志记录,但服务器ID为0的主服务器拒绝来自从服务器的任何连接,服务器ID为0的从服务器拒绝连接到主服务器。 请注意,虽然您可以将服务器ID动态更改为非零值,但这样做不会立即启动复制。 您必须更改服务器ID,然后重新启动服务器以初始化复制从站。

有关更多信息,请参见 第17.1.2.2节“设置复制从站配置”

server_uuid

除了在 server_id 系统变量中 设置的默认或用户提供的服务器ID之外,MySQL服务器还会生成真正的UUID 这可用作全局只读变量 server_uuid

注意

所述的存在 server_uuid 系统变量不用于设置一个唯一的改变的要求 --server-id 为每个MySQL服务器作为制备和运行MySQL复制,如前面在本节中描述的组成部分。

属性
系统变量 server_uuid
范围 全球
动态 没有
SET_VAR 提示适用 没有
类型

启动时,MySQL服务器自动获取UUID,如下所示:

  1. 尝试读取和使用文件中写入的UUID data_dir/auto.cnf data_dir 服务器的数据目录 在哪里 )。

  2. 如果 data_dir/auto.cnf 未找到,请生成新的UUID并将其保存到此文件,并在必要时创建该文件。

auto.cnf 文件的格式类似于用于 my.cnf my.ini 文件的格式。 auto.cnf 只有一个 [auto] 部分包含一个 server_uuid 设置和值; 文件的内容与此处显示的内容类似:

[汽车]
server_uuid = 8a94f357-aab4-11df-86ab-c80aa9429562
重要

auto.cnf 文件是自动生成的; 不要尝试编写或修改此文件。

使用MySQL复制时,主服务器和从服务器知道彼此的UUID。 从属的UUID的值可以在输出中看到 SHOW SLAVE HOSTS 一旦 START SLAVE 执行,主机的UUID的值在输出中的从机上可用 SHOW SLAVE STATUS

注意

发出 STOP SLAVE RESET SLAVE 语句也 不会 重置主人的UUID在从属的使用。

服务器 server_uuid 也在GTID中用于源自该服务器的事务。 有关更多信息,请参见 第17.1.3节“使用全局事务标识符进行复制”

启动时,从属I / O线程会生成错误并在其主控器的UUID等于其自身的情况下中止,除非 --replicate-same-server-id 已设置 选项。 此外,如果满足以下任一条件,则从属I / O线程会生成警告:

17.1.6.1复制和二进制日志选项和变量引用

以下两个列表提供了有关适用于复制的MySQL命令行选项和系统变量以及二进制日志的基本信息。

以下列表中的命令行选项和系统变量与复制主服务器和复制从服务器相关。 第17.1.6.2节“复制主选项和变量” 提供了有关复制主服务器的选项和变量的更多详细信息。 有关与复制从站相关的选项和变量的更多信息,请参见 第17.1.6.3节“复制从站选项和变量”

以下列表中的命令行选项和系统变量与二进制日志有关。 第17.1.6.4节“二进制日志选项和变量” 提供了有关 二进制日志记录的选项和变量的 更多详细信息。 有关二进制日志的其他一般信息,请参见 第5.4.4节“二进制日志”

有关 mysqld 使用 所有 命令行选项,系统和状态变量 的列表 ,请参见 第5.1.4节“服务器选项,系统变量和状态变量参考”

17.1.6.2复制主选项和变量

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

在主服务器和每个从服务器上,必须使用该 server-id 选项来建立唯一的复制ID。 对于每个服务器,您应该选择1到2 32 - 1 范围内的唯一正整数 ,并且每个ID必须与任何其他复制主服务器或从服务器使用的每个其他ID不同。 示例: server-id=3

有关主站用于控制二进制日志 记录的选项 ,请参见 第17.1.6.4节“二进制日志记录选项和变量”

复制主机的启动选项

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

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

以下系统变量用于复制主机或由复制主机使用:

  • auto_increment_increment

    属性
    命令行格式 --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 到非整数值会产生错误,并且变量的实际值保持不变。

    从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限”

    注意

    auto_increment_increment 也支持与 NDB 一起使用

    在服务器上启动组复制时,值 auto_increment_increment 将更改为值 group_replication_auto_increment_increment ,默认值为7,值 auto_increment_offset 更改为服务器ID。 停止组复制时,将还原更改。 这些变化只发和恢复,如果 auto_increment_increment auto_increment_offset 各有如果他们的价值已经从默认修改1.缺省值,组复制不会改变它们。 从MySQL 8.0开始,当组复制处于单主模式时,系统变量也不会被修改,其中只有一个服务器写入。

    auto_increment_increment auto_increment_offset 影响 AUTO_INCREMENT 列行为,如下所示:

    • auto_increment_increment 控制连续列值之间的间隔。 例如:

      MySQL的> SHOW VARIABLES LIKE 'auto_inc%';
      + -------------------------- + ------- +
      | Variable_name | 价值|
      + -------------------------- + ------- +
      | auto_increment_increment | 1 |
      | auto_increment_offset | 1 |
      + -------------------------- + ------- +
      2行(0.00秒)
      
      mysql> CREATE TABLE autoinc1
          - >(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
        查询正常,0行受影响(0.04秒)
      
      MySQL的> SET @@auto_increment_increment=10;
      查询正常,0行受影响(0.00秒)
      
      MySQL的> SHOW VARIABLES LIKE 'auto_inc%';
      + -------------------------- + ------- +
      | Variable_name | 价值|
      + -------------------------- + ------- +
      | auto_increment_increment | 10 |
      | auto_increment_offset | 1 |
      + -------------------------- + ------- +
      2行(0.01秒)
      
      MySQL的> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
      查询OK,4行受影响(0.00秒)
      记录:4个重复:0警告:0
      
      MySQL的> SELECT col FROM autoinc1;
      + ----- +
      | col |
      + ----- +
      | 1 |
      | 11 |
      | 21 |
      | 31 |
      + ----- +
      4行(0.00秒)
      
    • auto_increment_offset 确定 AUTO_INCREMENT 列值 的起点 请考虑以下情况,假设这些语句在与以下描述中给出的示例相同的会话期间执行 auto_increment_increment

      MySQL的> SET @@auto_increment_offset=5;
      查询正常,0行受影响(0.00秒)
      
      MySQL的> SHOW VARIABLES LIKE 'auto_inc%';
      + -------------------------- + ------- +
      | Variable_name | 价值|
      + -------------------------- + ------- +
      | auto_increment_increment | 10 |
      | auto_increment_offset | 5 |
      + -------------------------- + ------- +
      2行(0.00秒)
      
      mysql> CREATE TABLE autoinc2
          - >(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
      查询正常,0行受影响(0.06秒)
      
      MySQL的> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
      查询OK,4行受影响(0.00秒)
      记录:4个重复:0警告:0
      
      MySQL的> SELECT col FROM autoinc2;
      + ----- +
      | col |
      + ----- +
      | 5 |
      | 15 |
      | 25 |
      | 35 |
      + ----- +
      4行(0.02秒)
      

      当值 auto_increment_offset 大于 auto_increment_increment 的值时, auto_increment_offset 忽略

    如果更改了这些变量中的任何一个,然后将新行插入到包含 AUTO_INCREMENT 的表中 ,则结果可能看似违反直觉,因为 AUTO_INCREMENT 计算 一系列 值时不考虑列中已存在的任何值,并且插入的下一个值是系列中的最小值大于 AUTO_INCREMENT 列中 的最大现有值 该系列计算如下:

    auto_increment_offset + N × auto_increment_increment

    where N 是系列[1,2,3,...]中的正整数值。 例如:

    MySQL的> SHOW VARIABLES LIKE 'auto_inc%';
    + -------------------------- + ------- +
    | Variable_name | 价值|
    + -------------------------- + ------- +
    | auto_increment_increment | 10 |
    | auto_increment_offset | 5 |
    + -------------------------- + ------- +
    2行(0.00秒)
    
    MySQL的> SELECT col FROM autoinc1;
    + ----- +
    | col |
    + ----- +
    | 1 |
    | 11 |
    | 21 |
    | 31 |
    + ----- +
    4行(0.00秒)
    
    MySQL的> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
    查询OK,4行受影响(0.00秒)
    记录:4个重复:0警告:0
    
    MySQL的> SELECT col FROM autoinc1;
    + ----- +
    | col |
    + ----- +
    | 1 |
    | 11 |
    | 21 |
    | 31 |
    | 35 |
    | 45 |
    | 55 |
    | 65 |
    + ----- +
    8行(0.00秒)
    

    显示的值 auto_increment_increment auto_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_increment 1.请参见 第17.4.1.1节“复制和AUTO_INCREMENT”

  • auto_increment_offset

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

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

    从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限”

    注意

    auto_increment_offset 也支持与 NDB 一起使用

  • immediate_server_version

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

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

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

    设置此系统变量的会话值是受限制的操作。 请参见 第5.1.9.1节“系统变量权限” 但是,请注意该变量不是供用户设置的; 它由复制基础结构自动设置。

  • original_server_version

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

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

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

    在组复制环境中,视图更改日志事件(即新成员加入组时由每个组成员排队的特殊事务)使用排队事务的组成员的服务器版本进行标记。 这确保了加入成员已知原始捐赠者的服务器版本。 由于排队等待特定视图更改的视图更改日志事件在所有成员上具有相同的GTID,因此仅对于此情况,同一GTID的实例可能具有不同的原始服务器版本。

    设置此系统变量的会话值是受限制的操作。 请参见 第5.1.9.1节“系统变量权限” 但是,请注意该变量不是供用户设置的; 它由复制基础结构自动设置。

  • rpl_semi_sync_master_enabled

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

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

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

  • rpl_semi_sync_master_timeout

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

    一个以毫秒为单位的值,用于控制主机在超时并恢复到异步复制之前等待提交来自从机的确认的时间。 默认值为10000(10秒)。

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

  • rpl_semi_sync_master_trace_level

    属性
    命令行格式 --rpl-semi-sync-master-trace-level=#
    系统变量 rpl_semi_sync_master_trace_level
    范围 全球
    动态
    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
    范围 全球
    动态
    SET_VAR 提示适用 没有
    类型 整数
    默认值 1
    最低价值 1
    最大价值 65535

    主服务器必须在继续之前必须接收的从服务确认数。 缺省情况下 rpl_semi_sync_master_wait_for_slave_count 1 ,这意味着接收一个从机确认之后半同步复制进行。 性能最适合此变量的小值。

    例如,如果 rpl_semi_sync_master_wait_for_slave_count 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
    范围 全球
    动态
    SET_VAR 提示适用 没有
    类型 布尔
    默认值 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_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
    范围 全球
    动态
    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及更高版本。

17.1.6.3复制从属选项和变量

本节介绍适用于从属复制服务器的服务器选项和系统变量,并包含以下内容:

命令行 选项文件 中指定 选项 使用该 CHANGE MASTER TO 语句 可以在服务器运行时设置许多选项 使用指定系统变量值 SET

服务器ID。  在主服务器和每个从服务器上,必须使用该 server-id 选项来建立1到2 32 到1之间的唯一复制ID 唯一 表示每个ID必须与任何其他复制主服务器使用的每个其他ID不同或奴隶。 示例 my.cnf 文件:

的[mysqld]
服务器ID = 3
复制从站的启动选项

本节介绍用于控制复制从属服务器的启动选项。 通过使用该 CHANGE MASTER TO 语句, 可以在服务器运行时设置其中许多选项 其他 --replicate-* 选项 (例如 选项)只能在从属服务器启动时设置。 与复制相关的系统变量将在本节后面讨论。

  • --log-slave-updates

    属性
    命令行格式 --log-slave-updates[={OFF|ON}]
    系统变量 log_slave_updates
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 布尔
    默认值 (> = 8.0.3) ON
    默认值 (<= 8.0.2) OFF

    此选项使从服务器写入更新,这些更新是从主服务器接收的,并由从服务器的SQL线程执行到从属的自己的二进制日志。 --log-bin 必须在从站上启用由选项 控制 并且默认启用的 二进制日志记录,以便记录 更新。 --log-slave-updates 默认情况下启用,除非您指定 --skip-log-bin 禁用二进制日志记录,在这种情况下,MySQL还会默认禁用从站更新日志记录。 如果在启用二进制日志记录时需要禁用从站更新日志记录,请指定 --skip-log-slave-updates

    --log-slave-updates 使复制服务器可以链接。 例如,您可能希望使用以下安排设置复制服务器:

    A  - > B  - > C.
    

    在这里, A 作为奴隶的主人 B ,并 B 作为奴隶的主人 C 为此, B 必须是主人 奴隶。 通过二进制日志记录和 --log-slave-updates 启用选项(默认设置),接收到的更新 A 将记录 B 到其二进制日志中,因此可以传递给 C

  • --master-info-file=file_name

    属性
    命令行格式 --master-info-file=file_name
    类型 文件名
    默认值 master.info

    主信息日志的名称,如果 --master-info-repository=FILE 已设置。 默认名称 master.info 位于数据目录中。 --master-info-repository=FILE 现已弃用。 有关主信息日志的信息,请参见 第17.2.4.2节“从属状态日志”

  • --master-retry-count=count

    属性
    命令行格式 --master-retry-count=#
    弃用
    类型 整数
    默认值 86400
    最低价值 0
    最大值 (64位平台) 18446744073709551615
    最大值 (32位平台) 4294967295

    在放弃之前,从设备尝试重新连接到主设备的次数。 默认值为86400次。 值0表示 无限 ,从站尝试永久连接。 当从站达到其连接超时(由 --slave-net-timeout 选项 指定 )而不接收来自主站的数据或心跳信号 时,将触发重新连接尝试 MASTER_CONNECT_RETRY 按照 CHANGE MASTER TO 语句 选项 设置的间隔尝试重新连接 (默认为每60秒)。

    此选项已弃用,将在以后的MySQL版本中删除。 请改用 语句 MASTER_RETRY_COUNT 选项 CHANGE MASTER TO

  • --max-relay-log-size=size

    属性
    命令行格式 --max-relay-log-size=#
    系统变量 max_relay_log_size
    范围 全球
    动态
    SET_VAR 提示适用 没有
    类型 整数
    默认值 0
    最低价值 0
    最大价值 1073741824

    服务器自动轮换中继日志文件的大小。 如果此值非零,则当其大小超过此值时,将自动轮换中继日志。 如果此值为零(默认值),则中继日志轮换发生的大小由值决定 max_binlog_size 有关更多信息,请参见 第17.2.4.1节“从站中继日志”

  • --relay-log=file_name

    属性
    命令行格式 --relay-log=file_name
    系统变量 relay_log
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 文件名

    中继日志的基本名称。 服务器通过向基本名称添加数字后缀来按顺序创建中继日志文件。

    对于默认复制通道,中继日志的默认基本名称是 host_name-relay-bin 使用主机名称。 对于非默认复制通道,中继日志的默认基本名称是 此中继日志中记录的复制通道的名称。 host_name-relay-bin-channel channel

    中继日志文件的默认位置是数据目录。 您可以使用该 --relay-log 选项指定备用位置,方法是在基本名称中添加前导绝对路径名以指定其他目录。

    复制服务器上的中继日志和中继日志索引的名称不能与二进制日志和二进制日志索引相同,其名称由 --log-bin --log-bin-index 选项 指定 服务器发出错误消息,如果二进制日志和中继日志文件基本名称相同,则不会启动。

    由于MySQL解析服务器选项的方式,如果指定此选项,则必须提供值; 仅当未实际指定选项时才使用默认基本名称 如果在 --relay-log 未指定值的情况下 使用该 选项,则可能会导致意外行为; 此行为取决于使用的其他选项,指定它们的顺序,以及它们是在命令行还是在选项文件中指定的。 有关MySQL如何处理服务器选项的更多信息,请参见 第4.2.2节“指定程序选项”

    如果指定此选项,则指定的值也将用作中继日志索引文件的基本名称。 您可以通过使用该 --relay-log-index 选项 指定其他中继日志索引文件基本名称来覆盖此行为

    当服务器从索引文件中读取条目时,它会检查条目是否包含相对路径。 如果是,则使用该 --relay-log 选项 将路径的相对部分替换为设置的绝对路径 绝对路径保持不变; 在这种情况下,必须手动编辑索引以启用新路径。 以前,每次重定位二进制日志或中继日志文件时都需要手动干预。 (Bug#11745230,Bug#12133)

    您可能会发现该 --relay-log 选项对执行以下任务很有用:

    • 创建名称独立于主机名的中继日志。

    • 如果您需要将中继日志放在数据目录以外的某个区域,因为您的中继日志往往非常大并且您不想减少 max_relay_log_size

    • 通过在磁盘之间使用负载平衡来提高速度。

    您可以从 relay_log_basename 系统变量中 获取中继日志文件名(和路径)

  • --relay-log-index=file_name

    属性
    命令行格式 --relay-log-index=file_name
    系统变量 relay_log_index
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 文件名

    中继日志索引文件的名称。 如果未指定该 --relay-log-index 选项,但 指定了该 选项, --relay-log 则其值将用作中继日志索引文件的缺省基本名称。 如果 --relay-log 未指定 选项,则对于默认复制通道,默认名称为 host_name-relay-bin.index ,使用主机名称。 对于非默认复制通道,默认名称为 ,其中 是此中继日志索引中记录的复制通道的名称。 host_name-relay-bin-channel.index channel

    中继日志文件的缺省位置是数据目录,或使用该 --relay-log 选项 指定的任何其他位置 您可以使用该 --relay-log-index 选项指定备用位置,方法是在基本名称中添加前导绝对路径名以指定其他目录。

    复制服务器上的中继日志和中继日志索引的名称不能与二进制日志和二进制日志索引相同,其名称由 --log-bin --log-bin-index 选项 指定 服务器发出错误消息,如果二进制日志和中继日志文件基本名称相同,则不会启动。

    由于MySQL解析服务器选项的方式,如果指定此选项,则必须提供值; 仅当未实际指定选项时才使用默认基本名称 如果在 --relay-log-index 未指定值的情况下 使用该 选项,则可能会导致意外行为; 此行为取决于使用的其他选项,指定它们的顺序,以及它们是在命令行还是在选项文件中指定的。 有关MySQL如何处理服务器选项的更多信息,请参见 第4.2.2节“指定程序选项”

  • --relay-log-info-file=file_name

    属性
    命令行格式 --relay-log-info-file=file_name
    类型 文件名
    默认值 relay-log.info

    中继日志信息文件的名称,如果 --relay-log-info-repository 设置为FILE。 默认名称 relay-log.info 位于数据目录中。 --relay-log-info-repository=FILE 现已弃用。 有关中继日志信息日志的信息,请参见 第17.2.4.2节“从属状态日志”

  • --relay-log-purge={0|1}

    属性
    命令行格式 --relay-log-purge[={OFF|ON}]
    系统变量 relay_log_purge
    范围 全球
    动态
    SET_VAR 提示适用 没有
    类型 布尔
    默认值 ON

    一旦不再需要,就禁用或启用自动清除中继日志。 默认值为1(启用)。 这是一个可以动态更改的全局变量 使用该 选项 时禁用中继日志清除 可能会导致数据一致性,因此不会出现崩溃安全问题。 SET GLOBAL relay_log_purge = N --relay-log-recovery

  • --relay-log-recovery={0|1}

    属性
    命令行格式 --relay-log-recovery[={OFF|ON}]
    类型 布尔
    默认值 OFF

    在服务器启动后立即启用自动中继日志恢复。 恢复过程会创建一个新的中继日志文件,将SQL线程位置初始化为此新的中继日志,并将I / O线程初始化为SQL线程位置。 然后继续从主站读取中继日志。 这应该在复制从站崩溃后使用,以确保不会处理可能损坏的中继日志。 默认值为0(禁用)。

    要提供防碰撞从站,必须启用此选项(设置为1), --relay-log-info-repository 必须将其设置为 TABLE ,并且 relay-log-purge 必须启用 此选项 启用 --relay-log-recovery 选项时, relay-log-purge 被禁用的风险从没有清除文件中读取中继日志,从而导致数据不一致,因此是不会崩溃安全。 有关 详细信息, 请参阅 使复制适应意外暂停

    使用多线程从站(换句话说 slave_parallel_workers ,大于0)时,从中继日志执行的事务序列中可能会出现间隙等不一致。 --relay-log-recovery 当存在不一致时 启用该 选项会导致错误,该选项无效。 这种情况下的解决方案是发布 START SLAVE UNTIL SQL_AFTER_MTS_GAPS ,它使服务器处于更一致的状态,然后发出 RESET SLAVE 删除中继日志的问题。 有关 更多信息 请参见 第17.4.1.33节“复制和事务不一致”

  • --relay-log-space-limit=size

    属性
    命令行格式 --relay-log-space-limit=#
    系统变量 relay_log_space_limit
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 整数
    默认值 0
    最低价值 0
    最大值 (64位平台) 18446744073709551615
    最大值 (32位平台) 4294967295

    此选项对从站上所有中继日志的总大小(以字节为单位)设置上限。 值为0表示 无限制 这对于磁盘空间有限的从属服务器主机很有用。 达到限制时,I / O线程将停止从主服务器读取二进制日志事件,直到SQL线程赶上并删除了一些未使用的中继日志。 请注意,此限制不是绝对的:在某些情况下,SQL线程在删除中继日志之前需要更多事件。 在这种情况下,I / O线程超出限制,直到SQL线程可以删除某些中继日志,因为不这样做会导致死锁。 您不应该设置 --relay-log-space-limit 为小于 --max-relay-log-size (或 --max-binlog-size 如果) 的值的两倍 --max-relay-log-size 是0)。 在这种情况下,I / O线程有可能因为 --relay-log-space-limit 超出而 等待可用空间 ,但SQL线程没有要清除的中继日志,并且无法满足I / O线程。 这会强制I / O线程 --relay-log-space-limit 暂时 忽略

  • --replicate-do-db=db_name

    属性
    命令行格式 --replicate-do-db=name
    类型

    使用数据库名称创建复制筛选器。 也可以使用这样的过滤器创建 CHANGE REPLICATION FILTER REPLICATE_DO_DB

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-do-db:channel_1:db_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    此复制筛选器的确切效果取决于是使用基于语句还是基于行的复制。

    基于语句的复制。  告诉从SQL线程限制复制到报表,其中默认的数据库(即,由选定的一个 USE )是 db_name 要指定多个数据库,请多次使用此选项,每个数据库使用一次; 但是,这样做 不会 复制跨数据库语句,例如 在选择不同的数据库(或没有数据库)时。 UPDATE some_db.some_table SET foo='bar'

    警告

    要指定多个数据库, 必须 使用此选项的多个实例。 因为数据库名称可以包含逗号,所以如果提供以逗号分隔的列表,则该列表将被视为单个数据库的名称。

    使用基于语句的复制时无法正常工作的示例:如果从属服务器启动 --replicate-do-db=sales 并且您在主服务器上发出以下语句, UPDATE 不会 复制 语句

    使用价格;
    更新sales.january SET金额=金额+ 1000;
    

    这种 仅检查默认数据库 行为的 主要原因 是,仅从语句中就很难知道是否应该复制它(例如,如果您使用多表 DELETE 语句或多表 UPDATE 语句跨多个数据库)。 如果不需要,只检查默认数据库而不是所有数据库也更快。

    基于行的复制。  告诉从属SQL线程限制复制到数据库 db_name 只有属于的表 db_name 被更改; 当前数据库对此没有影响。 假设从属服务器启动 --replicate-do-db=sales 并且基于行的复制生效,然后在主服务器上运行以下语句:

    使用价格;
    UPDATE sales.february SET amount = amount + 100;
    

    从属数据库中 february sales 根据 UPDATE 语句进行 更改 ; 无论 USE 声明 是否 已发布,都会 发生这种情况 但是,在使用基于行的复制时,在主服务器上发出以下语句对从服务器没有影响,并且 --replicate-do-db=sales

    使用价格;
    更新price.march SET金额=金额-25;
    

    即使声明 USE prices 改为 USE sales UPDATE 声明的效果仍然不会被复制。

    --replicate-do-db 对于引用多个数据库的语句,基于语句的复制与基于行的复制相比,处理方式的 另一个重要区别 假设从属服务器启动 --replicate-do-db=db1 ,并在主服务器上执行以下语句:

    使用db1;
    UPDATE db1.table1 SET col1 = 10,db2.table2 SET col2 = 20;
    

    如果使用基于语句的复制,则会在从属服务器上更新这两个表。 但是,使用基于行的复制时,只会 table1 受到奴隶的影响; 因为 table2 是在不同的数据库中, table2 所以奴隶不会被改变 UPDATE 现在假设 使用 USE db1 了一个 USE db4 语句 而不是 语句

    使用db4;
    UPDATE db1.table1 SET col1 = 10,db2.table2 SET col2 = 20;
    

    在这种情况下, UPDATE 使用基于语句的复制时 ,该 语句对从站没有影响。 但是,如果使用基于行的复制, UPDATE 则会 table1 在从属服务器上进行 更改 ,但不会 table2 - 也就是说,只 --replicate-do-db 更改 了名为的数据库中的表 ,并且选择默认数据库对此行为没有影响。

    如果需要跨数据库更新才能工作,请 改用。 请参见 第17.2.5节“服务器如何评估复制过滤规则” --replicate-wild-do-table=db_name.%

    注意

    此选项以 --binlog-do-db 影响二进制日志记录 的相同方式影响复制, 复制格式对 --replicate-do-db 影响复制行为的影响与对行为的日志记录格式的影响相同 --binlog-do-db

    此选项没有影响 BEGIN COMMIT 或者 ROLLBACK 语句。

  • --replicate-ignore-db=db_name

    属性
    命令行格式 --replicate-ignore-db=name
    类型

    使用数据库名称创建复制筛选器。 也可以使用这样的过滤器创建 CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-ignore-db:channel_1:db_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    要指定要忽略的多个数据库,请多次使用此选项,每个数据库使用一次。 因为数据库名称可以包含逗号,所以如果提供以逗号分隔的列表,则该列表将被视为单个数据库的名称。

    与此同时 --replicate-do-db ,此过滤的确切效果取决于是使用基于语句还是基于行的复制,并在接下来的几段中进行了描述。

    基于语句的复制。  告诉slave SQL线程不会复制任何声明,其中默认的数据库(即,由选定的一个 USE )是 db_name

    基于行的复制。  告诉从属SQL线程不更新数据库中的任何表 db_name 默认数据库无效。

    使用基于语句的复制时,以下示例无法正常工作。 假设从属服务器启动 --replicate-ignore-db=sales 并在主服务器上发出以下语句:

    使用价格;
    更新sales.january SET金额=金额+ 1000;
    

    UPDATE 声明 在这种情况下复制,因为 --replicate-ignore-db 只适用于默认数据库(由确定的 USE 语句)。 由于 sales 数据库是在语句中显式指定的,因此该语句尚未过滤。 但是,使用基于行的复制时, UPDATE 语句的效果 不会 传播到从属,并且表的从属副本 sales.january 不会更改。 在这种情况下, --replicate-ignore-db=sales 导致 对主副本中的表所做的 所有 更改 sales 数据库被奴隶忽略。

    如果您使用跨数据库更新并且不希望复制这些更新,则不应使用此选项。 请参见 第17.2.5节“服务器如何评估复制过滤规则”

    如果需要跨数据库更新才能工作,请 改用。 请参见 第17.2.5节“服务器如何评估复制过滤规则” --replicate-wild-ignore-table=db_name.%

    注意

    此选项以 --binlog-ignore-db 影响二进制日志记录 的相同方式影响复制, 复制格式对 --replicate-ignore-db 影响复制行为的影响与对行为的日志记录格式的影响相同 --binlog-ignore-db

    此选项没有影响 BEGIN COMMIT 或者 ROLLBACK 语句。

  • --replicate-do-table=db_name.tbl_name

    属性
    命令行格式 --replicate-do-table=name
    类型

    通过告知从属SQL线程将复制限制到给定表来创建复制筛选器。 要指定多个表,请多次使用此选项,每个表使用一次。 与之相反,这适用于跨数据库更新和默认数据库更新 --replicate-do-db 请参见 第17.2.5节“服务器如何评估复制过滤规则” 您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_DO_TABLE 语句 来创建此类过滤器

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-do-table:channel_1:db_name.tbl_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    此选项仅影响适用于表的语句。 它不会影响仅适用于其他数据库对象的语句,例如存储的例程。 要过滤在存储例程上运行的语句,请使用一个或多个 --replicate-*-db 选项。

  • --replicate-ignore-table=db_name.tbl_name

    属性
    命令行格式 --replicate-ignore-table=name
    类型

    通过告知从属SQL线程不复制任何更新指定表的语句来创建复制过滤器,即使任何其他表可能由同一语句更新。 要指定多个要忽略的表,请多次使用此选项,每个表一次。 与之相反,这适用于跨数据库更新 --replicate-ignore-db 请参见 第17.2.5节“服务器如何评估复制过滤规则” 您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE 语句 来创建此类过滤器

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-ignore-table:channel_1:db_name.tbl_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    此选项仅影响适用于表的语句。 它不会影响仅适用于其他数据库对象的语句,例如存储的例程。 要过滤在存储例程上运行的语句,请使用一个或多个 --replicate-*-db 选项。

  • --replicate-rewrite-db=from_name->to_name

    属性
    命令行格式 --replicate-rewrite-db=old_name->new_name
    类型

    告诉从创建转换的默认数据库复制过滤器(即,通过选择的一个 USE ),以 to_name 如果它是 from_name 在主。 只有涉及表的语句才会受到影响(不是语句,如 CREATE DATABASE DROP DATABASE ALTER DATABASE ),并且只有 from_name 在主服务器上是默认数据库时 才会 受到影响 要指定多次重写,请多次使用此选项。 服务器使用第一个 from_name 匹配值 的服务器 数据库名称转换在 之前 完成 --replicate-* 规则经过测试。 您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB 语句 来创建此类过滤器

    如果在命令行中使用此选项,并且该 > 字符对于命令解释程序是特殊的,请引用选项值。 例如:

    外壳> mysqld --replicate-rewrite-db="olddb->newdb"
    

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 指定通道名称后跟冒号,然后指定过滤器规范。 第一个冒号被解释为分隔符,任何后续冒号都被解释为文字冒号。 例如,在名为的通道上配置通道特定的复制筛选器 channel_1 ,请使用:

    外壳> mysqld --replicate-rewrite-db=channel_1:db_name1->db_name2
    

    如果使用冒号但未指定通道名称,则该选项会为默认复制通道配置复制筛选器。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器”

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    使用此选项时表名使用数据库名限定的语句不适用于表级复制过滤选项,例如 --replicate-do-table 假设我们有一个 a 在master上 命名的数据库 ,一个 b 在slave上 命名 ,每个包含一个表 t ,并且已经启动了master --replicate-rewrite-db='a->b' 在稍后的时间点,我们执行 DELETE FROM a.t 在这种情况下,没有相关的过滤规则有效,原因如下:

    1. --replicate-do-table=a.t 因为slave t 在数据库中 有表 所以不起作用 b

    2. --replicate-do-table=b.t 与原始语句不匹配,因此被忽略。

    3. --replicate-do-table=*.t 处理方式相同 --replicate-do-table=a.t ,因此也不起作用。

    同样,该 --replication-rewrite-db 选项不适用于跨数据库更新。

  • --replicate-same-server-id

    属性
    命令行格式 --replicate-same-server-id[={OFF|ON}]
    类型 布尔
    默认值 OFF

    此选项适用于复制从属服务器。 默认值为0( FALSE )。 如果将此选项设置为1( TRUE ),则从属设备不会跳过具有自己的服务器ID的事件。 此设置通常仅在罕见配置中有用。

    在复制从站上启用二进制日志记录时, 如果服务器是循环复制拓扑的一部分,则从属服务器上 --replicate-same-server-id --log-slave-updates 选项 组合 可能会导致复制中出现无限循环。 (在MySQL 8.0中,默认情况下启用二进制日志记录,启用二进制日志记录时,从属更新日志记录是默认值。)但是,使用全局事务标识符(GTID)可以通过跳过已经执行的事务来防止这种情况应用。 如果 gtid_mode=ON 在从站上设置,您可以使用此组合选项启动服务器,但在服务器运行时无法更改为任何其他GTID模式。 如果设置了任何其他GTID模式,则服务器不会以此选项组合启动。

    默认情况下,如果从属I / O线程具有从属服务器ID(此优化有助于节省磁盘使用),则从属I / O线程不会将二进制日志事件写入中继日志。 如果要使用 --replicate-same-server-id ,请确保在使从属设备读取您希望从属SQL线程执行的事件之前,使用此选项启动从属设备。

  • --replicate-wild-do-table=db_name.tbl_name

    属性
    命令行格式 --replicate-wild-do-table=name
    类型

    通过告知从属线程将复制限制为任何更新的表与指定的数据库和表名模式匹配的语句来创建复制过滤器。 模式可以包含 通配符 % _ 通配符,其含义与 LIKE 模式匹配运算符的 含义相同 要指定多个表,请多次使用此选项,每个表使用一次。 这适用于跨数据库更新。 请参见 第17.2.5节“服务器如何评估复制过滤规则” 您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE 语句 来创建此类过滤器

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-wild-do-table:channel_1:db_name.tbl_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    此选项适用于表,视图和触发器。 它不适用于存储过程和函数或事件。 要过滤对后一个对象进行操作的语句,请使用一个或多个 --replicate-*-db 选项。

    例如, --replicate-wild-do-table=foo%.bar% 仅复制使用数据库名称以 foo 表开头且表名开头的表的更新 bar

    如果表名称模式 % ,它匹配任何表名和选项也适用于数据库级的语句( CREATE DATABASE DROP DATABASE ,和 ALTER DATABASE )。 例如,如果使用 --replicate-wild-do-table=foo%.% ,则在数据库名称与模式匹配时复制数据库级语句 foo%

    要在数据库或表名模式中包含文字通配符,请使用反斜杠对其进行转义。 例如,要复制已命名 my_own%db 但不从 my1ownAABCdb 数据库 复制表的 数据库的 所有表 ,您应该转义 _ 和这样的 % 字符: --replicate-wild-do-table=my\_own\%db 如果在命令行上使用该选项,则可能需要将反斜杠加倍或引用选项值,具体取决于命令解释程序。 例如,使用 bash shell,您需要键入 --replicate-wild-do-table=my\\_own\\%db

  • --replicate-wild-ignore-table=db_name.tbl_name

    属性
    命令行格式 --replicate-wild-ignore-table=name
    类型

    创建一个复制过滤器,使从属线程不会复制任何表与给定通配符模式匹配的语句。 要指定多个要忽略的表,请多次使用此选项,每个表一次。 这适用于跨数据库更新。 请参见 第17.2.5节“服务器如何评估复制过滤规则” 您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE 语句 来创建此类过滤器

    此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。 在名为 channel_1 use 的通道上配置通道特定的复制筛选器 在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。 有关 更多信息 请参见 第17.2.5.4节“基于复制通道的过滤器” --replicate-wild-ignore:channel_1:db_name.tbl_name

    注意

    全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。 特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。 他们不能对使用 group_replication_applier group_replication_recovery 通道。

    例如, --replicate-wild-ignore-table=foo%.bar% 不复制使用数据库名称以 foo 表开头且表名开头的表的更新 bar 有关匹配如何工作的信息,请参阅该 --replicate-wild-do-table 选项 的说明 在选项值中包含文字通配符的规则也是相同的 --replicate-wild-ignore-table

  • --report-host=host_name

    属性
    命令行格式 --report-host=host_name
    系统变量 report_host
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型

    从站注册期间要向主站报告的从站的主机名或IP地址。 该值显示在 SHOW SLAVE HOSTS 主服务器 的输出中 如果您不希望从站向主站注册自己,请保留未设置的值。

    注意

    主设备在从设备连接后从TCP / IP套接字中简单地读取从设备的IP地址是不够的。 由于NAT和其他路由问题,该IP可能无法从主服务器或其他主机连接到从服务器。

  • --report-password=password

    属性
    命令行格式 --report-password=name
    系统变量 report_password
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型

    从站注册期间要向主站报告的从站的帐户密码。 SHOW SLAVE HOSTS 如果主服务器已启动,则 此值将显示在 主服务器 的输出中 --show-slave-auth-info

    虽然此选项的名称可能暗示其他情况, --report-password 但未连接到MySQL用户权限系统,因此不一定(甚至可能)与MySQL复制用户帐户的密码相同。

  • --report-port=slave_port_num

    属性
    命令行格式 --report-port=port_num
    系统变量 report_port
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 整数
    默认值 [slave_port]
    最低价值 0
    最大价值 65535

    用于连接从站的TCP / IP端口号,在从站注册期间报告给主站。 仅当从站正在侦听非默认端口或者您有从主站或其他客户端到从站的特殊隧道时才设置此项。 如果您不确定,请不要使用此选项。

    此选项的默认值是从站实际使用的端口号(Bug#13333431)。 这也是显示的默认值 SHOW SLAVE HOSTS

  • --report-user=user_name

    属性
    命令行格式 --report-user=name
    系统变量 report_user
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型

    从站注册期间要向主站报告的从站的帐户用户名。 SHOW SLAVE HOSTS 如果主服务器已启动,则 此值将显示在 主服务器 的输出中 --show-slave-auth-info

    虽然此选项的名称可能暗示其他情况, --report-user 但未连接到MySQL用户权限系统,因此不一定(甚至可能)与MySQL复制用户帐户的名称相同。

  • --slave-checkpoint-group=#

    属性
    命令行格式 --slave-checkpoint-group=#
    类型 整数
    默认值 512
    最低价值 32
    最大价值 524280
    块大小 8

    设置在调用检查点操作以更新其状态之前,多线程从站可以处理的最大事务数,如下所示 SHOW SLAVE STATUS 设置此选项对未启用多线程的从站没有影响。

    注意

    NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 请参见 第22.6.3节“NDB群集复制中的已知问题”

    此选项与 --slave-checkpoint-period 选项 结合使用, 以便在超过任一限制时执行检查点,并且计数器跟踪事务数和自上次检查点重置以来经过的时间。

    除非服务器是使用构建的,否则此选项的最小允许值为32, -DWITH_DEBUG 在这种情况下,最小值为1.有效值始终为8的倍数; 您可以将其设置为不是这样的倍数的值,但是在存储该值之前,服务器将其舍入到下一个较低的8的倍数。 例外 :调试服务器不执行此类舍入。)无论服务器是如何构建的,默认值为512,允许的最大值为524280。

  • --slave-checkpoint-period=#

    属性
    命令行格式 --slave-checkpoint-period=#
    类型 整数
    默认值 300
    最低价值 1
    最大价值 4G

    设置在调用检查点操作以更新多线程从站的状态之前允许通过的最长时间(以毫秒为单位),如下所示 SHOW SLAVE STATUS 设置此选项对未启用多线程的从站没有影响。

    注意

    NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 请参见 第22.6.3节“NDB群集复制中的已知问题”

    此选项与 --slave-checkpoint-group 选项 结合使用, 以便在超过任一限制时执行检查点,并且计数器跟踪事务数和自上次检查点重置以来经过的时间。

    此选项的最小允许值为1,除非服务器是使用构建的 -DWITH_DEBUG ,在这种情况下最小值为0.无论服务器是如何构建的,默认值为300,最大可能值为4294967296(4GB) 。

  • --slave-parallel-workers

    属性
    命令行格式 --slave-parallel-workers=#
    类型 整数
    默认值 0
    最低价值 0
    最大价值 1024

    在从属设备上启用多线程,并设置从属应用程序线程的数量,以便并行执行复制事务。 当值是大于0的数字时,从属服务器是具有指定数量的应用程序线程的多线程从属服务器,以及用于管理它们的协调器线程。 如果您使用多个复制通道,则每个通道都具有此数量的线程。

    在从站上启用多线程时,支持重试事务。 slave_preserve_commit_order=1 从站上的事务以与从站的中继日志中出现的顺序相同的顺序在从站上外部化时。 在应用程序线程之间分配事务的方式由 --slave-parallel-type

    要禁用并行执行,请将此选项设置为0,这将为从属设备提供单个应用程序线程,而不是协调器线程。 使用此设置, --slave-parallel-type slave_preserve_commit_order 选项无效,将被忽略。

    注意

    NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 请参见 第22.6.3节“NDB群集复制中的已知问题”

  • --slave-pending-jobs-size-max=#

    属性
    命令行格式 --slave-pending-jobs-size-max=#
    类型 整数
    默认值 (> = 8.0.12) 128M
    默认值 (<= 8.0.11) 16M
    最低价值 1024
    最大价值 16EiB
    块大小 1024

    对于多线程从站,此选项设置可用于保存尚未应用的事件的从属工作队列的最大内存量(以字节为单位)。 设置此选项对未启用多线程的从站没有影响。

    此选项的最小可能值为1024字节; 默认值为128MB。 最大可能值为18446744073709551615(16 exbibytes)。 在存储之前,不是1024字节的精确倍数的值向下舍入到1024字节的下一个较低倍数。

    此变量的值是软限制,可以设置为与正常工作负载匹配。 如果异常大的事件超过此大小,则事务将一直保持到所有从属工作程序都有空队列,然后进行处理。 所有后续交易将持续到大型交易完成为止。

  • --skip-slave-start

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

    告诉从服务器在服务器启动时不启动从属线程。 要在以后启动线程,请使用 START SLAVE 语句。

  • --slave-load-tmpdir=dir_name

    属性
    命令行格式 --slave-load-tmpdir=dir_name
    系统变量 slave_load_tmpdir
    范围 全球
    动态 没有
    SET_VAR 提示适用 没有
    类型 目录名称
    默认值 Value of --tmpdir

    从站创建临时文件的目录的名称。 默认情况下,此选项等于 tmpdir 系统变量 的值 ,或者未指定系统变量时应用的默认值。 当从属SQL线程复制一个 LOAD DATA 语句,它将要从中继日志加载的文件提取到临时文件中,然后将这些文件加载​​到表中。 如果主服务器上加载的文件很大,那么从服务器上的临时文件也很庞大。 因此,建议使用此选项告诉从属服务器将临时文件放在位于具有大量可用空间的某个文件系统中的目录中。 在这种情况下,中继日志也很庞大,因此您可能还希望使用该 --relay-log