MySQL复制特性复制过滤规则

原有A库中的对象,复制到Slaves节点后,希望保存到B库中,MySQL提供了一个专用参数:replicate-rewrite-db=from_name->to_name

库级过滤规则:

Master节点在执行修改操作时,由--binlog-do-db--binlog-ignore-db两个参数控制在指定的数据库中对象的变更事件是否记录到二进制日志文件中

Slave节点在应用日志时,由--replicate-db-db--replicate-ignore-db两个参数控制是否应用指定数据库的变更事件

基于语句格式记录的日志是通过当前所使用的db来作为过滤条件

只有当Master节点端操作时,修改a库中的对象则use a,修改b库中的对象则use b,没有跨库的修改,才不会出现误过滤的情形

例子1:当前Master节点在a库下执行操作(use a),分别修改了a库下的表对象,以及b库下的表对象,而后该操作被复制到Slaves节点,Slaves端设置忽略a库下的操作(--replicate-ignore-db=a),那么,a库下对象的操作肯定被过滤了,不会在Slave节点执行,同时,b库下的对象修改也会被过滤。这是因为基于语句格式记录的日志是通过当前使用的db来作为过滤条件。

例子2:当前Master节点在a库下执行操作(use a),分别修改了a库下的表对象,以及b库下的表对象,而后该操作被复制到Slaves节点,Slaves端设置忽略b库下的操作(--replicate-ignore-db=b),那么,a库下对象的操作肯定不被过滤,会在Slave节点执行,同时,b库下的对象修改也不会被过滤。这是因为基于语句格式记录的日志是通过当前使用的db来作为过滤条件。

表级复制选项:

Slave节点如果指定了--replicate-do-table--replicate-wild-do-table参数,则执行参数中指定对象的修改事件。如果指定了—replicate-ignore-table—replicate-wild-ignore-table参数,则除了参数中指定对象的修改事件不执行外,其他变更事件均要在本地执行

不同场景下复制过滤规则的应用:

没有任何—replicate-*参数:Slave端执行所有接收到的事件

指定了—replicate-*-db参数,未指定表级参数:只执行(或忽略)指定数据库的事件

指定了—replicate-*-table参数,未指定库级参数:只执行(或忽略)指定表对象的事件

 

既有库级参数,也有表级参数:Slaves节点首先执行(或忽略)指定数据库级的事件,而后再处理表级过滤选项。需要注意日志记录格式对复制的影响

你可能感兴趣的:(mysql)