mysql主从模式下的binlog-do-db参数对数据复制一致性的影响

结论:二进制日志的格式在主从模式下首选row模式

#使用binlog-do-db参数时,在binlog format为statement和row格式下的日志记录是有差异
当使用ddl 如alter table /create table等都会被记录到日志,不管选用哪种格式
1、在基于语句的日志格式下如果使用use db_name 并出现了垮裤现象,以下例子日志将不会记录update语句,主要是该模式下,数据库只检测默认数据而不检查语句的所有数据库:如
my.cnf 配置=> --binlog-do-db=sales
USE prices;
UPDATE sales.january SET amount=amount+1000;

再如--binlog-do-db=sales 以下的例子语句将被记录到日志:
USE sales;
UPDATE prices.discounts SET percentage = percentage + 10;  
这个特性说明:只要use db_name用的是设置的数据库,则下面的更新语句都将更新,用的不是设置数据库,即使更新语句中指定的数据库是设置的库,更新语句也不记录
-------------------------------
2、在基于行的日志格式下,并--binlog-do-db=sales情况下,只要涉及到sales表的更新都会被记录日志
如以下例子会入binlog日志:

USE prices;
UPDATE sales.february SET amount=amount+100;

但是以下例子不会记录到binlog日志,因为更新的表不属于sales数据库:

USE prices;
UPDATE prices.march SET amount=amount-25;

甚至此时将use prices 改为use sales也是不会记录到日志,即基于行的日志格式,日志的记录不受默认数据库的影响。
-----------------------------
3、在一条更新语句涉及夸多个库的情况下,基于行和基于语句的日志格式,日志记录的情况也是不一样的,如在设置为--binlog-do-db=db1下,执行以下语句:

USE db1;
UPDATE db1.table1 SET col1 = 10, db2.table2 SET col2 = 20;

假如此时是基于语句的日志格式下,两个表都会被记录到日志,但是如果此时是基于行的日志格式的话,只有db1的表更新会被记录而db2的表不会被记录
当use db1 改为 use db3的情况下,如以下语句:

USE db3;
UPDATE db1.table1 SET col1 = 10, db2.table2 SET col2 = 20;


此时基于语句的格式下,该更新不被记录到日志下,而在基于行的情况下,db1的更新会被记录,而db2不会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值