binlog_row_image参数是5.6版本后新增的参数,5.7默认为full
该参数的格式有三种,分别是FULL、MINIMAL、NOBLOB。
STATEMENT | binlog日志记录所有前镜像和后镜像。(安全性高,节省空间弱) |
---|---|
MINIMAL | binlog日志的前镜像只记录唯一识别列(唯一索引列、主键列),后镜像只记录修改列。(安全性弱,节省空间强) |
noblob | binlog记录所有的列,就像full格式一样。但对于BLOB或TEXT格式的列,如果他不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。(安全性一般,节省空间一般) |
noblob | binlog记录所有的列,就像full格式一样。但对于BLOB或TEXT格式的列,如果他不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。(安全性一般,节省空间一般) |
该参数涉及到了以下两个知识点:
before image:前镜像,即数据库表中修改前的内容。
after image:后镜像,即数据库表中修改后的内容。
测试情况如下:
一、测试FULL格式
1、创建表、插入数据、变更数据
mysql> create table test_row_image(
-> id int not null,
-> name varchar(16) default null,
-> key(id)
-> );
mysql> create table test_row_image( id int not null, name varchar(16) default null, key(id) );
Query OK, 0 rows affected (0.03 sec)
mysql> insert test_row_image values
-> (1,'aa'),
-> (2,'bb');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> update test_row_image set name='salary';
Query OK, 5 rows affected (0.03 sec)
Rows matched: 5 Changed: 5 Warnings: 0
2、查看binlog日志
[root@VM-0-4-centos ~]# /www/server/mysql/bin/mysqlbinlog --base64-output=decode-rows -v --start-datetime="2020-12-02 02:00:00" --stop-datetime="2020-12-02 02:50:00" mysqlbinlog/*!50530 SET #201202 2:40:29 server id 231395 end_log_pos 177296008 CRC32 0x5fb4928f Update_rows: table id 31955 flags: STMT_END_F
### UPDATE `test`.`test_row_image`
### WHERE
### @1=1
### @2='aa'
### SET
### @1=1
### @2='salary'
### UPDATE `test`.`test_row_image`
### WHERE
### @1=2
### @2='bb'
### SET
### @1=2
### @2='salary'
从日志中可以看到binlog记录修改前的id、name以及修改后的id、salary ,说明是全纪录,即全镜像。
总结:FULL格式,全记录,记录修改前和修改后的所有列。
二、测试MINIMAL格式
1.测试没有主键和唯一索引的情况
a.创建表,插入数据,变更数据
mysql> create table city(
-> id int not null,
-> name varchar(16) default null.
-> key (id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert city values
-> (1,'aa'),
-> (2,'bb');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> update city set name='xxx';
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0
b.查看binlog日志
### UPDATE `test`.`city`
### WHERE
### @1=1
### @2='aa'
### SET
### @2='xxx'
### UPDATE `test`.`city`
### WHERE
### @1=2
### @2='bb'
### SET
### @2='xxx'
总结:没有主键和唯一索引,binlog修改前的列全记录,修改后只记录修改后的列。
mysql> create table cap(
-> id int not null,
-> name varchar(16) default null.
-> primary key(id)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> insert cap values(1,'aa'),(2,'bb');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> update cap set name='***';
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0
b.查看binlog日志
### UPDATE `test`.`cap`
### WHERE
### @1=1
### SET
### @2='xxx'
### UPDATE `test`.`cap`
### WHERE
### @1=2
### SET
### @2='xxx'
总结:有主键的情况下,binlog只记录修改前的主键列和修改后的修改列。
腾讯云数据库暂只支持FULL和MINIMAL,noblob暂不支持。