MyISAM如何查看哪个session持有表锁

背景介绍:

前两天被问道一个问题,数据库使用了MyISAM表,对表进行dml操作时发现出现阻塞,shou full processlist 显示为Waiting for table lock,并且看不到哪个session引起的表锁,最后很暴力的重启数据库来解决此问题.之前也遇到过此类问题,都是由于sql注入引起的,因此show full processlist时都能看到,此次显然不是,重启数据库代价很大,影响服务不说MyISAM表最后什么状态只有天知道,见手册中的如下说明:

If a thread is updating a nontransactional table, an operation such as a multiple-row UPDATE or INSERT may leave the table partially updated because the operation can terminate before completion.

代价最小的办法就是找到锁表的session kill掉,innodb 有show innodb status和information_schema里的表可以定位session,那么MyISAM如何定位持有锁的session那?如下是我使用percona5.6.26复现此问题过程,细节信息与其他版本可能有所出入.

问题复现:

分别打开三个client A/B/C:

键一个MyISAM表test_myisam;

A:执行

LOCK TABLES test_myisam write;

B:执行

select * from test_myisam;

出现锁等待

C:执行

show full processlist;

能看到Waiting for table metadata lock ,但是看不到哪个session引起的

此时执行mysqladmin -h127.0.0.1 -P3306 -uroot -p123456 debug

打开error log在尾部可以找到

可以看到引起表锁的session为4845383,直接将其kill掉即可.

注:kill掉session是万不得已的做法,最好还是等其执行完,如果是线上业务并且已经引起问题才考虑这么做.

时间: 2024-10-14 11:58:50

MyISAM如何查看哪个session持有表锁的相关文章

数据库的锁:行级锁、表锁、乐观锁、悲观锁的实现原理

一.相关名词 表级锁(锁定整个表) 页级锁(锁定一页) 行级锁(锁定一行) 共享锁(S锁,MyISAM 叫做读锁) 排他锁(X锁,MyISAM 叫做写锁) 悲观锁(抽象性,不真实存在这个锁) 乐观锁(抽象性,不真实存在这个锁) 二.InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB .查看当前存储引擎: show variables like '%storage_engine%'; MyISAM 操作数据都是使用的表锁,你更新一条记录就要

关于mysql数据库引擎MyIsam的表锁理解

MySQL中的锁概念 MySQL中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

查看oracle是否有表被锁

查看oracle是否有表被锁=================================== select sid,serial#,program,terminal,username,b.object_id,c.object_name  from v$session a, v$locked_object b, dba_objects c where a.sid = b.session_id   and b.object_id = c.object_id;

MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

MySQL中的锁概念 Mysql中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

(5)mysql优化之MyISAM表锁

概述 ??MyISAM存储引擎只支持表锁,mysql的表锁有两种模式:读锁和写锁.他们的兼容关系是(对myisam的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作*)和(对myisam的写操作,则会阻塞其他用户对同一表的读和写操作),读写操作是串行的. 如何加表锁 ??MyISAM在执行查询语句(select)前,会自动给涉及的所有表加上读锁.在执行更新操作(update,delete,insert等)前,会自动给涉及的表加上写锁,这个过程不需要用户干预.如果要显示加锁,参见

MyISAM表锁

MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制. MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking). BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁. InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢;会出现死锁;锁

锁(MySQL篇)—之MyISAM表锁

前言 锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,所冲突也是影响数据库并发访问的一个重要因素. MySQL表概述 相比其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引

MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)

锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于数据库而言就显得尤为重要. MySQL锁 相对于其他的数据库而言,MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不

MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于