由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法
admin
2023-05-16 00:21:48
0

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法





binlog_format为row格式的时候记录的不是简单的sql,而是实际变更的行,一些大的DML操作,会导致binlog量增加很大,消耗额外的IO、网络资源


可以通过设置binlog_row_p_w_picpath=minimal解决


测试:

binlog_row_p_w_picpath默认值是full

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法


对user表进行update

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法


进入binlog里面查看更新记录,binlog日志将所有影响的行都进行了记录

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法


现在将binlog_row_p_w_picpath=minimal

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法


对表中的行进行相同的update操作 再来观察下binlog记录

由于数据库 Blob字段太多,导致从库进行binlog不能正常进行的处理方法


结论:可以对比发现当binlog_row_p_w_picpath=minimal的时候binlog只记录了影响的那一行记录,有效减少了binlog日志量。



数据库版本:5.6.*

1.row日志p_w_picpath类型

参数binlog_row_p_w_picpath 控制着这种p_w_picpath类型,默认为FULL(log all columns),即记录before&after p_w_picpaths。
该参数还有两种,minimal和noblob,minimal表示只记录after更改后的值,并且如果有主键或者非空唯一索引,则只以该字段作为where条件判断;noblob同full,只是不记录blob、text列。

2.binlog日志

对于insert则没有什么好说的,我们主要重点关注一下update和delete操作。

binlog_row_p_w_picpath=full的情况下,对于update和delete所有的表(包含带有主键、非空唯一索引,唯一索引,没有索引)产生的binlog均一致,binlog情况如下:

  1. --建表语句

  2. CREATE TABLE `pk_test`(

  3. `id` bigint(20) NOT NULL,

  4. `username` varchar(30) NOT NULL,

  5. PRIMARY KEY (`id`)

  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  7. insert into pk_test values (1,2);

  8. insert into pk_test values (2,2);

  9. commit;

  10. show master statusG;--记录binlog文件和pos

  11. deletefrom pk_test where id =1;

  12. update pk_test set username='3';

  13. commit

  14. mysqlbinlog --no-defaults ---start-position=637945822/mysqllog/3307/binlog/mysql-bin.000001| more

  15. ### DELETE FROM `baofeng`.`pk_test`

  16. ### WHERE

  17. ### @1=1

  18. ### @2='2'

  19. .....

  20. ### UPDATE `baofeng`.`pk_test`

  21. ### WHERE

  22. ### @1=2

  23. ### @2='2'

  24. ### SET

  25. ### @1=2

  26. ### @2='3'

从上面我们可以看到,在默认为FULL的binlog_row_p_w_picpath下,无论表有没有主键、唯一索引,全部按照全表字段作为条件,且update会更新全部字段。

binlog_row_p_w_picpath=minimal的情况下:

  1. --建表语句

  2. CREATE TABLE `ui_test`(

  3. `id` bigint(20) NOT NULL,

  4. `username` varchar(30) NOT NULL,

  5. UNIQUE (`id`)

  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  7. CREATE TABLE `ui_test_null`(

  8. `id` bigint(20),

  9. `username` varchar(30) NOT NULL,

  10. UNIQUE key (`id`)

  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  12. CREATE TABLE `null_test`(

  13. `id` bigint(20),

  14. `username` varchar(30) NOT NULL

  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  16. insert into pk_test values (1,2);

  17. insert into ui_test values (1,2);

  18. insert into ui_test_null values (1,2);

  19. insert into null_test values (1,2);

  20. commit;

  21. update pk_test set username='4';

  22. deletefrom pk_test;

  23. deletefrom ui_test;

  24. deletefrom ui_test_null;

  25. update null_test set username='4';

  26. deletefrom null_test;

  27. ### UPDATE `baofeng`.`pk_test`

  28. ### WHERE

  29. ### @1=1

  30. ### SET

  31. ### @2='4'

  32. ....

  33. ### DELETE FROM `baofeng`.`pk_test`

  34. ### WHERE

  35. ### @1=1

  36. .....

  37. ### DELETE FROM `baofeng`.`ui_test`

  38. ### WHERE

  39. ### @1=1

  40. .....

  41. ### DELETE FROM `baofeng`.`ui_test_null`

  42. ### WHERE

  43. ### @1=1

  44. ### @2='2'

  45. .....

  46. ### UPDATE `baofeng`.`null_test`

  47. ### WHERE

  48. ### @1=1

  49. ### @2='2'

  50. ### SET

  51. ### @2='4'

  52. .....

  53. ### DELETE FROM `baofeng`.`null_test`

  54. ### WHERE

  55. ### @1=1

  56. ### @2='2'

从上面的例子可以看到,当binlog_row_p_w_picpath=minimal的情况下,where条件只有主键或不为空的唯一索引,且只会更新被改变的字段。

3.总结:

在上面的测试我们可以看到,如果采用minimal格式,将减少主键和非空唯一索引表的before值,以及减少所有表update的after未被改变的值。
从效率上来说,减少了网络传输以及加快了update的效率。

参考资料:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_row_p_w_picpath


相关内容

热门资讯

震撼全网的中国军人,究竟是哪个... 5月13日晚美国总统特朗普乘专机抵达北京轰鸣而过的“空军一号”与岿然不动的中国军人同框的视频在海外爆...
台湾旅游业者:上海有旅行团申请... 上海开放赴金门马祖旅游后,已有首批团客到金马踩线。对此,高雄市旅行商业同业公会理事长蔡宗佑15日受访...
厨房管道疏通的小妙招有哪些 1、绿色方法:向堵塞的下水道中倒入1杯洗衣粉,然后倒入3杯热水。如果这还不能疏通,再往里倒1杯醋。2...
厨房管道油垢堵塞疏通方法有哪些 1、苏打水疏通。先把半杯熟苏打粉倒入下水道,再倒半杯醋,苏打与醋中和发生反应后就能去除管道中黏附的油...
疏通洗碗池管道有哪些简单的方法 1.商店买上一根2米长的管道疏通器,在头部2公分处作一些弯曲,从进水口伸入疏通器,边摇动边往里伸,再...
燃气热水器的排烟管温度有多高 热水器的排烟管第1个弯头的温度是非常高的,一般来说是150度左右,这个温度足以烫伤人体皮肤,并且温度...
热水器的水有一股臭味 问题:热水器的水有一股臭味回答:1、如果出现一股臭味首先要排除是不是因为地漏或者是马桶导致的一些臭味...
12省区市将出现大到暴雨,广东... 中央气象台5月16日10时继续发布暴雨黄色预警:预计5月16日14时至17日14时,西藏东南部、河北...
曾火遍全网的“网红小胖”,如今... 说起“网红小胖”当年一张穿学生装的“王之蔑视”表情包照片相信大家都看过2003年,这张照片火爆网络掀...
男子疑伪装“爱狗家庭”,骗养2... 近日,多名犬主反映,广东东莞的罗某某伪装“爱狗家庭”,长期在网络骗养小狗,供他的烈性犬训练撕咬能力。...