mysql binlogrowimage_MySQL 5.7贴心参数之binlog_row_image

相信大家都了解MySQL binlog的格式,那就是有三种,分别是STATEMENT,MiXED,ROW。各有优劣,具体的请大家自行查阅资料。在MySQL 5.7版本以前,虽然ROW格式有各种各样的好处。

1. 比如加快从库重放日志;ROW直接调用mysql的存储引擎接口(handler API) 来执行行的插入、删除和更新,完全跳过了mysql的优化器的处理逻辑。

2. 保证主从数据的一致性。记录的每一行的变更。

3. 可以通过对binlog的逆向解析实现闪回功能。

那么实际上还是有一个缺陷,那就是由于记录的是每一行的变更,会带来磁盘IO上的开销,同时由于binlog日志变大,网络开销也变大了。那么在MySQL 5.7以后binlog的格式默认就是ROW了,同时引入了新的参数binlog_row_image,这个参数默认值是FULL,其还有一个值是minimal。由于5.7版本的其他功能都有人提到了,这个没人提到,我也简单的介绍一下,哈哈。

FULL记录每一行的变更,minimal只记录影响后的行。下面简单的测试一下大家就明白了。

mysql> show variables like '%row_im%';+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| binlog_row_image | FULL |

+------------------+-------+

1 row in set (0.01sec)

mysql> update t2 set uid=99 where name='linuxidc';

Query OK,1 row affected (0.03sec)

Rows matched:1 Changed: 1 Warnings: 0mysql>

解析binlog看看啥情况

[root@linuxidc 3306]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | tail -n 20#161210 11:02:32 server id 152 end_log_pos 2043 CRC32 0x3ce8a225 Update_rows: table id 110flags: STMT_END_F

### UPDATE `test`.`t2`

### WHERE

### @1=1 /* INT meta=0 nullable=0 is_null=0 */

### @2='gz' /* STRING(20) meta=65044 nullable=1 is_null=0 */

### @3='linuxidc' /* STRING(20) meta=65044 nullable=1 is_null=0 */

### @4=1 /* INT meta=0 nullable=1 is_null=0 */

### SET

### @1=1 /* INT meta=0 nullable=0 is_null=0 */

### @2='gz' /* STRING(20) meta=65044 nullable=1 is_null=0 */

### @3='linuxidc' /* STRING(20) meta=65044 nullable=1 is_null=0 */

### @4=99 /* INT meta=0 nullable=1 is_null=0 */# at2043#161210 11:02:32 server id 152 end_log_pos 2074 CRC32 0x93619126 Xid = 49COMMIT/*!*/;

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /*added by mysqlbinlog*/ /*!*/;

DELIMITER ;

# End of logfile

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@linuxidc3306]#

下面设置一下binlog_row_image的值为minimal

mysql> set binlog_row_image ='minimal';

Query OK,0 rows affected (0.00sec)

mysql> update t2 set uid=100 where name='linuxidc';

Query OK,1 row affected (0.02sec)

Rows matched:1 Changed: 1 Warnings: 0mysql>

再解析binlog看看啥情况:

[root@linuxidc 3306]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | tail -n 20SET TIMESTAMP=1481339144/*!*/;

BEGIN/*!*/;

# at2211#161210 11:05:44 server id 152 end_log_pos 2263 CRC32 0x57948074 Table_map: `test`.`t2` mapped to number 110# at2263#161210 11:05:44 server id 152 end_log_pos 2309 CRC32 0x72114b1f Update_rows: table id 110flags: STMT_END_F

### UPDATE `test`.`t2`

### WHERE

### @1=1 /* INT meta=0 nullable=0 is_null=0 */

### SET

### @4=100 /* INT meta=0 nullable=1 is_null=0 */

# at 2309#161210 11:05:44 server id 152 end_log_pos 2340 CRC32 0x23e45a71 Xid = 52COMMIT/*!*/;

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /*added by mysqlbinlog*/ /*!*/;

DELIMITER ;

# End of logfile

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@linuxidc3306]#

可以清楚的看到,当把binlog_row_image设置为minimal以后,binlog记录的就只是影响后的行,大赞。如此一来使用ROW格式一定是首选了,完全没必要使用STATEMENT,MiXED。不过现在也没有人使用STATEMENT了,所以准确的说就是完全没必要使用MiXED格式了。

总结:

MySQL 5.7是真正的一个里程碑的版本,比如可以在线调整bp pool,在线修改复制过滤,真正意义上多线程复制(5.6是基于库,5.7是基于表),支持bp pool预热,支持undo log回收,支持通用表空间,支持json,支持函数索引(通过虚拟列实现),支持只读事务等等等。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值