如果多源复制拓扑中的源具有现有数据,则可以节省在开始复制之前为副本提供相关数据的时间。在多源复制拓扑中,复制数据目录不能用于为副本提供来自所有源的数据,您可能还希望仅从每个源复制特定的数据库。因此,配置此类副本的最佳策略是使用mysqldump在每个源上创建适当的转储文件,然后使用 mysql客户端在副本上导入转储文件。
如果您使用的是基于 GTID 的复制,则需要注意mysqldump在转储输出中放置的SET @@GLOBAL.gtid_purged
语句
。此语句将在源上执行的事务的 GTID 传输到副本,副本需要此信息。然而,对于任何比从一个来源提供一个新的空副本更复杂的情况,您需要检查该语句对副本的 MySQL 版本有什么影响,并相应地处理该语句。以下指南总结了合适的操作,但有关更多详细信息,请参阅
mysqldump文档。
在 MySQL 5.6 和 5.7 中,mysqldumpSET
@@GLOBAL.gtid_purged
写入的语句
替换了
副本上的值。同样在那些版本中,只有当副本的 GTID 事务记录(集合)为空时,才能更改该值
。因此,在多源复制拓扑中,您必须
在重放转储文件之前从转储输出中删除该语句,因为您不能应用包含此语句的第二个或后续转储文件。作为删除的替代方法gtid_purged
gtid_executed
SET @@GLOBAL.gtid_purged
SET
@@GLOBAL.gtid_purged
语句,如果您使用来自同一源的两个部分转储来配置副本,并且第二个转储中设置的 GTID 与第一个相同(因此在转储之间的源上没有执行任何新事务),您可以在输出第二个转储文件时
将mysqldump的
--set-gtid-purged
选项
设置为省略该语句。OFF
对于 MySQL 5.6 和 5.7,这些限制意味着来自源的所有转储文件必须在具有空
gtid_executed
集的副本上的单个操作中应用。您可以通过在副本上发布来清除副本的 GTID 执行历史记录
RESET MASTER
,但如果您在副本上有其他需要 GTID 的事务,请从第 16.1.3.5 节“使用 GTID 进行故障转移和横向扩展”中描述的备选方法中选择一种备选方法”。
在下面的配置示例中,我们假设
SET @@GLOBAL.gtid_purged
语句需要从文件中删除并手动处理。我们还假设在供应开始之前,副本上没有需要 GTID 的事务。
db1
要为名为onsource1
的数据库和名为db2
on 的 数据库创建转储文件, 请按如下方式source2
运行mysqldump :source1
mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db1 > dumpM1.sql
然后运行mysqldump for
source2
如下:mysqldump -u<user> -p<password> --single-transaction --triggers --routines --set-gtid-purged=ON --databases db2 > dumpM2.sql
记录mysqldump添加到每个转储文件的
gtid_purged
值。例如,对于在 MySQL 5.6 或 5.7 上创建的转储文件,您可以像这样提取值:cat dumpM1.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\'' cat dumpM2.sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\''
每种情况下的结果都应该是一个 GTID 集,例如:
source1: 2174B383-5441-11E8-B90A-C80AA9429562:1-1029 source2: 224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695
从每个转储文件中删除包含该
SET @@GLOBAL.gtid_purged
语句的行。例如:sed '/GTID_PURGED/d' dumpM1.sql > dumpM1_nopurge.sql sed '/GTID_PURGED/d' dumpM2.sql > dumpM2_nopurge.sql
使用mysql客户端将每个已编辑的转储文件导入到副本中。例如:
mysql -u<user> -p<password> < dumpM1_nopurge.sql mysql -u<user> -p<password> < dumpM2_nopurge.sql
在副本上,
RESET MASTER
清除 GTID 执行历史记录(假设,如上所述,所有转储文件都已导入,并且副本上没有需要的 GTID 事务)。然后发出一条SET @@GLOBAL.gtid_purged
语句,将gtid_purged
值设置为所有转储文件中所有 GTID 集的并集,如您在第 2 步中记录的那样。例如:mysql> RESET MASTER; mysql> SET @@GLOBAL.gtid_purged = "2174B383-5441-11E8-B90A-C80AA9429562:1-1029, 224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695";
如果转储文件中的 GTID 集之间存在或可能存在重叠事务,则可以使用 第 16.1.3.7 节“操作 GTID 的存储函数示例”中描述的存储函数来事先检查并计算所有 GTID 集。