暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU 翻译] 17.2.5.3 复制过滤选项之间的交互

原创 由迪 2022-09-19
248

如果您使用数据库级和表级复制过滤选项的组合,则副本首先使用数据库选项接受或忽略事件,然后根据表选项评估这些选项允许的所有事件。这有时会导致看似违反直觉的结果。同样重要的是要注意,结果会根据操作是使用基于语句还是基于行的二进制日志记录格式而有所不同。如果您想确保您的复制过滤器始终以独立于二进制日志记录格式的相同方式运行,如果您使用混合二进制日志记录格式,这一点尤其重要,请遵循本主题中的指导。

由于识别数据库名称的方式,复制过滤选项的效果因二进制日志记录格式而异。使用基于语句的格式,根据语句指定的当前数据库处理 DML USE语句。使用基于行的格式,DML 语句根据修改表所在的数据库进行处理。DDL 语句始终根据 USE语句指定的当前数据库进行过滤,而不管二进制日志记录格式如何。

涉及多个表的操作也可能受到复制过滤选项的不同影响,具体取决于二进制日志记录格式。需要注意的操作包括涉及多表 UPDATE语句、触发器、级联外键、更新多个表的存储函数以及调用更新一个或多个表的存储函数的 DML 语句的事务。如果这些操作同时更新已过滤表和已过滤表,则结果可能会因二进制日志记录格式而异。

如果您需要保证无论二进制日志记录格式如何,您的复制过滤器都能始终如一地运行,特别是如果您使用混合二进制日志记录格式 ( binlog_format=MIXED),请仅使用表级复制过滤选项,不要使用数据库级复制过滤选项。此外,不要使用同时更新已过滤表和已过滤表的多表 DML 语句。

如果您需要结合使用数据库级和表级复制过滤器,并希望它们尽可能一致地运行,请选择以下策略之一:

  1. 如果使用基于行的二进制日志格式 ( binlog_format=ROW),对于 DDL 语句,依赖 USE语句设置数据库,不要指定数据库名称。您可以考虑更改为基于行的二进制日志记录格式,以提高与复制过滤的一致性。有关适用于更改二进制日志格式的条件,请参见 第 5.4.4.2 节,“设置二进制日志格式”
  2. 如果您使用基于语句或混合二进制日志记录格式(binlog_format=STATEMENTMIXED),对于 DML 和 DDL 语句,请依赖该USE语句而不使用数据库名称。此外,不要使用同时更新已过滤表和已过滤表的多表 DML 语句。

例 17.7 一个--replicate-ignore-db选项和一个 --replicate-do-table选项

在复制源服务器上,发出以下语句:

USE db1; CREATE TABLE t2 LIKE t1; INSERT INTO db2.t3 VALUES (1);
复制

副本具有以下复制过滤选项集:

replicate-ignore-db = db1
replicate-do-table = db2.t3
复制

DDL 语句CREATE TABLE 在 中创建表db1,如前面的USE语句所指定。副本根据其 --replicate-ignore-db = db1 选项过滤掉这条语句,因为db1是当前数据库。无论复制源服务器上的二进制日志记录格式是什么,此结果都是相同的。但是,DMLINSERT 语句的结果因二进制日志格式而异:

如果--replicate-ignore-db = db1副本上的选项是必要的,并且在源上使用基于语句(或混合)的二进制日志记录格式也是必要的,则可以通过从 INSERT语句中省略数据库名称并依赖于USE语句来使结果保持一致, 如下:

USE db1; CREATE TABLE t2 LIKE t1; USE db2; INSERT INTO t3 VALUES (1);
复制

在这种情况下,副本始终 INSERT根据数据库评估语句db2。无论操作是以基于语句还是基于行的二进制格式记录的,结果都保持不变。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论