欢迎投稿

今日深度:

MySQL参数binlog-do-db对binlogs写入的影响,mysqlbinlo

MySQL参数binlog-do-db对binlogs写入的影响,mysqlbinlogdodb


1. 环境描述

目的:当数据库中设置了binlog-do-db时,在不同的binlog_format=statement | row | mixed 下对binlog的写入影响,这个在主从复制中会有一些坑,由于binlog的写入不完全,极有可能会导致主从不一致的情况的。

blog地址:http://blog.csdn.net/hw_libo/article/details/40476577

SuSE 11 sp1 x86_64  +  MySQL 5.5.37

参数设置:

binlog-do-db = bosco1

测试样例1:

use bosco2;
create table bosco1.bosco1_tb01(id int);
create table bosco2.bosco2_tb01(id int);
insert into bosco1.bosco1_tb01(id) values(1);
insert into bosco2.bosco2_tb01(id) values(1);
测试样例2:

use bosco1;
create table bosco1.bosco1_tb01(id int);
create table bosco2.bosco2_tb01(id int);
insert into bosco1.bosco1_tb01(id) values(1);
insert into bosco2.bosco2_tb01(id) values(1);

2. 测试1:use bosco2及SBR/RBR/MBR下

binlog-do-db=bosco1;

MySQL [(none)]> use bosco2;
Database changed

MySQL [bosco2]> select @@tx_isolation,@@binlog_format;
+-----------------+-----------------+
| @@tx_isolation  | @@binlog_format |
+-----------------+-----------------+
| REPEATABLE-READ | STATEMENT       |
+-----------------+-----------------+
1 row in set (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> create table bosco1.bosco1_tb01(id int);
Query OK, 0 rows affected (0.01 sec)

MySQL [bosco1]> create table bosco2.bosco2_tb01(id int);
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> insert into bosco1.bosco1_tb01(id) values(1);
Query OK, 1 row affected (0.01 sec)

MySQL [bosco1]> insert into bosco2.bosco2_tb01(id) values(1);
Query OK, 1 row affected (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.01 sec)

那么来查看一下上面的操作有没有写入binlog中:

# mysqlbinlog --verbose --base64-output=decode-rows mysql-bin.000013
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#141026  1:41:09 server id 1303308  end_log_pos 107 	Start: binlog v 4, server v 5.5.37-log created 141026  1:41:09
# at 107
#141026  1:43:02 server id 1303308  end_log_pos 150 	Rotate to mysql-bin.000014  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
可见,指定了binlog-do-db=bosco1,事务隔离级别RR + binlog_format=statement或是row,在使用其他database(非bosco1数据库)下的所有操作都不会记录到binlogs中,即使是操作binlog-do-db=bosco1下的表;而且DDL也不会被记录。


3. 测试2:use bosco1及RBR下

binlog-do-db=bosco1;

MySQL [bosco2]> use bosco1;

MySQL [bosco1]> select @@tx_isolation,@@binlog_format;
+-----------------+-----------------+
| @@tx_isolation  | @@binlog_format |
+-----------------+-----------------+
| REPEATABLE-READ | ROW             |
+-----------------+-----------------+
1 row in set (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> create table bosco1.bosco1_tb01(id int);
Query OK, 0 rows affected (0.01 sec)

MySQL [bosco1]> create table bosco2.bosco2_tb01(id int);
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> insert into bosco1.bosco1_tb01(id) values(1);
Query OK, 1 row affected (0.01 sec)

MySQL [bosco1]> insert into bosco2.bosco2_tb01(id) values(1);
Query OK, 1 row affected (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.01 sec)

那么来查看一下上面的操作有没有写入binlog中:

# mysqlbinlog --verbose --base64-output=decode-rows mysql-bin.000006
……
SET @@session.collation_database=DEFAULT/*!*/;
create table bosco1.bosco1_tb01(id int)
/*!*/;
# at 211
#141026  1:37:44 server id 1303308  end_log_pos 315 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258664/*!*/;
create table bosco2.bosco2_tb01(id int)
/*!*/;
# at 315
#141026  1:37:44 server id 1303308  end_log_pos 385 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258664/*!*/;
BEGIN
/*!*/;
# at 385
# at 437
#141026  1:37:44 server id 1303308  end_log_pos 437 	Table_map: `bosco1`.`bosco1_tb01` mapped to number 49
#141026  1:37:44 server id 1303308  end_log_pos 471 	Write_rows: table id 49 flags: STMT_END_F
### INSERT INTO `bosco1`.`bosco1_tb01`
### SET
###   @1=1
# at 471
#141026  1:37:44 server id 1303308  end_log_pos 498 	Xid = 200
COMMIT/*!*/;
# at 498
#141026  1:37:49 server id 1303308  end_log_pos 541 	Rotate to mysql-bin.000011  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
可见,指定了binlog-do-db=bosco1,事务隔离级别RR + binlog_format=row:
在使用指定的database(bosco1数据库)下操作本身库中的表所有DDL/DML操作都会记录到binlogs中,而操作其他库中的表时,只有DDL操作被记录下来,DML操作都不会记录。


4. 测试3:use bosco1及SBR/MBR下

binlog-do-db=bosco1;

MySQL [bosco2]> use bosco1;

MySQL [bosco1]> select @@tx_isolation,@@binlog_format;
+-----------------+-----------------+
| @@tx_isolation  | @@binlog_format |
+-----------------+-----------------+
| REPEATABLE-READ | STATEMENT       |
+-----------------+-----------------+
1 row in set (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> create table bosco1.bosco1_tb01(id int);
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> create table bosco2.bosco2_tb01(id int);
Query OK, 0 rows affected (0.00 sec)

MySQL [bosco1]> insert into bosco1.bosco1_tb01(id) values(1);
Query OK, 1 row affected (0.00 sec)

MySQL [bosco1]> insert into bosco2.bosco2_tb01(id) values(1);
Query OK, 1 row affected (0.00 sec)

MySQL [bosco1]> flush logs;
Query OK, 0 rows affected (0.00 sec)
那么来查看一下上面的操作有没有写入binlog中:
# mysqlbinlog --verbose --base64-output=decode-rows mysql-bin.000008
……
SET @@session.collation_database=DEFAULT/*!*/;
create table bosco1.bosco1_tb01(id int)
/*!*/;
# at 211
#141026  1:33:43 server id 1303308  end_log_pos 315 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258423/*!*/;
create table bosco2.bosco2_tb01(id int)
/*!*/;
# at 315
#141026  1:33:48 server id 1303308  end_log_pos 385 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258428/*!*/;
BEGIN
/*!*/;
# at 385
#141026  1:33:48 server id 1303308  end_log_pos 494 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258428/*!*/;
insert into bosco1.bosco1_tb01(id) values(1)
/*!*/;
# at 494
#141026  1:33:48 server id 1303308  end_log_pos 521 	Xid = 188
COMMIT/*!*/;
# at 521
#141026  1:33:50 server id 1303308  end_log_pos 591 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258430/*!*/;
BEGIN
/*!*/;
# at 591
#141026  1:33:50 server id 1303308  end_log_pos 700 	Query	thread_id=14	exec_time=0	error_code=0
SET TIMESTAMP=1414258430/*!*/;
insert into bosco2.bosco2_tb01(id) values(1)
/*!*/;
# at 700
#141026  1:33:50 server id 1303308  end_log_pos 727 	Xid = 189
COMMIT/*!*/;
# at 727
#141026  1:33:58 server id 1303308  end_log_pos 770 	Rotate to mysql-bin.000009  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
可见,指定了binlog-do-db=bosco1,事务隔离级别RR + binlog_format=statement,在使用指定的database(bosco1数据库)下操作所有数据库下的表中的所有操作DML都会记录到binlogs中,即使是操作非binlog-do-db=bosco1指定数据库下的表;而且DDL也会被记录。另外在binlog_format=mixed下也是一样的结果。

有兴趣的朋友,也可以测试下binlog-ignore-db,相信也会大吃一惊的。

blog地址:http://blog.csdn.net/hw_libo/article/details/40476577

-- Bosco  QQ:375612082

---- END ----
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!


为何 MySQL的 binlog

The danger is simple: they don't work the way you think they do. Consider the following scenario: you set binlog-ignore-db to "garbage" so data in the garbage database (which doesn't exist on the slave) isn't replicated. (I'll come back to this in a second, so if you already see the problem, don't rush to the comment form.)Now you do the following:现在做下面的事情:$ mysqlmysql delete from garbage.junk;mysql use garbage;mysql update production.users set disabled = 1 where user = "root";You just broke replication, twice. Once, because your slave is going to execute the first query and there's no such table "garbage.junk" on the slave. The second time,silently, because the update to production.users isn't replicated, so now the root user isn't disabled on the slave.复制会broke2次, 第一次,因为 slave尝试着去之西你给第一条语句,但是slave上并没有这样的表"garbage.junk" , 第二次, 隐含的, 因为 对 production.users不会被 复制,因为 root帐号并没有在slave上被禁用掉.Why? Because binlog-ignore-db doesn't do what you think. The phrase I used earlier, "data in the garbage database isn't replicated," is a fallacy. That's not what it does. In fact, itfilters out binary logging for statements issued from connections whose default database is "garbage."In other words, filtering is not based on the contents of the query -- it is based on what database you USE.The other configuration options I mentioned work similarly. The binlog-do-db and binlog-ignore......余下全文>>
 

mysql主从复制:为何在myini文件中添加binlog-do-db就同步失败?解决

binlog_do_db:二进制日志需要记录哪些数据库的更新语句。
另外,你看一下,是下划线。但不知道短横线是否管用!
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4205.html NewsArticle MySQL参数binlog-do-db对binlogs写入的影响,mysqlbinlogdodb 1. 环境描述 目的:当数据库中设置了binlog-do-db时,在不同的binlog_format=statement | row | mixed 下对binlog的写入影响,这个在主从复制中会有...
相关文章
    暂无相关文章
评论暂时关闭