binlog_row_image参数修改测试

binlog_row_image参数修改实践

题外话

今天开发同事在测试环境用canal抽取数据时,遇到问题,度娘发现大概率是参数binlog_row_image的设置导致,于是做了相应的检查测试。

一、binlog_row_image参数解释

前提
binlog格式必须为row格式或者mixed格式,不可以是statement格式。
名称解释:
before image:前镜像,即数据库表中修改前的内容。
after image:后镜像,即数据库表中修改后的内容。

参数设置
binlog_row_image参数可以设置三个合法值: FULL、MINIMAL、NOBLOB

FULL: Log all columns in both the before image and the after image.
binlog日志记录所有前镜像和后镜像。

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.
binlog日志的前镜像只记录唯一识别列(唯一索引列、主键列),后镜像只记录修改列。

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.
binlog记录所有的列,就像full格式一样。但对于BLOB或TEXT格式的列,如果他不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。

分析
从以上参数解释可以很简单的看出binlog_row_image参数设置不同值的区别

binlog_row_image=FULL,binlog记录所有数据的前后镜像,是最安全的设置,但性能也是最低的,如果数据出现误操作,可以能通过flashback或binlog2sql等快速闪回工具恢复数据,如果对短时间前后数据安全性要求比较高,推荐此设置。

binlog_row_image=MINIMAL,binlog日志的前镜像只记录唯一识别列(唯一索引列、主键列),后镜像只记录修改列,性能是最高的,占用的资源等也是最少的,如果数据出现误操作,不能通过flashback或binlog2sql等快速闪回工具恢复数据。

binlog_row_image=NOBLOB,binlog记录所有的列,就像full格式一样。但对于BLOB或TEXT格式的列,如果他不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。此设置可以简单理解为在没有text和blob等大字段时,效果同FULL一样;在有text和blob等大字段时,如果大字段不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。

二、场景测试

(1)binlog_row_image=MINIMAL

set global binlog_row_image=‘MINIMAL’;
update一条数据:
在这里插入图片描述
binlog记录:
在这里插入图片描述
(2)binlog_row_image=FULL

set global binlog_row_image=‘FULL’;
update一条数据:
在这里插入图片描述
binlog记录:
在这里插入图片描述
在这里插入图片描述
PS:另一个设置NOBLOB,这里忽略。

注意insert和delete有一点区别,因为insert没有前镜像,delete没有后镜像,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过以上测试可以明显的看到各优缺点,个人还是推荐binlog_row_image=FULL,此设置为官方的默认设置,也是最安全的设置。

哎哟,不错噢! - - - - - - 欢迎指出有误的地方以及补充更好的方法

猜你喜欢

转载自blog.csdn.net/Tah_001/article/details/107605614