MySql中怎样查询表是否被锁

文章介绍了在MySQL中检测和处理表被锁导致的问题,包括查看open_tables、processlist、INNODBtrx和LOCKS,以及如何查找并解决死锁和阻塞事务的方法。

MySql查询表是否被锁

查看表被锁状态

# 查询哪些表锁了
show OPEN TABLES where In_use > 0;

查看造成死锁的sql语句

# 查询innodb引擎的运行时信息
show engine innodb status;

查询进程

# 查询所有进程
show processlist;

解锁(删除进程)

# 删除进程
kill id;

查看正在执行的事务

# 查看正在执行的事务
select * from information_schema.INNODB_TRX;

查看正在锁的事物

# 查看正在锁的事物
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

查看等待锁的事物

# 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

MySql出现数据库表被锁解决方案

出现的现象

页面出现502错误,数据库CPU持续飙升,大量事务堆积未提交成功(事务一直处于阻塞阶段)

查看阻塞事务列表,发现其中有锁表现象。

排查与解决思路

1)查看数据库中是否有表被锁

show open tables where in_use > 0;

如果上述返回有结果,说明有表正在被使用,返回字段如下

| Database | Table | In_use | Name_locked |

2)查看进程(只会显示当前用户的进程,除非是root用户)

show processlist;

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)清理事务指定的线程 ID

kill 1234;

原文地址

MySql中怎样查询表是否被锁_Mysql_脚本之家 (jb51.net)icon-default.png?t=N7T8https://www.jb51.net/database/2934268li.htm

<think>我们正在讨论的是MySQL中如何查询表是否住的问题。根据用户提供的引用信息和之前的对话历史,我们可以总结出以下几种方法来查看MySQL中的情况: 1. 查询`information_schema.INNODB_TRX`:查看当前运行的事务,事务可能持有。 2. 使用`SHOW OPEN TABLES`:查看哪些被打开,其中`In_use`列大于0示有线程正在使用该(即被住)。 3. 查询`information_schema.INNODB_LOCKS`(MySQL 5.7)或`performance_schema`(MySQL 8.0)来查看的详细信息。 4. 使用`SHOW ENGINE INNODB STATUS`:查看InnoDB引擎状态,其中会包含死锁的信息。 5. 查看`information_schema.INNODB_LOCK_WAITS`:查看等待情况,可以知道哪些事务被阻塞。 需要注意的是,在MySQL 8.0中,`information_schema`中的部分已被移除,建议使用`performance_schema`替代。 根据用户的问题,他想要了解如何查询表是否住。我们可以重点介绍以下两种最直接的方法: 方法一:使用`SHOW OPEN TABLES`命令 这个命令可以列出当前所有打开的,并显示每个被使用的线程数(即`In_use`列)。如果某个的`In_use`大于0,则示该定。 方法二:查询`information_schema`中的 通过查询`INNODB_TRX`可以知道当前正在运行的事务,这些事务可能持有。结合`INNODB_LOCKS`(如果可用)可以查看具体的信息。 另外,也可以查看进程列(`SHOW PROCESSLIST`)来观察是否有长时间运行的查询或事务,这可能与有关。 下面我们根据这些方法给出具体的查询步骤。 </think>### 🔍 MySQL查询表是否住的完整方法 #### 一、查看状态 1. **检查使用计数** ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` - `In_use`列显示定状态:>0示被定[^4][^3] - `Name_locked`是否定(通常发生在DROP/RENAME操作时) 2. **查看进程占用情况** ```sql SHOW PROCESSLIST; ``` - 观察`State`列:出现`Locked`/`Waiting for table lock` - `Info`列显示正在执行的SQL语句[^3] #### 二、查看行级状态(InnoDB) 1. **检查当前事务** ```sql SELECT * FROM information_schema.INNODB_TRX; ``` - 关键字段: - `trx_state`:`LOCK WAIT`等待 - `trx_query`:被阻塞的SQL语句[^3][^1] 2. **查看等待关系(MySQL 5.7+)** ```sql SELECT r.trx_id waiting_trx_id, b.trx_id blocking_trx_id FROM information_schema.innodb_lock_waits w JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id; ``` #### 三、查看死锁信息 ```sql SHOW ENGINE INNODB STATUS\G ``` - 查看`LATEST DETECTED DEADLOCK`部分 - 包含死锁事务ID、阻塞资源和SQL语句[^3] #### 四、强制解方法 ```sql KILL [process_id]; -- 终止阻塞进程 ``` - 通过`SHOW PROCESSLIST`获取`Id`字段值[^3] - 注意:需`PROCESS`权限且可能导致数据不一致 > 📌 **注意事项** > - MyISAM只支持,InnoDB支持行级 > - MySQL 8.0+建议使用`performance_schema`替代`information_schema` > - 长期可能由未提交事务或长查询引起,需结合业务逻辑分析[^1] --- ### ❓ 相关问题 1. `SHOW OPEN TABLES`结果中`In_use`和`Name_locked`的具体区别是什么? 2. 如何区分MySQL中的元数据(MDL)和行级? 3. 在MySQL 8.0中如何通过`performance_schema`监控等待? 4. 自动死锁检测(`innodb_deadlock_detect`)的工作原理是什么? 5. 如何避免生产环境中出现长时间的阻塞?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值