10bet网址
MySQL复制
相关的文档10bet官方网站 下载此节选
PDF(美国高级主任)- 1.5 mb
PDF (A4)- 1.6 mb
HTML下载(TGZ)- 322.5 kb
HTML下载(Zip)- 330.4 kb


MySQL复制/.../ 为基于gtid的复制提供多源副本

2.5.2发放基于gtid复制的多源副本

如果在多源复制拓扑中,各源之间存在已有数据,则在开始复制之前为副本提供相关数据可以节省时间。在多源复制拓扑中,不能使用克隆或复制数据目录来为副本提供来自所有源的数据,您还可能希望仅从每个源复制特定的数据库。因此,提供这样一个副本的最佳策略是使用, mysqldump要在每个源上创建适当的转储文件,请使用mysql客户端导入副本上的转储文件。

如果您正在使用基于gtid的复制,则需要注意设置@@GLOBAL.gtid_purged声明,, mysqldump放置在转储输出中。该语句将在源上执行的事务的gtid传输到副本,而副本需要这些信息。然而,对于任何比从一个源提供一个新的空副本更复杂的情况,您需要检查该语句在副本所使用的MySQL版本中有什么影响,并相应地处理该语句。以下指南总结了适当的操作,但有关详细信息,请参阅, mysqldump10bet官方网站文档。

的行为设置@@GLOBAL.gtid_purged声明由, mysqldumpMySQL 8.0版本与MySQL 5.6和5.7版本不同。在MySQL 5.6和5.7中,语句替换了的值gtid_purged并且在那些发行版中,只有当副本的gtid事务记录(thegtid_executedSet)为空。因此,在多源复制拓扑中,必须删除设置@@GLOBAL.gtid_purged语句,因为不能应用包含此语句的第二个或后续转储文件。还要注意,对于MySQL 5.6和5.7,这个限制意味着来自源的所有转储文件必须应用于一个具有空值的副本的单个操作中gtid_executed集。您可以通过命令清除副本的GTID执行历史重置的主人,但是如果您在副本上有其他需要的gtid事务,请从中描述的方法中选择另一种供应方法第2.3.5节,“使用gtid进行故障转移和扩展”

从MySQL 8.0开始,设置@@GLOBAL.gtid_purged语句将GTID集从转储文件添加到现有的gtid_purged设置在副本上。因此,当您在副本上重播转储文件时,该语句可能会留在转储输出中,并且转储文件可以在不同的时间重播。但是,重要的是要注意包含的值, mysqldump设置@@GLOBAL.gtid_purged语句中包含所有事务的gtidgtid_executed在源上设置,即使更改了数据库中被抑制的部分,或者服务器上未包含在部分转储中的其他数据库。如果在包含任何相同gtid的副本上重播第二个或后续转储文件(例如,来自同一源的另一个部分转储,或来自具有重叠事务的另一个源的转储),则任何设置@@GLOBAL.gtid_purged语句在第二个转储文件中失败,因此必须从转储输出中删除。

对于来自MySQL 8.0.17的源代码,作为删除设置@@GLOBAL.gtid_purged声明,你可以设置, mysqldump——set-gtid-purged选项评论包含但注释掉的语句,以便在加载转储文件时不执行该语句。如果使用来自同一个源的两个部分转储提供副本,并且第二个转储中设置的GTID与第一个转储中设置的GTID相同(因此在两个转储之间的源上没有执行新的事务),则可以设置, mysqldump——set-gtid-purged选项当输出第二个转储文件时,省略该语句。

在下面的配置示例中,我们假设设置@@GLOBAL.gtid_purged语句不能留在转储输出中,必须从文件中删除并手动处理。我们还假设在供应开始之前,副本上没有与gtid相关的所需事务。

  1. 为数据库创建转储文件db1source1和一个名为db2source2、运行, mysqldumpsource1如下:

    , mysqldump - u <用户> - p <密码>——single-transaction——triggers——routines——set-gtid-purged=ON——databases db1 > dump1 .sql

    然后运行, mysqldumpsource2如下:

    , mysqldump - u <用户> - p <密码>——single-transaction——triggers——routines——set-gtid-purged=ON——databases db2 > dumpM2.sql
  2. 记录gtid_purged值,, mysqldump添加到每个转储文件中。例如,对于在MySQL 5.6或5.7上创建的转储文件,您可以像这样提取值:

    猫dumpM1。sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\ " cat dumpM2。sql | grep GTID_PURGED | cut -f2 -d'=' | cut -f2 -d$'\ "

    在MySQL 8.0中,格式已经改变,你可以像这样提取值:

    猫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集合,例如:

    来源2:224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695
  3. 属性的转储文件中删除该行设置@@GLOBAL.gtid_purged声明。例如:

    sed '/GTID_PURGED/d' dumpM1. sed '/GTID_PURGED/d' dumpM1. sed '/GTID_PURGEDsql > dumpM1_nopurge. sqlsql sed '/GTID_PURGED/d' dumpM2. sqlsql > dumpM2_nopurge.sql
  4. 使用mysql客户端将每个编辑过的转储文件导入副本。例如:

    mysql - u <用户> - p <密码> < dumpM1_nopurge。SQL mysql -u<用户> - p <密码> < dumpM2_nopurge.sql
  5. 在副本上,发布重置的主人清除GTID执行历史记录(假设,如上所述,所有转储文件都已导入,并且副本上没有与GTID相关的所需事务)。然后发出设置@@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集之间存在或可能存在重叠的事务,则可以使用中描述的存储函数第2.3.8节,“操作gtid的存储函数示例”来事先检查并计算所有GTID集的并集。