网易首页 > 网易号 > 正文 申请入驻

一次 SQL 引发的生产事故,同事直接被开除!!

0
分享至

前言

Insert into select请慎用。

这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网络I/O,决定采取别的方法进行实现。

通过在Baidu的海洋里遨游,他发现了可以使用 insert into select 实现,这样就可以避免使用网络I/O,直接使用SQL依靠数据库I/O完成,这样简直不要太棒了。

然后他就被开除了。

事故发生的经过。

由于数据数据库中 order_today 数据量过大,当时好像有700W了并且每天在以30W的速度增加。

所以上司命令xxx将 order_today 内的部分数据迁移到 order_record 中,并将 order_today 中的数据删除。

这样来降低 order_today 表中的数据量。

由于考虑到会占用数据库I/O,为了不影响业务,计划是9:00以后开始迁移,但是xxx在8:00的时候,尝试迁移了少部分数据(1000条),觉得没啥问题,就开始考虑大批量迁移。


在迁移的过程中,应急群是先反应有小部分用户出现支付失败,随后反应大批用户出现支付失败的情况,以及初始化订单失败的情况,同时腾讯也开始报警。

然后xxx就慌了,立即停止了迁移。

本以为停止迁移就就可以恢复了,但是并没有。后面发生的你们可以脑补一下。

事故还原

在本地建立一个精简版的数据库,并生成了100w的数据。模拟线上发生的情况。

建立表结构

订单表

CREATE TABLE `order_today` ( 
`id` varchar(32) NOT COMMENT '主键',
`merchant_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT COMMENT '商户编号',
`amount` decimal(15,2) NOT COMMENT '订单金额',
`pay_success_time` datetime NOT COMMENT '支付成功时间',
`order_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT COMMENT '支付状态 S:支付成功、F:订单支付失败',
`remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT COMMENT '备注',
`create_time` timestamp NOT DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间 -- 修改时自动更新',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_merchant_id` (`merchant_id`) USING BTREE COMMENT '商户编号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


订单记录表

CREATE TABLE order_record like order_today; 


今日订单表数据

模拟迁移

把8号之前的数据都迁移到 order_record 表中去。

INSERT INTO order_record SELECT 
*
FROM
order_today
WHERE
pay_success_time < '2020-03-08 00:00:00';

在navicat中运行迁移的sql,同时开另个一个窗口插入数据,模拟下单。

从上面可以发现一开始能正常插入,但是后面突然就卡住了,并且耗费了23s才成功,然后才能继续插入。这个时候已经迁移成功了,所以能正常插入了。

出现的原因

在默认的事务隔离级别下: insert into order_record select * from order_today 加锁规则是: order_record 表锁, order_today 逐步锁(扫描一个锁一个)。

分析执行过程。

通过观察 迁移sql 的执行情况你会发现 order_today 是全表扫描,也就意味着在执行 insert into select from 语句时,mysql会从上到下扫描 order_today 内的记录并且加锁,这样一来不就和直接锁表是一样了。

这也就可以解释,为什么一开始只有少量用户出现支付失败,后续大量用户出现支付失败,初始化订单失败等情况,因为一开始只锁定了少部分数据,没有被锁定的数据还是可以正常被修改为正常状态。

由于锁定的数据越来越多,就导致出现了大量支付失败。最后全部锁住,导致无法插入订单,而出现初始化订单失败。

解决方案

由于查询条件会导致 order_today 全表扫描,什么能避免全表扫描呢,很简单嘛,给 pay_success_time 字段添加一个 idx_pay_suc_time 索引 就可以了,由于走索引查询,就不会出现扫描全表的情况而锁表了,只会锁定符合条件的记录。

最终的sql

INSERT INTO order_record SELECT 
*
FROM
order_today FORCE INDEX (idx_pay_suc_time)
WHERE
pay_success_time <= '2020-03-08 00:00:00';

执行过程

总结

使用 insert into tablA select * from tableB 语句时,一定要确保 tableB 后面的 whereorder 或者其他条件,都需要有对应的 索引 ,来避免出现 tableB 全部记录被锁定的情况。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
同时有金矿、银矿、铜矿的中国企业,只有6家!到底有多厉害?

同时有金矿、银矿、铜矿的中国企业,只有6家!到底有多厉害?

花小猫的美食日常
2026-02-23 22:19:06
被判公开道歉并赔偿30万!自媒体“赛车星冰乐”因诋毁尊界S800败诉;此前其因集纳企业负面信息、煽动群体对立,被处置

被判公开道歉并赔偿30万!自媒体“赛车星冰乐”因诋毁尊界S800败诉;此前其因集纳企业负面信息、煽动群体对立,被处置

大象新闻
2026-02-24 17:44:06
见义勇为的平顶山抱孩子大姐找见了,平顶山的口碑,大姐一个人扛起

见义勇为的平顶山抱孩子大姐找见了,平顶山的口碑,大姐一个人扛起

观察鉴娱
2026-02-25 10:29:44
超223亿元,还在出价!马场地块总价冲上广州宅地历史第二

超223亿元,还在出价!马场地块总价冲上广州宅地历史第二

南方都市报
2026-02-25 16:56:06
为啥谷爱凌的神秘父亲总被传是谷歌5号员工,有人心思毒硬贴金

为啥谷爱凌的神秘父亲总被传是谷歌5号员工,有人心思毒硬贴金

安宁007
2026-02-25 13:36:55
普京对俄军下达最高指示,宣布解开最后的束缚,不用再看美国脸色

普京对俄军下达最高指示,宣布解开最后的束缚,不用再看美国脸色

霁寒飘雪
2026-02-25 17:38:04
“茶几”正在退出中国家庭,学广东人这样做,实用性让人大开眼界

“茶几”正在退出中国家庭,学广东人这样做,实用性让人大开眼界

室内设计师有料儿
2026-02-19 11:17:18
权志龙再三挑衅中国春节,女星邓家佳跟风,被网友骂后删博了事

权志龙再三挑衅中国春节,女星邓家佳跟风,被网友骂后删博了事

钱小刀娱乐
2026-02-22 21:54:09
奥运会为什么发避孕套?难道运动员都带伴侣吗?看完你就明白了!

奥运会为什么发避孕套?难道运动员都带伴侣吗?看完你就明白了!

南权先生
2026-02-13 15:17:51
补贴一减,电车在中端车市场归零,燃油车大获全胜!外资车赢麻了

补贴一减,电车在中端车市场归零,燃油车大获全胜!外资车赢麻了

柏铭锐谈
2026-02-24 08:42:53
全国统一执行!3月1日起,公职人员戴上紧箍咒,老百姓迎来大便利

全国统一执行!3月1日起,公职人员戴上紧箍咒,老百姓迎来大便利

青梅侃史啊
2026-02-25 17:10:06
有关薄一波的十个冷知识

有关薄一波的十个冷知识

深度报
2026-02-13 22:45:30
美日收到噩耗!中国发两条最新公告,条条暴击,日本右翼陷入癫狂

美日收到噩耗!中国发两条最新公告,条条暴击,日本右翼陷入癫狂

嫹笔牂牂
2026-02-25 16:56:25
Coco说她很怀念在香港的日子,很怀念和谢贤在一起的12年

Coco说她很怀念在香港的日子,很怀念和谢贤在一起的12年

西楼知趣杂谈
2026-02-19 21:09:49
“克肟”竟然不读kè kuī,正确读音是什么?你知道吗?

“克肟”竟然不读kè kuī,正确读音是什么?你知道吗?

AI读书
2026-02-25 14:37:45
老伴手术急需25万,老汉拿纪念钞去银行兑钱,银行的做法让老人愣住

老伴手术急需25万,老汉拿纪念钞去银行兑钱,银行的做法让老人愣住

悬案解密档案
2025-09-22 11:05:28
中国队夺冠奖金曝光,12人获重奖,李琰霸气表态带队必夺冠军

中国队夺冠奖金曝光,12人获重奖,李琰霸气表态带队必夺冠军

风月得自难寻
2026-02-24 17:06:14
大批F16出动,美重兵逼近黄海,不到1天,特朗普:中方实力太强大

大批F16出动,美重兵逼近黄海,不到1天,特朗普:中方实力太强大

通文知史
2026-02-22 22:57:13
虎妈谷燕有三个“狠”:向谷爱凌隐瞒奶奶去世消息,独自承受痛苦

虎妈谷燕有三个“狠”:向谷爱凌隐瞒奶奶去世消息,独自承受痛苦

安宁007
2026-02-25 15:47:07
“都怪你,男生没法学习了”,女生发型一周不重样,长相已经赢了

“都怪你,男生没法学习了”,女生发型一周不重样,长相已经赢了

泽泽先生
2026-02-10 21:35:49
2026-02-25 18:28:49
娱乐督察中
娱乐督察中
独乐乐不如众乐乐
284文章数 20734关注度
往期回顾 全部

科技要闻

“机器人只跳舞,没什么用”

头条要闻

女子被害留下3个女儿无人照顾 办案警察接力资助15年

头条要闻

女子被害留下3个女儿无人照顾 办案警察接力资助15年

体育要闻

曝雄鹿计划今夏追小卡 字母哥渴望与其并肩作战

娱乐要闻

撒贝宁到沈阳跑亲戚 老婆李白模特身材

财经要闻

GEO乱象:谁为AI营销的泡沫买单?

汽车要闻

750km超长续航 2026款小鹏X9纯电版将于3月2日上市

态度原创

游戏
房产
本地
艺术
公开课

《喵喵的结合》DLC正在路上?制作人庆贺百万销量

房产要闻

海南楼市春节热销地图曝光!三亚、陵水又杀疯了!

本地新闻

津南好·四时总相宜

艺术要闻

这位艺术家的马赛克画让人惊叹不已!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版