设为首页 收藏本站
查看: 780|回复: 0

[经验分享] MySQL 5.7贴心参数之binlog

[复制链接]

尚未签到

发表于 2017-12-12 11:43:49 | 显示全部楼层 |阅读模式
  相信大家都了解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看看啥情况
  

[iyunv@yayundeng 3306]# mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | tail -n 20  
#
161210 11:02:32 server>
### 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>
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*/;
  
[iyunv@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看看啥情况:
  

[iyunv@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>
# at 2263  
#
161210 11:05:44 server>
### 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>
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*/;
  
[iyunv@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,支持函数索引(通过虚拟列实现),支持只读事务等等等。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423299-1-1.html 上篇帖子: MYSQL数据库设计规范与原则 下篇帖子: MySql中4种批量更新的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表