今天本来有一个比较小的开发任务,在数据库某个表中增加一个字段,并在对应的调用接口中添加相应字段的返回值即可,但是却小小的踩了个坑,也学了一些关于mysql的知识。
首先开发过程本身没难度,但是我在往数据库表添加字段的时候遇到了一些问题,速度非常慢,alter语句一直卡着不动,到最后我的navicat都未响应了,起初我以为是我电脑死机了,也没多想就用任务管理器杀掉了进程打算重新跑,结果每次跑都要一直卡着,因为这是一张基础表,业务调用频繁,我本来以为是表过大导致添加列缓慢,但是开发环境的库里明明没有多少数据,这就有点不科学了,再然后我发现,表连正常的query都查不出来了,我立刻就感觉应该是死锁了,不过之前也没有什么解决死锁相关的问题,但是好在搜索引擎上相关的资料非常多,这里小小的总结一下。
1、查看是否有锁表
show OPEN TABLES where In_use > 0;
2、查看进程
show processlist;
执行语句后可以看到host,当然就是自己的ip和端口了,state列显示了waiting for table metadata lock,明显是说等待表的元数据锁,也就是说是由于我们的alter语句导致整表被锁。
3、杀进程
kill id
当然,我这个只是自己本地的一个简单需求导致的问题,在有100%情况下操作的,如果真的是复杂情况或者说是线上出现问题肯定不是这么草率的杀进程解决问题,各位要注意。