Mysql的binlog_row_image参数

binlog_row_image参数是5.6版本后新增的参数,5.7默认为full

该参数的格式有三种,分别是FULL、MINIMAL、NOBLOB。

STATEMENTbinlog日志记录所有前镜像和后镜像。(安全性高,节省空间弱)
MINIMALbinlog日志的前镜像只记录唯一识别列(唯一索引列、主键列),后镜像只记录修改列。(安全性弱,节省空间强)
noblobbinlog记录所有的列,就像full格式一样。但对于BLOB或TEXT格式的列,如果他不是唯一识别列(唯一索引列、主键列),或者没有修改,那就不记录。(安全性一般,节省空间一般)
noblobbinlog记录所有的列,就像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暂不支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您的问题是关于Flink如何使用MySQLBinlog功能吗? 如果是的话,您可以按照以下步骤: 1. 在Flink中添加MySQL的依赖项,例如: ``` <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-jdbc_2.11</artifactId> <version>${flink.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> ``` 2. 创建一个Flink的MySQL Source,例如: ``` JdbcSource<Row> mysqlSource = JdbcSource.<Row>builder() .setDrivername("com.mysql.jdbc.Driver") .setDBUrl("jdbc:mysql://localhost:3306/test") .setUsername("root") .setPassword("root") .setQuery("SELECT * FROM user") .setRowTypeInfo(new RowTypeInfo(Types.STRING, Types.INT)) .build(); ``` 3. 使用Flink的DataStream API,例如: ``` StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.addSource(mysqlSource).print(); env.execute(); ``` 4. 启用MySQLBinlog功能,例如: ``` SET binlog_format = 'ROW'; SET binlog_row_image = 'FULL'; SET @@global.binlog_expire_logs_seconds = 604800; SET @@global.max_binlog_size = 1073741824; ``` 5. 在Flink中使用MySQLBinlog Source,例如: ``` BinlogSource<Row> binlogSource = MySQLSource.<Row>builder() .hostname("localhost") .port(3306) .databaseList("test") .tableList("user") .username("root") .password("root") .serverId(1001L) .binlogFilename("mysql-bin.000001") .binlogPosition(4L) .build(); DataStreamSource<Row> streamSource = env.addSource(binlogSource); streamSource.print(); env.execute(); ``` 以上是Flink如何使用MySQLBinlog功能的简单介绍,希望能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值