共计 6617 个字符,预计需要花费 17 分钟才能阅读完成。
行业资讯
数据库
MySQL 数据库
如何理解 binlog 的 binlog_rows_query_log_events 和 binlog_row_image 参数
这期内容当中丸趣 TV 小编将会给大家带来有关如何理解 binlog 的 binlog_rows_query_log_events 和 binlog_row_image 参数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
mysql 5.6.2 引入的两个参数 binlog_rows_query_log_events 和 binlog_row_image
对于使用 row 格式的 binlog, 个人觉得很有用;
binlog_rows_query_log_events =1
在 row 模式下.. 开启该参数, 将把 sql 语句打印到 binlog 日志里面. 默认是 0(off);
虽然将语句放入了 binlog, 但不会执行这个 sql, 就相当于注释一样. 但对于 dba 来说, 在查看 binlog 的时候, 很有用处.
binlog_row_image= minimal
默认为 full, 在 binlog 为 row 格式下,full 将记录 update 前后所有字段的值,minimal 时, 只记录更改字段的值和 where 字段的值,noblob 时, 记录除了 blob 和 text 的所有字段的值, 如果 update 的 blob 或 text 字段, 也只记录该字段更改后的值, 更改前的不记录;
大家都知道 row 格式下的 binlog 增长速度太快, 对存储空间, 主从传输都是一个不小的压力. 因为每个 event 记录了所有更改数据前后的值, 不管数据是否有改动都会记录.binlog_row_image 的引入就大大减少了 binlog 记录的数据. 在结合 binlog_rows_query_log_events, 对于 dba 日常维护 binlog 是完全没有压力的, 而且节省了硬盘空间开销, 减小 I /O, 减少了主从传输压力;
下面通过举例说明:
下面就是一个事务在 row 格式下的 binlog 日志, 红色部分就是 binlog_rows_query_log_events 后的效果; 黄色部分就是 binlog_row_image=full 的结果, 记录所有字段在更改前后的值;
# at 1134
#161118 17:25:49 server id 3310 end_log_pos 1199 CRC32 0x3d0190ce GTID last_committed=1 sequence_number=2
SET @@SESSION.GTID_NEXT= 59194c6e-70db-11e6-b85b-5254002eb131:299 /*!*/;
# at 1199
#161118 17:25:49 server id 3310 end_log_pos 1270 CRC32 0x0bc5f8df Query thread_id=26 exec_time=0 error_code=0
SET TIMESTAMP=1479461149/*!*/;
BEGIN
/*!*/;
# at 1270
#161118 17:25:49 server id 3310 end_log_pos 1332 CRC32 0x7533bf59 Rows_query
# update t11 set col7 = xxx where id =2 ############## 这一行就是启用了 binlog_rows_query_log_events 后的效果;
# at 1332
#161118 17:25:49 server id 3310 end_log_pos 1396 CRC32 0x75f09d77 Table_map: `tt1`.`t11` mapped to number 137
# at 1396
#161118 17:25:49 server id 3310 end_log_pos 1929 CRC32 0xa6eb390e Update_rows: table id 137 flags: STMT_END_F
### UPDATE `tt1`.`t11`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @3= bbbbbbbbbbbbbbbbbbbb /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4= cccccccccccccccccccc /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @5= dddddddddddddddddddd /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @6= eeeeeeeeeeeeeeeeeeee /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @7= ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @8= gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### SET
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @3= bbbbbbbbbbbbbbbbbbbb /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4= cccccccccccccccccccc /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @5= dddddddddddddddddddd /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @6= eeeeeeeeeeeeeeeeeeee /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @7= ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
### @8= xxx /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
# at 1929
#161118 17:25:49 server id 3310 end_log_pos 1960 CRC32 0x9d147914 Xid = 551
COMMIT/*!*/;
看下面的例子: 黄色部分就是 binlog_row_image= minimal 的日志. 只记录了更改后的值和 where 值. 跟上面的例子一对比就发现减少了太多记录;
# at 1960
#161118 17:26:25 server id 3310 end_log_pos 2025 CRC32 0x20921004 GTID last_committed=2 sequence_number=3
SET @@SESSION.GTID_NEXT= 59194c6e-70db-11e6-b85b-5254002eb131:300 /*!*/;
# at 2025
#161118 17:26:25 server id 3310 end_log_pos 2096 CRC32 0x0c129ffb Query thread_id=26 exec_time=0 error_code=0
SET TIMESTAMP=1479461185/*!*/;
BEGIN
/*!*/;
# at 2096
#161118 17:26:25 server id 3310 end_log_pos 2158 CRC32 0x6a5031d0 Rows_query
# update t11 set col1 = xxx where id =3
# at 2158
#161118 17:26:25 server id 3310 end_log_pos 2222 CRC32 0x34de716f Table_map: `tt1`.`t11` mapped to number 137
# at 2222
#161118 17:26:25 server id 3310 end_log_pos 2268 CRC32 0x77563057 Update_rows: table id 137 flags: STMT_END_F
### UPDATE `tt1`.`t11`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### SET
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
# at 2268
#161118 17:26:25 server id 3310 end_log_pos 2299 CRC32 0xe9b5eaa7 Xid = 555
COMMIT/*!*/;
下面看看 binlog_row_image=noblob 时的情况, 在 noblob 下, 跟 full 唯一的区别是没有记录字段类型为 text 和 blob 的值, 其他的都记录了. 而且在例子中特意更改了 @8(col7), 这是一个 text 类型的字段, 可以看到, 在 set 前是没有记录整个字段的, 只是记录该值 set 后的值;
# at 3691
#161118 17:27:01 server id 3310 end_log_pos 3756 CRC32 0x59fb0d65 GTID last_committed=6 sequence_number=7
SET @@SESSION.GTID_NEXT= 59194c6e-70db-11e6-b85b-5254002eb131:304 /*!*/;
# at 3756
#161118 17:27:01 server id 3310 end_log_pos 3827 CRC32 0x9943381e Query thread_id=26 exec_time=0 error_code=0
SET TIMESTAMP=1479461221/*!*/;
BEGIN
/*!*/;
# at 3827
#161118 17:27:01 server id 3310 end_log_pos 3889 CRC32 0xa617db5e Rows_query
# update t11 set col7 = xxx where id =4
# at 3889
#161118 17:27:01 server id 3310 end_log_pos 3953 CRC32 0x74e30167 Table_map: `tt1`.`t11` mapped to number 137
# at 3953
#161118 17:27:01 server id 3310 end_log_pos 4180 CRC32 0xd92fe8dc Update_rows: table id 137 flags: STMT_END_F
### UPDATE `tt1`.`t11`
### WHERE
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @3= bbbbbbbbbbbbbbbbbbbb /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4= cccccccccccccccccccc /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @5= dddddddddddddddddddd /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @6= eeeeeeeeeeeeeeeeeeee /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### SET
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @3= bbbbbbbbbbbbbbbbbbbb /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4= cccccccccccccccccccc /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @5= dddddddddddddddddddd /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @6= eeeeeeeeeeeeeeeeeeee /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @8= xxx /* BLOB/TEXT meta=2 nullable=1 is_null=0 */
# at 4180
#161118 17:27:01 server id 3310 end_log_pos 4211 CRC32 0x87487ec8 Xid = 561
COMMIT/*!*/;
# at 4211
对于 delete 效果也是一样的, 就不一一举例了..
BEGIN
/*!*/;
# at 4347
#161118 18:46:03 server id 3310 end_log_pos 4398 CRC32 0xd76dbd23 Rows_query
# delete from t11 where id =2
# at 4398
#161118 18:46:03 server id 3310 end_log_pos 4462 CRC32 0x75656a14 Table_map: `tt1`.`t11` mapped to number 137
# at 4462
#161118 18:46:03 server id 3310 end_log_pos 4590 CRC32 0xafec2072 Delete_rows: table id 137 flags: STMT_END_F
### DELETE FROM `tt1`.`t11`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2= xxx /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @3= bbbbbbbbbbbbbbbbbbbb /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @4= cccccccccccccccccccc /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @5= dddddddddddddddddddd /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### @6= eeeeeeeeeeeeeeeeeeee /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
# at 4590
#161118 18:46:03 server id 3310 end_log_pos 4621 CRC32 0x179ae194 Xid = 562
COMMIT/*!*/;
上述就是丸趣 TV 小编为大家分享的如何理解 binlog 的 binlog_rows_query_log_events 和 binlog_row_image 参数了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。