• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • CHANGE REPLICATION FILTER语句

    更改复制过滤器语句

    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
    

    CHANGE REPLICATION FILTER设置从服务器上的一个或多个复制过滤规则,方法与使用复制过滤选项(例如或)启动从服务器mysqld相同。与使用服务器选项的情况不同,此语句不需要重新启动服务器即可生效,只需要先使用从SQL线程停止(然后再使用SQL线程重新启动)即可。需要或特权。使用此子句可以使复制过滤器特定于复制通道,例如在多源复制从属服务器上。过滤器没有特定的应用--replicate-do-db--replicate-wild-ignore-tableSTOP SLAVE SQL_THREADSTART SLAVE SQL_THREADCHANGE REPLICATION FILTERREPLICATION_SLAVE_ADMINSUPERFOR CHANNEL channelFOR CHANNEL子句被认为是全局过滤器,这意味着它们将应用于所有复制通道。

    注意

    不能在为组复制配置的MySQL服务器实例上设置全局复制筛选器,因为在某些服务器上筛选事务将使该组无法就一致状态达成协议。可以在与组复制不直接相关的复制通道上设置特定于通道的复制筛选器,例如,组成员还充当组外主服务器的复制从属。不能在group_replication_appliergroup_replication_recovery通道上设置它们。

    以下列表显示了CHANGE REPLICATION FILTER选项及其与--replicate-*服务器选项的关系:

    • REPLICATE_DO_DB:包括基于数据库名称的更新。等同于--replicate-do-db
    • REPLICATE_IGNORE_DB:根据数据库名称排除更新。等同于--replicate-ignore-db
    • REPLICATE_DO_TABLE:包括基于表名的更新。等同于--replicate-do-table
    • REPLICATE_IGNORE_TABLE:根据表名排除更新。等同于--replicate-ignore-table
    • REPLICATE_WILD_DO_TABLE:包括基于通配符模式匹配表名称的更新。等同于--replicate-wild-do-table
    • REPLICATE_WILD_IGNORE_TABLE:排除基于通配符模式匹配表名称的更新。等同于--replicate-wild-ignore-table
    • REPLICATE_REWRITE_DB:在从属服务器上用新名称替换主服务器上的指定数据库后,对从属服务器执行更新。等同于--replicate-rewrite-db

    REPLICATE_DO_DBREPLICATE_IGNORE_DB过滤器的确切效果取决于是基于语句的复制还是基于行的复制。有关更多信息,请参见“服务器如何评估复制过滤规则”。

    CHANGE REPLICATION FILTER通过用逗号分隔规则,可以在单个语句中创建多个复制过滤规则,如下所示:

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

    发出刚刚显示的语句等效于使用选项启动从属mysqld--replicate-do-db=d1--replicate-ignore-db=d2

    在使用多个复制通道来处理来自不同源的事务的多源复制从属服务器上,请使用以下子句在复制通道上设置复制过滤器:FOR CHANNEL channel

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

    这使您可以创建通道特定的复制筛选器,以从源中筛选出选定的数据。当FOR CHANNEL设置子句,复制过滤器声明作用于该从属复制通道去除具有相同滤波器类型与指定的复制过滤器的任何现有的复制过滤器,并使用指定的过滤器替换它们。语句中未明确列出的过滤器类型不会被修改。如果是针对未配置的从属复制通道发出的,则该语句将失败,并显示ER_SLAVE_CONFIGURATION错误。如果针对组复制通道发出,则该语句失败,并显示 ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED 错误。

    在配置了多个复制通道的复制从属服务器上,发出CHANGE REPLICATION FILTERno FOR CHANNEL子句可为每个已配置的从属复制通道以及全局复制筛选器配置复制筛选器。对于每种过滤器类型,如果语句中列出了过滤器类型,则该类型的任何现有过滤器规则都将被最新发布的语句中指定的过滤器规则替换,否则将保留过滤器类型的旧值。有关更多信息,请参见“基于复制通道的过滤器”。

    如果多次指定相同的过滤规则,则实际上仅使用最后一个这样的规则。例如,此处显示的两个语句具有完全相同的效果,因为REPLICATE_DO_DB第一条语句中的第一条规则被忽略:

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

    此行为与--replicate-*过滤器选项的行为不同,后者多次指定同一选项会导致创建多个过滤器规则。

    表和数据库的名称不包含任何特殊字符,无需引用。与REPLICATION_WILD_TABLEREPLICATION_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将在主数据库db2上发生的语句重写为从数据库上的语句:

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

    刚刚显示的语句包含两组括号,一组包含一对数据库名称,另一组包含整个列表。这也许是更容易看到在下面的例子中,它创建了两个rewrite-db规则,一个重写的数据库dbAdbB,和一个重写数据库dbCdbD

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

    CHANGE REPLICATION FILTER语句仅对受该语句影响的过滤器类型和复制通道替换复制过滤规则,而其他规则和通道则保持不变。如果要取消设置所有给定类型的过滤器,请将该过滤器的值设置为一个明确的空列表,如本示例所示,该列表将删除所有现有的REPLICATE_DO_DBREPLICATE_IGNORE_DB规则:

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

    以这种方式将过滤器设置为空会删除所有现有规则,不会创建任何新规则,也不会还原使用--replicate-*命令行或配置文件中的选项在mysqld启动时设置的任何规则。

    RESET SLAVE ALL语句将删除在该语句删除的通道上设置的通道特定的复制筛选器。重新创建已删除的一个或多个通道时,将为从属指定的所有全局复制过滤器都复制到它们,并且不应用任何特定于通道的复制过滤器。

    有关更多信息,请参见“服务器如何评估复制过滤规则”。