解决MySQL不能编译存储过程的问题

发布于:2025-08-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

解决MySQL不能编译存储过程的问题

1.问题描述

MySQL版本 8
用workbench 编辑存储过程,执行编译的时候,没有反应,无法执行编译。
在命令行的方式,也无法编译,没有反馈结果,只能ctrl+C ,中断执行。

2. 问题排查

(1)在 information_schema.ROUTINES 中查询没有 同名的存储过程存在。
(2)检查 存储过程中使用的表,没有表是被锁的。
(3)存储过程中的SQL单独执行也没有问题。
(4)发现在workbench 编译存储过程中,show logs
按钮显示,编译过程,首先是执行:

DROP procedure IF EXISTS `proc_create_vw_abcde`;

单独执行 判断删除存储过程语句,果然不能执行,进入了等待。
终于复现了,定位问题了,不是代码问题。

3.解决

查询是否有查询记录:

-- 查看是否有相关连接正在执行该过程
select * from performance_schema.events_statements_current 
	where sql_text like '%proc_create_vw_abcde%';

发现有代码调用。
原来是删除存储过程后,还有应用调用这个存储过程,重新创建存储过程结果造成冲突,在重新创建编译存储过程的时候,没有反应,无法执行成功。
应用程序对存储过程的调用失败,但是一直没有释放。

查询 线程ID号


SELECT THREAD_ID, EVENT_ID, SQL_TEXT 
FROM performance_schema.events_statements_current 
WHERE SQL_TEXT LIKE '%proc_create_vw_abcde%';

线程ID号是 105
通过 threads 表查找对应的 PROCESSLIST_ID

select 
    thread_id,
    processlist_id,
    processlist_user,
    processlist_host,
    processlist_db,
    processlist_command,
    processlist_time,
    processlist_state
from performance_schema.threads 
where thread_id = 105;    

对应的processlist_id 是 12345 ,kill !

KILL 12345;

重新编译存储过程成功。

开始一直怀疑是存储过程使用的表有问题,锁表了,所以不能编译成功,但是把SQL语句单独执行,又没有问题,耽误了很长时间。

特此记录!!!