更新到mysql 5.7后解决0000-00-00日期问题

本文详细介绍了MySQL 5.7默认开启的SQL Mode特性,特别是NO_ZERO_IN_DATE和NO_ZERO_DATE选项如何禁止使用0000这样的日期格式。并提供了具体的配置方法来调整这些选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 5.7 默认开始用以下sql mode :

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION 

其中NO_ZERO_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间。因此在mysql的配置文件中,重新设置sql-mode,去掉这两项就可以了。如:

sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 

转载于:https://my.oschina.net/komodo/blog/919193

### Flink CDC 将 MySQL 5.5 表数据实时同步到 MySQL 5.7解决方案 #### 一、背景介绍 Flink CDC 是一种基于 Apache Flink 构建的数据集成工具,能够实现数据库之间的增量和全量数据同步。它通过捕获源数据库中的变更日志(如 Binlog),并将其应用到目标数据库中来实现实时同步的功能。 对于从 MySQL 5.5MySQL 5.7 的表数据实时同步场景,需要注意以下几个方面: 1. **MySQL 版本差异**:MySQL 5.55.7 存在一定的兼容性和功能差异[^3]。 2. **Binlog 格式支持**:MySQL 5.5 默认使用的 `ROW` 格式的 Binlog 能够被 Flink CDC 正确解析,但如果使用其他格式可能需要调整配置[^4]。 3. **时间戳字段处理**:由于 MySQL 5.7日期时间类型的严格模式增强,可能导致某些非法值(如 `'0000-00-00'`)无法写入目标库[^5]。 --- #### 二、技术方案详解 ##### 1. 环境准备 确保以下条件满足: - 源端 MySQL 5.5 启用了 Binlog 功能,并设置为 `ROW` 格式。 - 目标端 MySQL 5.7 数据库已创建好对应的 Schema 和 Table 结构。 - 安装并配置好 Flink 环境及其依赖项。 以下是关键的 MySQL 配置参数: ```sql -- 修改 MySQL 5.5 配置文件 my.cnf 或 my.ini [mysqld] server-id=1 binlog-format=ROW log-bin=mysql-bin ``` 重启 MySQL 服务使更改生效。 --- ##### 2. 创建 Flink Job 编写一个简单的 Flink CDC 作业脚本来完成数据同步任务: ###### (1) 添加 Maven 依赖 在项目的 `pom.xml` 文件中引入必要的依赖项: ```xml <dependencies> <!-- Flink Core --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-stream-java_2.12</artifactId> <version>1.15.0</version> </dependency> <!-- Flink CDC Connector --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-cdc-connectors</artifactId> <version>2.3.0</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> </dependencies> ``` ###### (2) 编写 Java/Flink Code 下面是一个完整的代码示例用于实现 MySQL 5.5MySQL 5.7 的数据同步: ```java import com.alibaba.ververica.cdc.connectors.mysql.MySqlSource; import com.alibaba.ververica.cdc.debezium.DebeziumSourceFunction; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class MysqlCdcSync { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DebeziumSourceFunction<String> sourceFunction = MySqlSource.<String>builder() .hostname("source-mysql-host") // 替换为实际的 MySQL 5.5 主机地址 .port(3306) // 替换为实际的 MySQL 5.5 端口 .username("root") // 替换为实际的用户名 .password("password") // 替换为实际的密码 .databaseList("db_name") // 替换为目标数据库名称 .tableList("db_name.table_name") // 替换为具体的表名列表 .deserializer(new JsonDebeziumDeserializationSchema()) // 使用 JSON 序列化器 .build(); env.addSource(sourceFunction).print(); // 打印输出可以替换成 Sink 到 MySQL 5.7 env.execute("Flink CDC Sync from MySQL 5.5 to MySQL 5.7"); } } ``` --- ##### 3. 处理常见问题 针对可能出现的问题提供解决办法: ###### (1) 时间戳字段错误 当遇到类似 `ERROR 1292 (22007)` 错误时,可以通过修改 MySQL 5.7 的 SQL 模式禁用严格校验: ```sql SET GLOBAL sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; ``` 这会允许 MySQL 接受零日期值或其他不符合标准的时间戳。 ###### (2) 权限不足 确保 MySQL 用户具有足够的权限访问 Binlog 日志: ```sql GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` ###### (3) 性能优化 为了提高性能,可以在 Flink 中启用 Checkpointing 并合理设置缓冲区大小: ```java env.enableCheckpointing(5000); // 每隔 5 秒触发一次 Checkpoint ``` --- #### 三、总结 以上介绍了如何利用 Flink CDC 实现从 MySQL 5.5MySQL 5.7 的表数据实时同步过程。重点在于正确配置源端和目标端的 MySQL 参数,同时注意版本间的兼容性问题以及潜在的异常情况处理---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值