如何解锁被其他用户锁定的数据库表 无需重启数据库服务器
MySQL非重启解锁他人持有表锁的解决方案
你之前遇到的杀进程无效问题,本质是命令使用逻辑问题:
KILL QUERY <id>只会终止会话当前运行的单条语句,不会结束会话本身,所以会话持有的表锁依然会保留;而KILL <会话ID>会直接终止整个数据库会话,MySQL会自动释放该会话持有的所有表锁、事务资源,和该会话当前是否在执行查询无关。
方案1:终止持有锁的数据库会话(通用方案,支持MySQL 5.6及以上所有主流版本)
操作步骤:
- 第一步:查询持有目标表锁的会话信息
执行以下SQL,将your_table_name替换为被锁定的表名:
执行后得到的SELECT pl.id AS session_id, pl.user, pl.host, pl.state FROM performance_schema.metadata_locks ml JOIN information_schema.processlist pl ON ml.owner_thread_id = pl.thread_id WHERE ml.object_name = 'your_table_name' AND ml.object_type = 'TABLE' AND ml.lock_status = 'GRANTED';session_id就是持有该表锁的会话ID,可通过host字段核对是否为你同事的设备地址,避免误杀其他业务会话。 - 第二步:终止该会话
用拥有SUPER权限的数据库账号执行命令:
执行后该会话持有的所有表锁会立即自动释放,不需要重启数据库。KILL <替换为上一步查到的session_id>;
适配低版本数据库的备用方案
如果你的数据库版本过旧未开启performance_schema,可直接执行SHOW FULL PROCESSLIST,找到来自你同事主机地址、状态为Sleep的会话,核对连接账号后直接执行KILL <会话ID>即可:LOCK TABLES执行完成后会话会一直处于Sleep状态直到被断开,杀掉该会话就会自动释放锁资源。
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

