谨慎设置binlog_format=MIXED

 binlog_format有三种格式,STATEMENT、ROW和MIXED。statement在二进制日志里,记录的是实际的SQL语句,ROW在二进制日志记录的是实际行的变更。
  在二进制日志里,MIXED默认还是采用STATEMENT格式记录的,但在下面这6种情况下会转化为ROW格式:
  第一种情况:DNB引擎,表的DML操作会以ROW格式记录。
  第二种情况:SQL语句里包含了UUID()函数。第三种情况:自增长字段被更新了。
  第四种情况:包含了INSERT DELAYED语句。
  第五种情况:使用了用户定义函数(UDF)。
  第六种情况:使用了临时表。
 下边看一个案例,主从都是MySQL5.6,binlog_format被设置为MIXED格式,看看会有什么样的问题。
主库:

点击(此处)折叠或打开

  1. mysql> select * from test01;
  2. +------+--------+
  3. | id | name |
  4. +------+--------+
  5. | 1 | steven |
  6. | 2 | steven |
  7. | 3 | steven |
  8. | 4 | steven |
  9. | 5 | steven |
  10. | 6 | steven |
  11. +------+--------+
从库:

点击(此处)折叠或打开

  1. mysql> select * from test01;
  2. +------+--------+
  3. | id | name |
  4. +------+--------+
  5. | 1 | steven |
  6. | 2 | steven |
  7. | 3 | steven |
  8. | 4 | steven |
  9. | 5 | steven |
  10. +------+--------+
在master上执行如下SQL:

点击(此处)折叠或打开

  1. mysql> update test01 set name='StevenBJ' where id=6;
  2. Query OK, 1 row affected (0.07 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0
  4. mysql> select * from test01;
  5. +------+----------+
  6. | id | name |
  7. +------+----------+
  8. | 1 | steven |
  9. | 2 | steven |
  10. | 3 | steven |
  11. | 4 | steven |
  12. | 5 | steven |
  13. | 6 | StevenBJ |
  14. +------+----------+
  查看二进制日志没有报错,原因是采用的是mixed模式,但是默认采用的statement格式记录。
 修改binlog_format=row之后,在master执行刚才的语句,然后在master查看二进制日志:
[root@mysql data]# mysqlbinlog --no-defaults mysql-bin.000004
/*!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
#170808 11:32:02 server id 1  end_log_pos 120 CRC32 0x078ce9f0 Start: binlog v 4, server v 5.6.36-log created 170808 11:32:02 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
sjCJWQ8BAAAAdAAAAHgAAAABAAQANS42LjM2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACyMIlZEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAfDp
jAc=
'/*!*/;
# at 120
#170808 11:45:20 server id 1  end_log_pos 192 CRC32 0x736e3ccf Query thread_id=2 exec_time=1 error_code=0
SET TIMESTAMP=1502163920/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 192
#170808 11:45:20 server id 1  end_log_pos 244 CRC32 0xda92178e Table_map: `test`.`test01` mapped to number 81
# at 244#170808 11:45:20 server id 1  end_log_pos 310 CRC32 0x65485ceb Update_rows: table id 81 flags: STMT_END_F
BINLOG '
0DOJWRMBAAAANAAAAPQAAAAAAFEAAAAAAAEABHRlc3QABnRlc3QwMQACAw8CHgADjheS2g==
0DOJWR8BAAAAQgAAADYBAAAAAFEAAAAAAAEAAgAC///8BgAAAAhTdGV2ZW5CSvwGAAAAClN0ZXZl
bkJlaWrrXEhl
'/*!*/;
# at 310
#170808 11:45:20 server id 1  end_log_pos 341 CRC32 0xbeced65f Xid = 55
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@mysql data]# date
Tue Aug  8 11:47:01 CST 2017
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值