MySQL操作表、数据库一直未响应

 

问题描述

大家都知道,在开发时最初进行数据库表的设计时,是很难考虑全面的,这几乎是不可能的,任何系统都是逐渐迭更新逐步完善的,但是后期就需要对数据库表字段、约束条件等进行修改和完善。是这样的,有个需求就是,要在之前的数据表新增一个字段’like‘点赞数量,并且把之前的记录默认全部置为0。在今天使用Navicat Premium 15直接进行可视化界面操作时,不知什么原因,导致了一直未响应,其实在之前我也遇到过这个情况,但是记得当时是直接删除表了还是直接删库重建了,,,但是这次直接删除表无效,同样未响应。其实原因就是有些操作语句可能有误或者有些事务还没有提交,导致进程状态为Waiting,如下图所示:

其实解决办法就是直接kill进程!

问题解决

第一种情况

某些语句执行卡住导致无法删除

首先查询进程
show full processlist;

然后查看waiting的进程 这种的表示卡住的进程 我们要结束这些进程

kill process_id; //列入 要结束的进程id 为1120 那么就是 kill 1120; 来结束这个卡住的进程

第二种情况:

某些事物没有提交
执行select * from information_schema.INNODB_TRX;语句查询未提交的事物

如果存在 找到trx_mysql_thread_id(事物线程id) 使用kill 命令来结束线程

第三中情况:

也有可能是失败的语句
select * from performance_schema.events_statements_current查询失败的语句
然后使用kill 命令 结束失败的进程

这样再删除数据库就可以了

-- 删除数据库表的命令:
DROP TABLE 表名;
-- 删除数据库的命令:
drop database 数据库名;

MySQL出现Waiting for table metadata lock的原因以及解决方法

 

总之,alter table的语句是很危险的(其实他的危险其实是未提交事物或者长事务导致的),在操作之前最好确认对要操作的表没有任何进行中的操作、没有未提交事务、也没有显式事务中的报错语句。如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。

微信关注

WeChat

阅读剩余
THE END