【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

1、背景:

在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下

FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18

 而数据库中原始数据如下,并没有到下午5点,这就导致了FlinkCDC读出来的时间和数据库中实际的时间不一致的情况,与数据库对比可以发现,这里的时间戳与数据库时间刚好相差了 8 个小时,在实际生产中这种情况是不行的

2、 产生这种情况的原因是什么呢?

FlinkCDC底层为Debezium,而Debezium默认将MySQL中datetime类型转成UTC的时间戳,底层的 Debezium 并没有实现 serverTimeZone 的配置,时区是写死的无法更改,导致数据库中设置的UTC+8到了FlinkCDC读取出来相差了8个小时

您可以使用 Flink CDC(Change Data Capture)来获取 MySQL 数据库的主键信息。Flink CDC 是一种用于将数据库中的变更数据流实时捕获并传输到其他系统的工具。它可以通过监视 MySQL 数据库的 binlog 来实现数据的实时捕获和同步。 要获取 MySQL 主键信息,您可以按照以下步骤操作: 1. 首先,确保您已经安装了 FlinkFlink CDC,并且已经正确配置了 MySQL 数据库的连接。 2. 创建一个 Flink CDC 的源表,用于从 MySQL 数据库中捕获变更数据。例如,您可以使用以下代码创建一个源表: ```java TableEnvironment tableEnv = ...; // 获取 TableEnvironment 实例 String sourceDDL = "CREATE TABLE mysql_source (\n" + " id INT,\n" + " name STRING,\n" + " PRIMARY KEY (id) NOT ENFORCED\n" + ") WITH (\n" + " 'connector' = 'mysql-cdc',\n" + " 'hostname' = 'localhost',\n" + " 'port' = '3306',\n" + " 'username' = 'root',\n" + " 'password' = 'password',\n" + " 'database-name' = 'your_database',\n" + " 'table-name' = 'your_table'\n" + ")"; tableEnv.executeSql(sourceDDL); ``` 请根据实际情况修改上述代码中的连接信息和表名。 3. 使用 Flink 的 Table API 或 SQL 查询来获取主键信息。例如,您可以使用以下代码查询主键信息: ```java Table resultTable = tableEnv.sqlQuery("SHOW KEYS FROM mysql_source WHERE Key_name = 'PRIMARY'"); // 将 Table 转换为 DataStream 或其他形式进行进一步处理 DataStream<Row> resultStream = tableEnv.toAppendStream(resultTable, Row.class); ``` 上述代码中的查询语句使用了 MySQL 的 `SHOW KEYS` 语句来获取主键信息,并通过 Flink 的 Table API 将结果转换为 DataStream 进行进一步处理。 这样,您就可以使用 Flink CDC 获取 MySQL 数据库的主键信息了。请注意,以上代码仅为示例,您需要根据实际情况进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯咖啡半杯糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值