首页 > 数据库 >MySQL 5.7贴心参数之binlog_row_image=full

MySQL 5.7贴心参数之binlog_row_image=full

时间:2024-06-15 10:00:50浏览次数:23  
标签:binlog full 5.7 image nullable mysql ### row

相信大家都了解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,支持函数索引(通过虚拟列实现),支持只读事务等等等。

 

作者:Atlas

出处:Atlas的博客 http://www.cnblogs.com/gomysql

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。如果您需要技术支持,本人亦提供有偿服务。

  分类: MySQL5.7 标签: MySQL , binlog 好文要顶 关注我 收藏该文 微信分享 yayun
粉丝 - 305 关注 - 3     +加关注 2 0       « 上一篇: MySQL启动错误排查
» 下一篇: Greenplum各种Tips(不定时更新) posted @ 2016-12-10 11:15  yayun  阅读(20917)  评论(3)  编辑  收藏  举报  
评论列表 默认|按时间|按支持数      回复 引用 #1楼 2017-03-21 23:24 xiaohuazi 5.6.35上也有binlog_row_image这个参数
如果设置为minimal,那么误update语句的恢复做不了吧 支持(1) 反对(1)    回复 引用 #2楼 2021-06-21 19:39 萧叶秋

fewa{fe()}faew**> > []([]([]([](********))))``**

支持(0) 反对(0)    回复 引用 #3楼 2022-04-08 23:47 金子不发慌

人家明明是列,你全文说行。。。搞的人一愣一愣的
(1)full: Log all columns in both the before image and the after image.
(2)minimal: Log only those columns in the before image that are required to identify the row to be changed; log only those columns in the after image where a value was specified by the SQL statement, or generated by auto-increment.
(3)noblob: Log all columns (same as full), except for BLOB and TEXT columns that are not required to identify rows, or that have not changed.

支持(0) 反对(0)        

标签:binlog,full,5.7,image,nullable,mysql,###,row
From: https://www.cnblogs.com/cheyunhua/p/18249039

相关文章

  • 使用自定义查询参数获取 fullcalendar api
    我正试图配置fullcalendar5从数据库中获取api。除了开始和结束之外,我还想向请求传递额外的查询参数。我已经尝试过这种方法,但发现请求总是忽略附加参数。events:{url:'http://localhost:4000/api/timesheet'、type:'GET'、......
  • SARscape5.7中DS-InSAR:E-SBAS操作说明
    PS-InSAR方法测量PS点的形变,SBAS-InSAR方法测量分布式散射体DS(DistributedScatters)的形变。随着技术的发展,在这一领域取得了许多研究进展,SARscape5.7版本开始,提供了能够同时提取PS和DS测量值的新方法,即增强型永久散射体(E-PS)和增强型短基线(E-SBAS)。E-PS和E-SBAS这两种方法都可以......
  • 5.7
    与小组成员继续讨论如何完成作业的侧边栏以及其他部分,并且完成了该类中的所有应用代码行量:143行学习所花时间:1h  packagecom.example.memosystem.activity;importandroidx.annotation.NonNull;importandroidx.appcompat.app.ActionBarDrawerToggle;importandroidx.appc......
  • MySQL5.7编码设置
    MySQL5.7编码设置——解决在命令行操作sql乱码问题修改mysql的数据目录下(当时你指定安装的数据目录,或者去C:\ProgramData\MySQL\MySQLServer5.7下找)的my.ini配置文件:[mysql]#大概63行左右,在其下面添加default-character-set=utf8[mysqld]#大概76行左右,在其下面添加char......
  • 解决 发生异常: RuntimeError (note: full exception trace is shown but execu
    发生异常:RuntimeError(note:fullexceptiontraceisshownbutexecutionispausedat:<module>)Anattempthasbeenmadetostartanewprocessbeforethecurrentprocesshasfinisheditsbootstrappingphase.Thisproba......
  • mysql阶段03 mysql多实例, 数据库主从, mysql5.6和5.7区别, 用户管理, 权限管理
    一、mysql的多实例nginx多实例,就是配置多个配置文件mysql多实例:1.有多个配置文件2.多端口3.多个socket文件4.多个日志文件5.多个server_id1.创建多实例存放目录之前数据库已安装在/usr/local/mysql下[root@db03~]#mkdir/usr/local/{3307,3308,3309}-p2.配置......
  • mysql 5.7以后需要设置安全导向
    //mysql_secure_installation安全配置向导[root@youxi1~]#mysql_secure_installationSecuringtheMySQLserverdeployment.Enterpasswordforuserroot://输入root密码The'validate_password'pluginisinstalledontheserver.Thesubsequentstepsw......
  • 5.7
    问题:url中机器地址写127.0.0.1或是localhost时不会发生,但写真实IP就出现此异常,即使从本机运行也会出此错。解决方法:在MySQL控制台,执行以下命令:mysql>usemysql;Databasechangedmysql>updateusersethost='%'whereuser='root';QueryOK,1rowaffected(0.04sec)......
  • MySQL5.7 通过逻辑备份迁移到GreatSQL注意事项
    一、背景概述在将数据库从MySQL5.7迁移到GreatSQL8.0.32时,由于数据量较小且关注安全性,决定使用mysqldump执行逻辑备份,并将数据导入GreatSQL。但在备份时采用了备份全库(--all-databases)的方式,在导入GreatSQL后,修改用户密码时出现错误。这是因为mysqldump备份时包括了mysql系统......
  • SARscape5.7中DS-InSAR:E-PS操作说明
    PS-InSAR方法测量PS点的形变,SBAS-InSAR方法测量分布式散射体DS(DistributedScatters)的形变。随着技术的发展,在这一领域取得了许多研究进展,SARscape5.7版本开始,提供了能够同时提取PS和DS测量值的新方法,即增强型永久散射体(E-PS)和增强型短基线(E-SBAS)。E-PS和E-SBAS这两种方法都可以......