解决MySQL不能编译存储过程的问题
解决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语句单独执行,又没有问题,耽误了很长时间。
特此记录!!!