提桶之路1-Mysql-update深坑

74 阅读1分钟

Mysql问题sql自动优化导致全表更新已提桶跑路

昨日为修复线上数据, 提交运维执行脚本, 因当时过于匆忙导致sql复制出错, 后面差点删除跑路!!

我提交的SQL:

update aaa_aaa.aaa t set t.t = 11 and t.t1 in (1,2,3) and t.status = 2;

我期望的SQL:

update aaa_aaa.aaa t set t.t = 11 where t.t1 in (1,2,3) and t.status = 2;

MYSQL自动解析后的SQL:

update aaa_aaa.aaa t set t.t = 11 (and t.t1 in (1,2,3) and t.status = 2);

事情经过就是, 当时我想要一个sql来修复生产数据, 但由于情况比较急, 导致复制sql出错, 编写的sql 语句缺少where语句, 被mysql自动解析导致对数据库表做了全量更新. 后续我找运维拉下来了生产库的binlog日志, 提取对应字段并组装sql对数据做了紧急修复.

建议各位老铁能不用sql修复线上数据就别用, 就算用也一定要开启事务提交, 而且最好给mysql加上语法强 校验限制update必须有where!

微信图片_20230228104519.png