Query Results无法写入已有数据表:任务完成却无数据写入的问题排查
这种情况我在日常运维和开发中碰到过好多次,给你列几个最常见的排查点,按顺序查大概率能定位问题:
查询结果本身为空:先单独跑一遍你用来写入的查询语句,看看返回的结果集是不是本来就没有数据。很多时候任务标记“完成”只是说明写入动作执行完毕,但如果源查询没返回任何数据,自然不会有内容写入目标表。直接在数据库客户端执行
SELECT ...(就是你写入用的那个查询),确认返回行数就行。写入权限不足:虽然任务状态显示“完成”,但可能执行任务的账号对目标表只有
SELECT权限,没有INSERT/UPDATE权限?有些任务调度系统只会判断语句是否执行结束,不会校验实际写入是否成功。可以换个有明确写入权限的账号测试,或者直接在数据库里查账号权限配置。数据类型不匹配导致静默丢弃:目标表的字段类型和查询结果的字段类型不兼容,比如目标表是
INT类型,但查询结果是无法转换的字符串,部分数据库(比如MySQL在特定sql_mode下)会静默丢弃这些行,甚至整个写入失败但任务状态没报错。对比两边的字段类型,或者查看数据库的错误日志,有没有字段转换失败的记录。更新操作的WHERE条件太严格:如果是用
UPDATE语句写入而不是INSERT INTO ... SELECT ...,那可能你的WHERE条件没有匹配到任何行,导致看起来没数据变化。比如UPDATE target_table SET col = (SELECT col FROM source) WHERE id = 999,但目标表根本没有id=999的行,自然不会有更新。事务未提交:如果写入操作是在事务里执行的,可能任务执行后没有提交事务,数据还在临时事务中,你查询的时候看不到。检查任务的执行脚本,有没有加
COMMIT语句,或者数据库是否开启了自动提交模式。写入到了错误的表/库:别笑,真的有这种粗心情况!可能你写的目标表名和实际要写入的表不是同一个(比如大小写问题,或者库名写错了,比如把
prod.target_table写成了test.target_table)。确认一下任务里的目标表全称是不是完全正确。触发器拦截了写入:目标表可能配置了
BEFORE INSERT/BEFORE UPDATE触发器,触发器里的逻辑导致数据被丢弃或者修改成了你没注意到的状态。可以暂时禁用触发器测试,或者查看触发器的具体代码逻辑。
内容的提问来源于stack exchange,提问作者Karly Stack

