MySQL调用批量插入存储过程后关终端仍运行且进程列表无对应项,如何终止?
存储过程异常后台运行无法终止问题
前期测试操作
本次测试目标是验证批量造数逻辑,编写了用于向free_codes表快速填充0至n区间数值的存储过程,代码实现如下:
DELIMITER $$ CREATE PROCEDURE `insert_range`(a INT) BEGIN set @x = 1; REPEAT INSERT INTO free_codes VALUES (@x); SET @x = @x + 1; UNTIL @x = a END REPEAT; END $$ DELIMITER ;
调用该存储过程尝试一次性插入1000万条测试数据:
CALL insert_range(10000000)
异常触发过程
- 首次中断尝试:执行过程中因耗时远超预期,按下
Ctrl+C尝试中断当前会话,操作未产生效果 - 第二次中断尝试:直接关闭本地shell窗口、重新连接数据库,原本预期会话断开后对应的存储过程会自动终止
- 异常验证:重新连接后执行表最大值查询,确认存储过程并未随连接断开停止:
对应查询语句:select * from free_codes order by code DESC limit 1;- 第一次查询返回的最大code值为1291101
- 间隔一段时间后再次执行相同查询,最大code值升高至1302581,说明两次查询间隔内存储过程仍在持续执行插入操作
- 原本毫秒级返回的简单查询现在需要1秒才能返回结果,表的整体查询性能已被后台写入操作明显拖慢
常规排查手段失效
常规操作逻辑参考:通过
SHOW PROCESSLIST查看运行进程后,用KILL 进程ID方式终止进程
按照上述方法排查时遇到了预期与现实完全不符的情况:
- 执行
SHOW PROCESSLIST查询进程列表时,完全找不到存储过程对应的运行进程条目,列表内仅能看到event_scheduler守护进程和当前正在执行查询的用户连接,原本预期会出现的存储过程进程条目完全不存在 - 当前进程列表的实际输出如下:
+----+-----------------+-----------------+---------+----------+--------+------------------------+--------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+---------+----------+--------+------------------------+--------------------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 161795 | Waiting on empty queue | NULL | | 15 | myusername | 127.0.0.1:36790 | monster | Query | 0 | init | PLUGIN: show processlist | +----+-----------------+-----------------+---------+----------+--------+------------------------+--------------------------+
目前所有能想到的终止手段都已尝试,仍无法停止这个后台运行的存储过程,持续的写入操作已经拖慢了所有针对free_codes表的查询,急需可行的终止方案。
内容的提问来源于stack exchange,提问作者SenorCardgage
相关产品推荐
相关产品推荐

