动态复制过滤器——我们的轮子将是方形的!

这既滑稽又悲伤。新的 MySQL 5.7 里程碑版本推出了一项新特性——复制过滤器现在是动态的了。毫无疑问,这是一项很棒且期待已久的特性。

简而言之,多年来 MySQL 从库可以根据这些事件适用的数据库或表名来过滤传入的复制事件流。这些过滤器使用 my.cnf 文件(或命令行)进行配置,特别是使用以下变量:

 replicate_do_db
 replicate_ignore_db
 replicate_do_table
 replicate_ignore_table
 replicate_wild_do_table
 replicate_wild_ignore_table

自然地,用户希望无需重启服务器即可更改这些选项的值。最终 Davi Arnaut 实现了它。MariaDB 在 5.5.22 版本中获得了这项贡献。从该版本起,MariaDB 中的这些选项已成为动态系统变量,可以随意更改。例如:

set global replicate_do_db = "mydb1,mydb2";
set global replicate_wild_ignore_table = "mydb1.local%";

现在,我明白有时我们可能会首先实现某个有用的特性。我也明白在这种情况下,Oracle 可能想要拥有它,同时又不希望看起来像在跟随 MariaDB。当然不是!这个特性必须完全原创。使用完全不兼容的语法。最近的例子包括 MySQL 5.7.2 中在 MariaDB 引入 SHOW EXPLAIN 大约一年后出现的 EXPLAIN FOR CONNECTION,以及使用“通道”的多源复制,而 MariaDB 已经使用命名从库很长时间了。

但说实话,这其中应该有一些逻辑。诚然,EXPLAIN FOR CONNECTION 并不比 SHOW EXPLAIN 差。多源“通道”在语法上看也挺好。但是,如果有一个命令行选项,那么(几乎总是)会有一个对应的系统变量,可以在 SHOW VARIABLES 中看到。人们(几乎总是)通过为对应的变量赋予新值来改变选项的值。只有一种方法可以做到这一点。

唉,我们在 MariaDB 中走了这条路。因此,通过严格遵守NIH(非我所创)原则(而且,我怀疑,还有 Oracle 内部政策),MySQL 开发者不得不发明一种不同的方式来更改服务器选项。瞧,CHANGE REPLICATION FILTER 语句来了。示例如下:

change replication filter replicate_do_db=(mydb1,mydb2);
change replication filter replicate_wild_ignore_table=('mydb1.local%');

干得好。常识?不,在这种情况下没有。