#### 17.2.5.4基于复制通道的筛选器

[](<>)

本节介绍了当存在多个复制通道时（例如在多源复制拓扑中），如何使用复制筛选器。在MySQL 8.0之前，复制过滤器是全局的，因此过滤器应用于所有复制通道。在MySQL 8.0中，复制筛选器可以是全局的，也可以是特定于通道的，这使您能够在特定的复制通道上使用复制筛选器配置多源副本。在多源复制拓扑中，当同一数据库或表存在于多个源上，并且复制副本只需要从一个源进行复制时，特定于通道的复制筛选器尤其有用。

有关设置复制通道的说明，请参阅[第17.1.5节，“MySQL多源复制”](replication-multi-source.html)，有关其工作原理的更多信息，请参阅[第17.2.2节“复制通道”](replication-channels.html).

重要的

多源复制副本上的每个通道都必须从不同的源进行复制。即使使用复制筛选器在每个通道上选择要复制的不同数据，也无法设置从单个复制副本到单个源的多个复制通道。这是因为副本的服务器ID在复制拓扑中必须是唯一的。源仅通过复制副本的服务器ID而不是复制通道的名称来区分复制副本，因此它无法从同一复制副本中识别不同的复制通道。

重要的

在为组复制配置的MySQL服务器实例上，可以在不直接涉及组复制的复制通道上使用特定于通道的复制筛选器，例如，组成员还充当组外源的副本。它们不能在地面上使用`组复制应用程序`或`组_复制_恢复`频道。通过这些渠道进行过滤将使该组织无法就一致的状态达成一致。

重要的

对于菱形拓扑中的多源复制副本（其中复制副本从两个或多个源复制，然后从一个公共源复制），在使用基于GTID的复制时，确保多源复制副本上所有通道上的任何复制筛选器或其他通道配置都相同。对于基于GTID的复制，过滤器仅应用于事务数据，而GTID不会被过滤掉。这样一来，副本的GTID集与源的GTID集保持一致，这意味着可以使用GTID自动定位，而无需每次重新获取过滤掉的事务。如果下游副本是多源的，并且在菱形拓扑中从多个源接收相同的事务，那么下游副本现在有多个事务版本，结果取决于哪个通道首先应用事务。尝试它的第二个通道使用GTID自动跳过该事务，因为该事务的GTID已添加到[`gtid_已执行`](replication-options-gtids.html#sysvar_gtid_executed)由第一频道设置。在通道上进行相同的过滤时，没有问题，因为事务的所有版本都包含相同的数据，因此结果是相同的。但是，由于通道上的过滤不同，数据库可能会变得不一致，复制可能会挂起。

##### 复制筛选器和通道概述

当存在多个复制通道时，例如在多源复制拓扑中，复制筛选器的应用如下：

-   指定的任何全局复制筛选器都将添加到筛选器类型的全局复制筛选器中(`do_db`,`你会忽略桌子吗`，等等）。

-   任何特定于通道的复制筛选器都会为指定的筛选器类型将筛选器添加到指定通道的复制筛选器中。

-   如果未配置此类型的特定于通道的复制筛选器，则每个复制通道将全局复制筛选器复制到其特定于通道的复制筛选器。

-   每个通道都使用其特定于通道的复制筛选器来过滤复制流。

    创建特定于通道的复制筛选器的语法扩展了现有的SQL语句和命令选项。未指定复制通道时，将配置全局复制筛选器以确保向后兼容性。这个[`更改复制筛选器`](change-replication-filter.html)声明支持`频道`子句来在线配置特定于频道的筛选器。这个`--复制-*`配置筛选器的命令选项可以使用以下表单指定复制通道：`--复制-*`过滤器类型`*=*`频道名称`*:*`过滤详细信息`*`.例如，假设`频道1`和`频道2`在服务器启动之前存在，使用命令行选项启动复制副本[`--复制do db=db1`](replication-options-replica.html#option_mysqld_replicate-do-db) [`--复制do db=channel_1:db2`](replication-options-replica.html#option_mysqld_replicate-do-db) [`--复制do db=db3`](replication-options-replica.html#option_mysqld_replicate-do-db) [`--复制忽略db=db4`](replication-options-replica.html#option_mysqld_replicate-ignore-db) [`--复制忽略db=channel_2:db5`](replication-options-replica.html#option_mysqld_replicate-ignore-db)将导致：

-   *全局复制筛选器*：做\_db=db1，db3，忽略\_db=db4

-   *通道上的通道特定过滤器\_1.*：做\_db=db2忽略\_db=db4

-   *通道上的通道特定过滤器\_2.*：做\_db=db1，db3忽略\_db=db5

    要在这样的设置中监视复制筛选器，请使用[`复制\u应用程序\u全局\u过滤器`](performance-schema-replication-applier-global-filters-table.html)和[`复制应用程序过滤器`](performance-schema-replication-applier-filters-table.html)桌子。

##### 在启动时配置特定于通道的复制筛选器

与复制筛选器相关的命令选项可以采用可选选项*`频道`*后跟冒号，后跟筛选器规范。第一个冒号解释为分隔符，后面的冒号解释为文字冒号。以下命令选项支持使用此格式的特定于通道的复制筛选器：

-   `--复制do数据库=*`频道`*:*`数据库id`*`

-   `--复制忽略数据库=*`频道`*:*`数据库id`*`

-   `--复制do表=*`频道`*:*`表\_id`*`

-   `--复制忽略表=*`频道`*:*`表\_id`*`

-   `--复制重写数据库=*`频道`*:*`db1-db2`*`

-   `--复制野生do表=*`频道`*:*`表regexid`*`

-   `--复制野生忽略表=*`频道`*:*`表regexid`*`

    如果使用冒号但未指定*`频道`*例如，对于过滤器选项`--复制do db=：*`数据库id`*`，该选项为默认复制通道配置复制筛选器。默认复制通道是复制启动后始终存在的复制通道，与手动创建的多源复制通道不同。当冒号和*`频道`*例如，如果指定了配置全局复制筛选器的选项`--复制do数据库=*`数据库id`*`配置全局[`--复制do数据库`](replication-options-replica.html#option_mysqld_replicate-do-db)滤器

    如果您配置了多个`重写数据库=*`从你的名字`*->*`直呼其名`*`选择相同的选项*`从你的名字`*数据库中，所有过滤器都添加在一起（放入`重写`列表），第一个生效。

##### 在线更改特定于通道的复制筛选器

除了`--复制-*`选项中，可以使用配置复制筛选器[`更改复制筛选器`](change-replication-filter.html)陈述这样就不需要重新启动服务器，但在进行更改时必须停止复制SQL线程。要使此语句将筛选器应用于特定通道，请使用`频道*`频道`*`条款例如：

```
CHANGE REPLICATION FILTER REPLICATE_DO_DB=(db1) FOR CHANNEL channel_1;
```

当`频道`子句时，该语句作用于指定通道的复制筛选器。如果有多种类型的过滤器(`do_db`, `你会忽略桌子吗`, `狂野的桌子`，等等），则语句只替换指定的筛选器类型。在具有多个通道的复制拓扑中，例如在多源复制副本上，如果没有`频道`子句时，该语句将使用与`频道`案例有关更多信息，请参阅[第13.4.2.2节，“更改复制筛选器语句”](change-replication-filter.html).

##### 删除特定于通道的复制筛选器

配置了特定于通道的复制筛选器后，可以通过发出空筛选器类型语句来删除筛选器。例如，删除所有`复制_重写_数据库`从名为`频道1`问题:

```
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=() FOR CHANNEL channel_1;
```

任何`复制_重写_数据库`使用命令选项或[`更改复制筛选器`](change-replication-filter.html)，将被删除。

这个[`全部重置副本`](reset-replica.html)语句删除在该语句删除的通道上设置的特定于通道的复制筛选器。重新创建已删除的一个或多个通道时，为复制副本指定的所有全局复制筛选器都会复制到这些通道，并且不会应用特定于通道的复制筛选器。
