Stitch同步MySQL时触发DAY_OF_MONTH致命错误求助
问题描述
我配置了基于MySQL的Stitch复制任务,以timestamp类型列作为增量键,正常运行数月后突然报出致命错误,错误日志如下:
2023-02-02 10:32:32,987Z tap - FATAL [main] tap-hp-mysql.main - Fatal Error Occurred - DAY_OF_MONTH 2023-02-02 10:32:32,990Z tap - ERROR [main] #error { 2023-02-02 10:32:32,990Z tap - :cause DAY_OF_MONTH 2023-02-02 10:32:32,990Z tap - :via 2023-02-02 10:32:32,990Z tap - [{:type java.sql.SQLException 2023-02-02 10:32:32,990Z tap - :message DAY_OF_MONTH 2023-02-02 10:32:32,990Z tap - :at [com.mysql.cj.jdbc.exceptions.SQLError createSQLException SQLError.java 129]} 2023-02-02 10:32:32,990Z tap - {:type com.mysql.cj.exceptions.WrongArgumentException 2023-02-02 10:32:32,990Z tap - :message DAY_OF_MONTH 2023-02-02 10:32:32,990Z tap - :at [jdk.internal.reflect.NativeConstructorAccessorImpl newInstance0 NativeConstructorAccessorImpl.java -2]} 2023-02-02 10:32:32,990Z tap - {:type java.lang.IllegalArgumentException 2023-02-02 10:32:32,990Z tap - :message DAY_OF_MONTH 2023-02-02 10:32:32,991Z tap - :at [java.util.GregorianCalendar computeTime GregorianCalendar.java 2645]}] 2023-02-02 10:32:32,991Z tap - :trace
错误分析与解决方法
错误原因
这个DAY_OF_MONTH错误是Java的GregorianCalendar类解析日期时抛出的非法参数异常,核心原因是MySQL目标表中存在无效的timestamp值,导致Stitch的tap-mysql组件无法正常解析这些日期。
常见无效timestamp场景:
- 存储了
'0000-00-00 00:00:00'这类零值日期(MySQL允许存储,但Java日期解析器不支持) - 存在不存在的日期(如
'2023-02-30') - timestamp列值格式不符合标准,或存在截断、乱码
- 超出MySQL timestamp默认合法范围(1970-01-01 00:00:01 至 2038-01-19 03:14:07)的日期
解决步骤
- 定位问题数据
针对复制任务对应的表,执行以下SQL查询找出无效数据:
-- 查询零值日期 SELECT * FROM 你的表名 WHERE 增量键列 = '0000-00-00 00:00:00'; -- 查询超出timestamp合法范围的日期 SELECT * FROM 你的表名 WHERE 增量键列 < '1970-01-01 00:00:01' OR 增量键列 > '2038-01-19 03:14:07'; -- 查询格式不符合标准的日期 SELECT * FROM 你的表名 WHERE 增量键列 REGEXP '^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$' = 0;
- 修复无效数据
- 零值日期:更新为合法初始日期(如
'1970-01-01 00:00:01'),或根据业务逻辑删除/标记这类数据 - 非法日期:修正为实际存在的有效日期,或直接删除错误数据
- 格式异常数据:重新整理为标准timestamp格式
调整配置(可选,优先修复数据)
如果无法修改数据,可尝试在MySQL连接参数中添加sql_mode=ALLOW_INVALID_DATES,让MySQL允许存储无效日期,但这只是临时规避,仍可能引发其他问题,建议优先修复数据。重启任务
修复数据或调整配置后,重启Stitch复制任务,观察是否仍出现错误。
内容的提问来源于stack exchange,提问作者obautista
相关产品推荐
相关产品推荐

