Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Provisioning a Multi-Source Replica for GTID-Based Replication

19.1.5.2 多源复制中配置 GTID-基于的副本

如果多源复制拓扑中的源服务器已经存在数据,可以在开始复制前将相关数据导入副本。由于多源复制拓扑中不能使用克隆或复制数据目录来将数据从所有源服务器导入副本,您可能还想从每个源服务器中复制特定的数据库。因此,配置这样一个副本的最佳策略是使用mysqldump在每个源服务器上创建合适的备份文件,然后使用mysql客户端将备份文件导入副本。

如果您使用的是 GTID-基于的复制,您需要注意mysqldump在备份输出中添加的SET @@GLOBAL.gtid_purged语句。这条语句将源服务器上的事务GTID转移到副本上,副本需要这些信息。然而,对于复制一个新的、空的副本从一个源服务器的任何情况,您需要检查MySQL版本在副本上执行语句的影响,并根据需要处理语句。以下是适当的操作总结,但更多信息请见mysqldump文档。

SET @@GLOBAL.gtid_purged语句将备份文件中的GTID集添加到副本上的现有gtid_purged集上。这条语句因此可以在副本上重新播放备份文件时留在备份输出中,并且备份文件可以在不同的时间重新播放。然而,需要注意mysqldumpSET @@GLOBAL.gtid_purged语句提供的GTID包括源服务器上的所有事务在gtid_executed集上,即使这些事务改变了数据库的某些部分或其他数据库服务器上的数据库,但这些数据库不包括在部分备份中。如果您在副本上重新播放第二个或后续备份文件,该备份文件包含与上述相同的GTID(例如来自同一个源服务器的部分备份或来自另一个源服务器的备份,该备份包含重叠的事务),任何SET @@GLOBAL.gtid_purged语句在第二个备份文件中将失败,因此必须从备份输出中删除该语句。

作为替代删除SET @@GLOBAL.gtid_purged语句,您可以使用mysqldump命令,带有--set-gtid-purged=COMMENTED选项,以将语句包围在SQL注释中,使其在加载备份文件时不执行。如果您正在使用两个部分备份文件从同一来源创建复制副本,并且第二个备份文件的GTID与第一个备份文件相同(因此在备份文件之间没有执行新的事务),您可以将--set-gtid-purged=OFF选项设置为第二个备份文件,以省略语句。

在以下复制示例中,我们假设SET @@GLOBAL.gtid_purged语句不能留在备份输出中,必须手动从文件中删除,并且在复制开始前没有想要的事务具有GTID。

  1. 要创建名为db1的数据库的备份文件在source1上,并且名为db2的数据库的备份文件在source2上,运行mysqldump命令如下:

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db1 > dumpM1.sql

    然后,运行mysqldump命令如下:

    mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db2 > dumpM2.sql
  2. 记录gtid_purged值,该mysqldump命令添加到每个备份文件中。您可以使用以下方式提取该值:

    cat dumpM1.sql | grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''
    cat dumpM2.sql | grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''

    每个情况的结果都应该是一个GTID集,例如:

    source1:   2174B383-5441-11E8-B90A-C80AA9429562:1-1029
    source2:   224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695
  3. 从每个备份文件中删除包含SET @@GLOBAL.gtid_purged语句的行。例如:

    sed '/GTID_PURGED/d' dumpM1.sql > dumpM1_nopurge.sql
    sed '/GTID_PURGED/d' dumpM2.sql > dumpM2_nopurge.sql
  4. 使用mysql客户端将每个编辑的备份文件导入到复制副本中。例如:

    mysql -u<user> -p<password> < dumpM1_nopurge.sql
    mysql -u<user> -p<password> < dumpM2_nopurge.sql
  5. 在复制副本上,执行RESET BINARY LOGS AND GTIDS语句,以清除GTID执行历史(假设,正如上所解释的,所有备份文件已经导入,并且在复制副本上没有想要的事务具有GTID)。然后,执行mysql客户端将gtid_purged值设置为所有备份文件的GTID集的并集,正如您在步骤2中记录的。例如:

    mysql> RESET BINARY LOGS AND GTIDS;
    mysql> SET @@GLOBAL.gtid_purged = "2174B383-5441-11E8-B90A-C80AA9429562:1-1029, 224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695";

    如果在备份文件中的GTID集之间存在或可能存在重叠的事务,您可以使用Section 19.1.3.8, “Stored Function Examples to Manipulate GTIDs”中描述的存储函数来检查此前,并计算所有备份文件的GTID集的并集。