结论:二进制日志的格式在主从模式下首选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不会。