#### 13.4.2.2 更改复制过滤器语句

[](<>)

```
CHANGE REPLICATION FILTER filter[, filter]
	[, ...] [FOR CHANNEL channel]

filter: {
    REPLICATE_DO_DB = (db_list)
  | REPLICATE_IGNORE_DB = (db_list)
  | REPLICATE_DO_TABLE = (tbl_list)
  | REPLICATE_IGNORE_TABLE = (tbl_list)
  | REPLICATE_WILD_DO_TABLE = (wild_tbl_list)
  | REPLICATE_WILD_IGNORE_TABLE = (wild_tbl_list)
  | REPLICATE_REWRITE_DB = (db_pair_list)
}

db_list:
    db_name[, db_name][, ...]

tbl_list:
    db_name.table_name[, db_name.table_name][, ...]
wild_tbl_list:
    'db_pattern.table_pattern'[, 'db_pattern.table_pattern'][, ...]

db_pair_list:
    (db_pair)[, (db_pair)][, ...]

db_pair:
    from_db, to_db
```

`更改复制过滤器`以与启动副本相同的方式在副本上设置一个或多个复制过滤规则[**mysqld**](mysqld.html)具有复制过滤选项，例如[`--replicate-do-db`](replication-options-replica.html#option_mysqld_replicate-do-db)要么[`--replicate-wild-ignore-table`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table).使用此语句设置的过滤器与使用服务器选项设置的过滤器在两个关键方面有所不同：

1.  该语句不需要重新启动服务器才能生效，只需使用停止复制 SQL 线程[`停止复制 SQL_THREAD`](stop-replica.html)首先（并重新启动[`开始复制 SQL_THREAD`](start-replica.html)然后）。

2.  声明的效果不是持久的；使用设置的任何过滤器`更改复制过滤器`副本重新启动后丢失[**mysqld**](mysqld.html).

[`更改复制过滤器`](change-replication-filter.html)需要[`REPLICATION_SLAVE_ADMIN`](privileges-provided.html#priv_replication-slave-admin)特权（或已弃用的[`极好的`](privileges-provided.html#priv_super)特权）。

使用`对于频道 *`渠道`*`子句使复制过滤器特定于复制通道，例如在多源副本上。应用的过滤器没有特定的`频道`子句被认为是全局过滤器，这意味着它们适用于所有复制通道。

笔记

无法在为 Group Replication 配置的 MySQL 服务器实例上设置全局复制过滤器，因为在某些服务器上过滤事务会使 group 无法就一致状态达成一致。可以在不直接参与组复制的复制通道上设置特定于通道的复制过滤器，例如，组成员还充当组外部源的副本。它们不能设置在`group_replication_applier`要么`group_replication_recovery`渠道。

以下列表显示了`更改复制过滤器`选项以及它们之间的关系`- 复制-*`服务器选项：

-   `REPLICATE_DO_DB`：包括基于数据库名称的更新。相当于[`--replicate-do-db`](replication-options-replica.html#option_mysqld_replicate-do-db).

-   `REPLICATE_IGNORE_DB`：根据数据库名称排除更新。相当于[`--replicate-ignore-db`](replication-options-replica.html#option_mysqld_replicate-ignore-db).

-   `REPLICATE_DO_TABLE`：包括基于表名的更新。相当于[`--replicate-do-table`](replication-options-replica.html#option_mysqld_replicate-do-table).

-   `REPLICATE_IGNORE_TABLE`：根据表名排除更新。相当于[`--复制忽略表`](replication-options-replica.html#option_mysqld_replicate-ignore-table).

-   `REPLICATE_WILD_DO_TABLE`：包括基于通配符模式匹配表名称的更新。相当于[`--replicate-wild-do-table`](replication-options-replica.html#option_mysqld_replicate-wild-do-table).

-   `REPLICATE_WILD_IGNORE_TABLE`：排除基于通配符模式匹配表名的更新。相当于[`--replicate-wild-ignore-table`](replication-options-replica.html#option_mysqld_replicate-wild-ignore-table).

-   `REPLICATE_REWRITE_DB`：在将副本上的新名称替换为源上的指定数据库后，对副本执行更新。相当于[`--replicate-rewrite-db`](replication-options-replica.html#option_mysqld_replicate-rewrite-db).

    的精确效果`REPLICATE_DO_DB`和`REPLICATE_IGNORE_DB`过滤器取决于是基于语句的复制还是基于行的复制有效。看[第 17.2.5 节，“服务器如何评估复制过滤规则”](replication-rules.html)， 了解更多信息。

    可以在一个单一的创建多个复制过滤规则`更改复制过滤器`通过用逗号分隔规则来声明，如下所示：


```
CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (d1), REPLICATE_IGNORE_DB = (d2);
```

发出刚才显示的语句相当于启动副本[**mysqld**](mysqld.html)与选项[`--replicate-do-db=d1`](replication-options-replica.html#option_mysqld_replicate-do-db) [`--replicate-ignore-db=d2`](replication-options-replica.html#option_mysqld_replicate-ignore-db).

在使用多个复制通道来处理来自不同源的事务的多源副本上，使用`对于频道 *`渠道`*`子句在复制通道上设置复制过滤器：

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

这使您能够创建特定于通道的复制过滤器，以从源中过滤掉选定的数据。当一个`频道`如果提供了子句，则复制过滤器语句作用于该复制通道，删除与指定的复制过滤器具有相同过滤器类型的任何现有复制过滤器，并用指定的过滤器替换它们。未在语句中明确列出的过滤器类型不会被修改。如果针对未配置的复制通道发出，则该语句将失败并出现 ER\_奴隶\_配置错误。如果针对组复制通道发出，则该语句将失败并出现 ER\_奴隶\_渠道\_手术\_不是\_允许的错误。

在配置了多个复制通道的副本上，发出[`更改复制过滤器`](change-replication-filter.html)没有`频道`子句为每个配置的复制通道和全局复制过滤器配置复制过滤器。对于每个过滤器类型，如果过滤器类型在语句中列出，则该类型的任何现有过滤器规则都将替换为最近发布的语句中指定的过滤器规则，否则保留过滤器类型的旧值。有关更多信息，请参阅[第 17.2.5.4 节，“基于复制通道的过滤器”](replication-rules-channel-based-filters.html).

如果多次指定相同的过滤规则，则只有*最后的*实际使用了这样的规则。例如，这里显示的两个语句具有完全相同的效果，因为第一个`REPLICATE_DO_DB`第一条语句中的规则被忽略：

```
CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db1, db2), REPLICATE_DO_DB = (db3, db4);

CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (db3, db4);
```

警告

这种行为不同于`- 复制-*`过滤选项 多次指定相同选项会导致创建多个过滤规则。

不包含任何特殊字符的表和数据库的名称不需要引用。使用的值`REPLICATION_WILD_TABLE`和`REPLICATION_WILD_IGNORE_TABLE`是字符串表达式，可能包含（特殊）通配符，因此必须加引号。这显示在以下示例语句中：

```
CHANGE REPLICATION FILTER
    REPLICATE_WILD_DO_TABLE = ('db1.old%');

CHANGE REPLICATION FILTER
    REPLICATE_WILD_IGNORE_TABLE = ('db1.new%', 'db2.new%');
```

使用的值`REPLICATE_REWRITE_DB`代表*对*数据库名称；每个这样的值都必须用括号括起来。以下语句重写数据库上发生的语句`db1`关于数据库的源`数据库2`在副本上：

```
CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB = ((db1, db2));
```

刚刚显示的语句包含两组括号，一组包含一对数据库名称，另一组包含整个列表。这在以下示例中可能更容易看到，它创建了两个`重写数据库`规则，一个重写数据库`分贝`到`分贝`, 和一个重写数据库`数据库`到`数据库`：

```
CHANGE REPLICATION FILTER
  REPLICATE_REWRITE_DB = ((dbA, dbB), (dbC, dbD));
```

这[`更改复制过滤器`](change-replication-filter.html)statement 仅针对受该语句影响的过滤器类型和复制通道替换复制过滤规则，其他规则和通道保持不变。如果要取消设置给定类型的所有过滤器，请将过滤器的值设置为显式空列表，如本示例所示，这将删除所有现有的`REPLICATE_DO_DB`和`REPLICATE_IGNORE_DB`规则：

```
CHANGE REPLICATION FILTER
    REPLICATE_DO_DB = (), REPLICATE_IGNORE_DB = ();
```

以这种方式将过滤器设置为空会删除所有现有规则，不会创建任何新规则，并且不会恢复 mysqld 启动时使用的任何规则集`- 复制-*`命令行或配置文件中的选项。

这[`全部重置副本`](reset-replica.html)语句删除在语句删除的通道上设置的特定于通道的复制过滤器。重新创建已删除的一个或多个通道时，为副本指定的任何全局复制过滤器都将复制到它们，并且不应用任何通道特定的复制过滤器。

有关详细信息，请参阅[第 17.2.5 节，“服务器如何评估复制过滤规则”](replication-rules.html).
