当前位置: 首页 > article >正文

MySQL锁表快速解决办法

  • 参考 https://www.cnblogs.com/geek233/p/17944562

MySQL锁表快速解决办法

依次执行1-6步,运行第6步生成的语句即可。

如果特别着急,运行 1 2 6 步 以及第6步生成的kill语句 即可。

第1步 查看表是否在使用。

show open tables where in_use > 0 ;
如果查询结果为空。则证明表没有在使用。结束。

mysql>  show open tables where in_use > 0 ;
Empty set (0.00 sec)

如果查询结果不为空,继续后续的步骤。

mysql>  show open tables where in_use > 0 ;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | t     |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

第2步 查看数据库当前的进程,看一下有无正在执行的慢SQL记录线程。

show processlist;
注意:show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。
SHOW PROCESSLIST shows which threads are running. If you have the PROCESS privilege, you can see all threads. Otherwise, you can see only your own threads (that is, threads associated with the MySQL account that you are using). If you do not use the FULL keyword, only the first 100 characters of each statement are shown in the Info field.

第3步 查看当前运行的所有事务

SELECT * FROM information_schema.INNODB_TRX;

第4步 查看当前出现的锁

SELECT * FROM information_schema.INNODB_LOCKs;

第5步 查看锁等待的对应关系

 `SELECT * FROM information_schema.INNODB_LOCK_waits;`

看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。
搜索的结果是在事务表发现了很多任务,这时候最好都kill掉。

第6步 批量删除事务表中的事务

这里用的方法是:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。

SELECT concat('KILL ',id,';') 
FROM information_schema.processlist p 
INNER JOIN  information_schema.INNODB_TRX x 
ON p.id=x.trx_mysql_thread_id 
WHERE db='test';

记得修改对应的数据库名。 这个语句执行后结果如下:

mysql>  SELECT concat('KILL ',id,';')  FROM information_schema.processlist p  INNER JOIN  information_schema.INNODB_TRX x  ON p.id=x.trx_mysql_thread_id  WHERE db='test';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 42;               |
| KILL 40;               |
+------------------------+
2 rows in set (0.00 sec)

执行结果里的两个kill语句即可解决锁表。  

mysql> KILL 42;
mysql> KILL 40;

http://www.kler.cn/a/376783.html

相关文章:

  • 深入学习 Scrapy 框架:从入门到精通的全面指南
  • Rust 力扣 - 643. 子数组最大平均数 I
  • VirtualBox 解决虚拟机Cable Unplugged 无法上网问题
  • 【STM32】STM32G431RBT6单片机的BOOT引脚位置及功能
  • 深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架
  • MyBaitsPlus 基本用法简单整理
  • ELK的ElasticStack概念
  • 11408 计网===物理层
  • 使用 Redis 作为异步队列:原理、实现及最佳实践
  • 小新学习k8s第六天之pod详解
  • Linux 常用安装软件
  • 虚幻引擎5(UE5)学习教程
  • BERT语言模型详解【Encoder-Only】
  • LeetCode HOT100系列题解之课程表(9/100)
  • MAC电脑的ifconfig输出
  • 浅谈mysql【8.0】链接字符串
  • 用于 Web 开发的 10 个必备 VS Code 扩展
  • iOS用rime且导入自制输入方案
  • linux_电脑一运行程序就死机怎么处理?
  • 锁原理和使用
  • Docker 安装HomeAssistant智能家居系统
  • uni-app实现app展示进度条在线更新以及定时更新提醒
  • 懂前端的都知道这里的门道有多深 - js 的事件循环
  • git am使用详解
  • 共模噪声和差模噪声
  • CentOS 7系统下Redis Cluster集群一键部署脚本发布