MySQL 5.7贴心参数之binlog_row_image

摘要:
我相信大家都知道mysqlbinlog的格式。mysqlbinlog有三种类型:STATEMENT、MiXED和ROW。在MySQL 5.7之前,ROW格式具有各种优势。在MySQL 5.7之后,binlog格式默认为ROW,并引入了一个新参数binlog _ ROW_ Image。此参数的默认值为FULL,其他值为最小值。mysql˃显示变量,如“%row_im%”;+-------------------+--------+|变量_名称|值|+-----------------+--------+|binlog_行_图像|FULL|+------------------+--------+1rowinsetmysql˃updatet2setuid=99其中name='yayundeng';QueryOK,1rowffectedRowsmatched:1已更改:1警告:0mysql˃分析binlog以查看发生了什么[root@yayundeng3306]#mysqlbinlog--no-defaults-v-v-base64输出=解码ROWSmysqlbin。000010|tail-n20#161210111:02:32serverid152end_log_pos2043CRC320x3ce8a225更新_行:tableid110标志:STMT_END_F###UPDATE `test`。`t2`###WHERE###@1=1/*INTmeta=0nullable=0is_null=0*/###@2='gz'/*STRINGmeta=65044nullable=1is_null=0*/###@3='yayunden'/*STRING meta=65044 nullable=1is_null=0*/###@4=1/*INTmeta=0nullaable=1is_null=0*/##SET###@1=1/*INTmeta=0 nullable=0 is_null=0*/###@2='gz'/*STRINGmeta=65044nullable=1is_null=0*/###@3='yayundeng'/*STRINGmeta=65044nullable=1is_null=0*/###@4=99/*INTmeta=0nullable=1is_nall=null=0*/#at2043#1612011:02:32serverid152end_log_pos2074CRC320x93619126Xid=49COMMIT/*!50530设置@@会话。伪从属模式=0*/;[ root@yayundeng3306]#可以清楚地看到,当binlog_row_After image设置为最小值时,binlog只记录受影响的行。

相信大家都了解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版本的其他功能都有人提到了,这个没人提到,我也简单的介绍一下,哈哈。(后面发现5.6就有该参数了,关注度不够,该死。。)

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

mysql> show variables like '%row_im%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| binlog_row_image | FULL  |
+------------------+-------+
1 row in set (0.01 sec)

mysql> update t2 set uid=99 where name='yayundeng';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> 

解析binlog看看啥情况

[root@yayundeng 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 110 flags: 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='yayundeng' /* 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='yayundeng' /* STRING(20) meta=65044 nullable=1 is_null=0 */
###   @4=99 /* INT meta=0 nullable=1 is_null=0 */
# at 2043
#161210 11:02:32 server id 152  end_log_pos 2074 CRC32 0x93619126       Xid = 49
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@yayundeng 3306]# 

下面设置一下binlog_row_image的值为minimal

mysql> set  binlog_row_image ='minimal';
Query OK, 0 rows affected (0.00 sec)

mysql> update t2 set uid=100 where name='yayundeng';  
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> 

再解析binlog看看啥情况:

[root@yayundeng 3306]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | tail -n 20
SET TIMESTAMP=1481339144/*!*/;
BEGIN
/*!*/;
# at 2211
#161210 11:05:44 server id 152  end_log_pos 2263 CRC32 0x57948074       Table_map: `test`.`t2` mapped to number 110
# at 2263
#161210 11:05:44 server id 152  end_log_pos 2309 CRC32 0x72114b1f       Update_rows: table id 110 flags: 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 = 52
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@yayundeng 3306]# 

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

总结:

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

免责声明:文章转载自《MySQL 5.7贴心参数之binlog_row_image》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mybatis之动态SQL操作之更新数据库(DDL、DML、DQL)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mongodb与mysql命令详细对比

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。 MySQL MongoDB 说明...

深入学习之mysql(三)单表操作

1、创建表的结构和数据 CREATE TABLE `t_student`( `id` INT PRIMARY KEY, `stuName` VARCHAR(10) NOT NULL, `age` INT NOT NULL, `sex` VARCHAR (4), `gradeName` VARCHAR(10) NOT NULL ); 插入数据: INSERT...

Django三种风格模型继承

Django三种风格的模型继承 只要继承了model.Model, 就会生成一个新的表,但是,如果在Meta方法中添加abstract=True,就不会产生新的表,而是作为一个基类存放多个表共同拥有的方法和字段等 抽象类继承:父类继承自models.Model,但不会在底层数据库中生成相应的数据表,父类的属性列存储在其子类的数据表中。 多表继承:父类和子...

mysql 修改字符集

1: 在Mysql的配置文件 my.ini (一般在c:/windows/下面) 里加上服务器的默认编码配置: default-character-set=utf82: 修改你的数据库的字符编码:进入Mysql数据库,通过命令修改你的数据库字符编码: ALTER DATABASE `databaseName` DEFAULT CHARACTER SET u...

linux-mysql8的安装步骤详解及需要注意的坑

(本文由言念小文原创,转载请注明出处) 前言最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导资料。 Linux上mysql安装方法个人目前使用的有两种: 一种是基于rpm安装; 另一种就是在windows上将安装包下载下来,然后通过ftp、lrzsz等工具将包传输到linux,然后再手动解压安装。 由于我的系统为centos,因此这里直接使...

DorisSQL与MySQL函数对照 差异篇

## 1.日期函数### 时区.```mysql -> convert_tz(dt,from_tz,to_tz)doris -> CONVERT_TZ(DATETIME dt, VARCHAR from_tz, VARCHAR to_tz)```### 获取当前的日期,以DATE类型返回.```mysql -> CURDATE()dori...