mysql binlog记录insert update delete的记录方式与flink sql不一样

系列文章目录

实践数据湖iceberg 第一课 入门
实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式
实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg
实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到iceberg(升级版本到flink1.12.7)
实践数据湖iceberg 第五课 hive catalog特点
实践数据湖iceberg 第六课 从kafka写入到iceberg失败问题 解决
实践数据湖iceberg 第七课 实时写入到iceberg
实践数据湖iceberg 第八课 hive与iceberg集成
实践数据湖iceberg 第九课 合并小文件
实践数据湖iceberg 第十课 快照删除
实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
实践数据湖iceberg 第十二课 catalog是什么
实践数据湖iceberg 第十三课 metadata比数据文件大很多倍的问题
实践数据湖iceberg 第十四课 元数据合并(解决元数据随时间增加而元数据膨胀的问题)
实践数据湖iceberg 第十五课 spark安装与集成iceberg(jersey包冲突)
实践数据湖iceberg 第十六课 通过spark3打开iceberg的认知之门
实践数据湖iceberg 第十七课 hadoop2.7,spark3 on yarn运行iceberg配置
实践数据湖iceberg 第十八课 多种客户端与iceberg交互启动命令(常用命令)
实践数据湖iceberg 第十九课 flink count iceberg,无结果问题
实践数据湖iceberg 第二十课 flink + iceberg CDC场景(版本问题,测试失败)
实践数据湖iceberg 第二十一课 flink1.13.5 + iceberg0.131 CDC(测试成功INSERT,变更操作失败)
实践数据湖iceberg 第二十二课 flink1.13.5 + iceberg0.131 CDC(CRUD测试成功)
实践数据湖iceberg 第二十三课 flink-sql从checkpoint重启
实践数据湖iceberg 第二十四课 iceberg元数据详细解析
实践数据湖iceberg 第二十五课 后台运行flink sql 增删改的效果
实践数据湖iceberg 第二十六课 checkpoint设置方法
实践数据湖iceberg 第二十七课 flink cdc 测试程序故障重启:能从上次checkpoint点继续工作
实践数据湖iceberg 第二十八课 把公有仓库上不存在的包部署到本地仓库
实践数据湖iceberg 第二十九课 如何优雅高效获取flink的jobId
实践数据湖iceberg 第三十课 mysql binlog记录insert update delete的记录方式与flink sql不一样



前言

查看insert,update,delete在mysql binlog中是如何进行记录的
在flink sql中,update会转化为一条delete和一条insert, 故想看看在mysql binlog的记录方式


一、建表语句

构造insert, update,delete 场景进行测试

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test values(1,11,'星星之火');
update test set name='星星'  where id=1;
delete from test where id=1;

二、binlog信息

使用命令查binlog:

[root@hadoop103 mysql]# mysqlbinlog -v --base64-output=decode-rows mysql-bin.000002 
CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 8899204
#220420 15:47:25 server id 1  end_log_pos 8899269 CRC32 0x9eb77eea      Anonymous_GTID  last_committed=14326    sequence_number=14327   rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 8899269
#220420 15:47:25 server id 1  end_log_pos 8899347 CRC32 0x4668adc8      Query   thread_id=69258 exec_time=0     error_code=0
SET TIMESTAMP=1650440845/*!*/;
BEGIN
/*!*/;
# at 8899347
#220420 15:47:25 server id 1  end_log_pos 8899404 CRC32 0xa1553fa2      Table_map: `xxzh_stock`.`test` mapped to number 265
# at 8899404
#220420 15:47:25 server id 1  end_log_pos 8899466 CRC32 0xadefe641      Write_rows: table id 265 flags: STMT_END_F
### INSERT INTO `xxzh_stock`.`test`
### SET
###   @1=1
###   @2=11
###   @3='星星之火'
# at 8899466
#220420 15:47:25 server id 1  end_log_pos 8899497 CRC32 0xef6b3913      Xid = 13347790
COMMIT/*!*/;
# at 8899497
#220420 15:47:25 server id 1  end_log_pos 8899562 CRC32 0xdd949283      Anonymous_GTID  last_committed=14327    sequence_number=14328   rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 8899562
#220420 15:47:25 server id 1  end_log_pos 8899640 CRC32 0x384e2f34      Query   thread_id=69258 exec_time=0     error_code=0
SET TIMESTAMP=1650440845/*!*/;
BEGIN
/*!*/;
# at 8899640
#220420 15:47:25 server id 1  end_log_pos 8899697 CRC32 0x50755998      Table_map: `xxzh_stock`.`test` mapped to number 265
# at 8899697
#220420 15:47:25 server id 1  end_log_pos 8899781 CRC32 0x65d5e7ac      Update_rows: table id 265 flags: STMT_END_F
### UPDATE `xxzh_stock`.`test`
### WHERE
###   @1=1
###   @2=11
###   @3='星星之火'
### SET
###   @1=1
###   @2=11
###   @3='星星'
# at 8899781
#220420 15:47:25 server id 1  end_log_pos 8899812 CRC32 0xa8f1b87f      Xid = 13347791
COMMIT/*!*/;
# at 8899812
#220420 15:47:25 server id 1  end_log_pos 8899877 CRC32 0x00de2b56      Anonymous_GTID  last_committed=14328    sequence_number=14329   rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 8899877
#220420 15:47:25 server id 1  end_log_pos 8899955 CRC32 0x85923293      Query   thread_id=69258 exec_time=0     error_code=0
SET TIMESTAMP=1650440845/*!*/;
BEGIN
/*!*/;
# at 8899955
#220420 15:47:25 server id 1  end_log_pos 8900012 CRC32 0x402f0426      Table_map: `xxzh_stock`.`test` mapped to number 265
# at 8900012
#220420 15:47:25 server id 1  end_log_pos 8900068 CRC32 0xd81ab133      Delete_rows: table id 265 flags: STMT_END_F
### DELETE FROM `xxzh_stock`.`test`
### WHERE
###   @1=1
###   @2=11
###   @3='星星'
# at 8900068
#220420 15:47:25 server id 1  end_log_pos 8900099 CRC32 0x0755e4b8      Xid = 13347792
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*/;

insert 语句:

### INSERT INTO `xxzh_stock`.`test`
### SET
###   @1=1
###   @2=11
###   @3='星星之火'

update语句:


### UPDATE `xxzh_stock`.`test`
### WHERE
###   @1=1
###   @2=11
###   @3='星星之火'
### SET
###   @1=1
###   @2=11
###   @3='星星'

delete语句:

### DELETE FROM `xxzh_stock`.`test`
### WHERE
###   @1=1
###   @2=11
###   @3='星星'

总结

mysql binglog中 insert ,update,delete 都是直接用sql语义进行记录。 和flink-sql的方式不一样。

<think>嗯,用户问的是Flink SQL如何实现Flink CDC实时同步MySQL整库。我需要先回忆一下Flink CDC的基本概念和整库同步的方法。首先,Flink CDC应该是指使用Flink的Change Data Capture功能,来捕获MySQLbinlog变化,然后实时同步到其他存储系统。 用户提到用Flink SQL来实现,所以应该避免编写Java或Scala代码,直接通过SQL方式完成。记得Flink SQL支持连接MySQL CDC源表,可能需要先创建CDC源表的定义。然后整库同步的话,可能需要为每个表创建一个源表,或者有没有更简便的方式,比如动态表发现之类的功能? 对了,Flink CDC 2.0以后支持了整库同步的功能,可以通过一个作业同步整个数据库或者多个表,而需要为每个表单独写DDL。可能需要用到MySQL CDC连接器,并且配置相应的参数,比如database-name、table-name等,或者使用正则表达式匹配多个表。 另外,同步整库的时候,可能需要处理schema的变化,比如表结构变更。Flink CDC是否支持自动处理DDL变更?我记得在整库同步的场景下,通常需要将CDC数据同步到下游如Kafka或Hudi,这时候可能需要使用正则表达式匹配所有表,或者使用database-name指定整个库,table-name用通配符。 然后,目标端通常是消息队列或者数据湖存储,比如Kafka,每个表的数据写入同的topic,或者Hudi的同表中。用户可能需要配置sink的各个参数,比如连接信息、序列化方式等。 步骤的话,大概分为:1. 配置MySQL CDC源;2. 定义源表的DDL,可能使用正则匹配所有表;3. 配置sink,比如Kafka,并设置动态路由;4. 编写Flink SQL作业,将源表数据插入到sink表。还需要考虑并行度、checkpoint等调优参数。 需要注意的点包括:MySQL需要开启binlog,并且ROW格式;Flink CDC连接器的版本是否兼容;主键是否必须;如何处理DDL变更;以及下游sink是否支持动态表结构。 可能用户的实际需求是同步多个表到实时数仓,比如Hudi或Kafka,所以需要给出具体的DDL示例和步骤。另外,Flink SQL的整库同步可能需要用到CTAS(CREATE TABLE AS SELECT)语法吗?或者直接使用INSERT INTO。过每个表可能需要单独处理,或者使用正则表达式来捕获所有表,并动态写入对应的目标位置。 还有可能,用户需要了解如何自动创建下游的表结构,比如在Kafka中自动创建对应的topic,或者在Hudi中自动建表。这时候可能需要sink连接器支持自动建表的功能。 总结下来,回答的结构应该是:先介绍Flink CDC的基本原理,然后分步骤讲解如何配置MySQL CDC源,如何定义整库同步的DDL,如何配置sink,并给出示例代码,最后提到注意事项和常见问题。</think>Flink SQL 实现 Flink CDC 实时同步 MySQL 整库的核心步骤如下: --- ### **一、技术原理** 1. **Flink CDC**:基于 Debezium 捕获 MySQLbinlog 日志,将 INSERT/UPDATE/DELETE 事件转化为流数据。 2. **整库同步**:通过正则匹配或配置动态表名,将多个表的数据实时同步到目标存储(如 Kafka、Hudi 等)。 --- ### **二、实现步骤** #### **1. 环境准备** - **MySQL 配置**: - 开启 binlog(设置 `log_bin=ON`, `binlog_format=ROW`) - 创建具有 `REPLICATION SLAVE` 权限的用户 - **Flink 环境**: - 安装 Flink 1.13+ 和 Flink CDC 连接器(如 `flink-sql-connector-mysql-cdc-2.4.x.jar`) --- #### **2. 定义 MySQL CDC 源表** ```sql CREATE TABLE mysql_source ( `database_name` STRING METADATA FROM 'database_name' VIRTUAL, `table_name` STRING METADATA FROM 'table_name' VIRTUAL, `op_ts` TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL, -- 动态映射所有字段(自动适配表结构) `body` ROW<...> -- 使用正则匹配所有表 ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'user', 'password' = 'pass', 'database-name' = 'your_database', 'table-name' = '.*' -- 正则匹配所有表 ); ``` --- #### **3. 定义目标表(以 Kafka 为例)** ```sql CREATE TABLE kafka_sink ( `database_name` STRING, `table_name` STRING, `op_ts` TIMESTAMP_LTZ(3), `data` STRING -- 将整行数据序列化为 JSON ) WITH ( 'connector' = 'kafka', 'topic' = 'db_sync_{table_name}', -- 动态 topic(按表名区分) 'properties.bootstrap.servers' = 'kafka:9092', 'format' = 'json' ); ``` --- #### **4. 编写同步逻辑** ```sql INSERT INTO kafka_sink SELECT database_name, table_name, op_ts, CAST(body AS STRING) AS data -- 将动态字段转为 JSON FROM mysql_source; ``` --- #### **5. 启动任务** ```bash # 通过 Flink SQL Client 提交作业 bin/sql-client.sh -i sync_job.sql ``` --- ### **三、高级配置** 1. **动态 Schema 处理**: - 使用 `ROW<...>` 动态映射 MySQL 表字段 - 下游存储需支持 Schema 演化(如 Hudi) 2. **分库分表同步**: - 修改 `table-name` 正则(如 `'order_\\d+'` 匹配分表) 3. **Exactly-Once 语义**: - 开启 Flink Checkpoint(设置 `execution.checkpointing.interval`) --- ### **四、注意事项** 1. **MySQL 权限**:需 `SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT` 2. **性能调优**: - 增大 `parallelism` 并行度 - 调整 `server-id` 避免冲突 3. **数据一致性**: - 使用 `scan.startup.mode=initial` 先全量后增量 - 下游存储需支持幂等写入 --- ### **五、扩展场景** - **同步到 Hudi 数据湖**: ```sql CREATE TABLE hudi_sink ( ... ) WITH ( 'connector' = 'hudi', 'path' = 'hdfs:///path/to/hudi/{table_name}', 'write.tasks' = '4' ); ``` - **关联维度表**:通过 `JOIN` 实时扩展数据 --- 通过以上步骤,可实现 MySQL 整库数据实时入湖入仓,支撑实时数仓和数据分析场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值