文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  复制过滤选项之间的交互

19.2.5.3 复制过滤选项之间的交互

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

复制过滤选项的效果在二进制日志记录格式之间有所不同,因为数据库名称的识别方式不同。在基于语句的格式中,DML 语句根据当前数据库进行处理,如 USE 语句所指定。在基于行的格式中,DML 语句根据修改的表所在的数据库进行处理。DDL 语句始终根据当前数据库进行过滤,如 USE 语句所指定,与二进制日志记录格式无关。

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

如果您需要保证您的复制过滤器始终保持一致,与二进制日志记录格式无关,尤其是在使用混合二进制日志记录格式 (binlog_format=MIXED) 时,请只使用表级复制过滤选项,不要使用数据库级复制过滤选项。此外,不要使用更新了过滤后的表和过滤掉的表的多表 DML 语句。

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

  1. 如果您使用基于行的二进制日志记录格式 (binlog_format=ROW),对于 DDL 语句,请依赖 USE 语句设置数据库,不要指定数据库名称。您可以考虑更改为基于行的二进制日志记录格式,以提高与复制过滤的一致性。有关更改二进制日志记录格式的条件,请参见 第 7.4.4.2 节,“设置二进制日志记录格式”

  2. 如果您使用基于语句或混合二进制日志格式(binlog_format=STATEMENTMIXED),对于 DML 和 DDL 语句,请依赖于 USE 语句,不要使用数据库名称。此外,不要使用更新了筛选进和筛选出表的多个表的 DML 语句。

示例 19.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 TABLEdb1 中创建表,如前面的 USE 语句指定。副本根据其 --replicate-ignore-db = db1 选项过滤掉此语句,因为 db1 是当前数据库。无论复制源服务器上的二进制日志格式如何,此结果都是相同的。但是,DML INSERT 语句的结果因二进制日志格式而异

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

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

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