如何在MySQL中监控MyISAM的Table_locks_waited指标?

星墨酱_6110

星墨酱_6110

2026-09-03

533人浏览

原创

查 table_locks_waited 需用 show global status like 'table_locks_waited' 获取累计值,须与 table_locks_immediate 计算比值(应远低于 0.01)判断锁争用,配合 show open tables 和 processlist 定位瓶颈表及阻塞线程,并确认引擎为 myisam。

如何在mysql中监控myisam的table_locks_waited指标?

查 Table_locks_waited 的实时值用 SHOW STATUS

直接运行 SHOW GLOBAL STATUS LIKE 'Table_locks_waited'; 就能拿到当前累计等待次数。这个值是自 MySQL 启动以来的总和,不是瞬时速率——所以单看一次结果意义不大,要对比两次采样差值(比如间隔 60 秒)才能判断是否正在持续发生锁争用。

常见错误是只跑一次就下结论:“Table_locks_waited 是 135,不高啊”。但若 1 分钟内从 135 涨到 280,说明每秒约有 2.5 次锁等待,已属异常。

  • 必须加 GLOBAL,否则可能返回会话级状态(该变量无会话级意义,但不加容易误读)
  • 注意大小写:Table_locks_waited 是标准拼写,table_locks_waited 在部分旧版本可能也认,但不保证兼容
  • 不要和 INNODB_ROW_LOCK_WAITS 混淆——后者是 InnoDB 行锁统计,对 MyISAM 完全无效

判断是否真有问题:看比值,不是看绝对值

Table_locks_waited 必须和 Table_locks_immediate 对着看。前者是“等过的次数”,后者是“秒过的次数”。健康 MyISAM 实例中,Table_locks_waited / Table_locks_immediate 应远低于 0.01(即每百次锁请求最多等 1 次)。

例如当前值:
Table_locks_immediate: 1147514
Table_locks_waited: 135
比值 ≈ 0.000118 → 属正常范围;但如果 Table_locks_waited 达到 5000 而 Table_locks_immediate 才 8000,比值 > 0.6,就说明绝大多数写操作都在排队。

  • 比值突增比绝对值更重要——可能是某张 MyISAM 表被高频写入,或某个慢 INSERT 卡住锁
  • 这个比值没有固定阈值,要结合业务节奏看趋势。凌晨批量导入时短暂升高是合理的,白天交易高峰持续高则危险
  • 别试图“清零”它:FLUSH STATUS 会重置,但掩盖问题,不是解决手段

定位具体哪张表在拖后腿

Table_locks_waited 告诉你“有锁争用”,但不告诉你“在哪”。得立刻查 SHOW OPEN TABLES WHERE In_use > 0; —— 这个命令列出所有当前被 MyISAM 表锁占用的表,In_use 值大于 1 表示多个线程正竞争同一张表。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

配合 SELECT * FROM information_schema.PROCESSLIST WHERE STATE = 'Waiting for table level lock'; 找出等待者,再顺藤摸瓜找那个 State 是 Updating 或 Writing to net 的源头线程(它大概率正拿着锁没释放)。

  • SHOW OPEN TABLES 不显示锁类型(读/写),但 In_use > 0 几乎总是由写操作引发(MyISAM 读不加锁,除非显式 LOCK TABLES ... READ)
  • 如果某张表反复出现在 SHOW OPEN TABLES 结果里且 In_use 长期 > 0,基本可锁定为瓶颈表
  • 务必先确认引擎:SHOW CREATE TABLE <code>your_table; 查 ENGINE=MyISAM,避免误判 InnoDB 表

监控脚本里别漏掉连接池干扰

很多线上服务用连接池(如 HikariCP、Druid),KILL 掉一个阻塞线程后,连接可能被复用,新 SQL 立刻又卡在同一张表上——看起来 Table_locks_waited 还在涨,但 PROCESSLIST 里找不到老线程了。

这时光盯 MySQL 指标不够,得同步检查应用日志:是否有未关闭的 LOCK TABLES、批量 INSERT 是否没加事务包装、有没有漏写 UNLOCK TABLES。

  • MyISAM 锁是语句级的,INSERT 执行完就释放;但显式 LOCK TABLES t WRITE 后,必须配对 UNLOCK TABLES,否则锁一直挂着
  • 连接池的 maxLifetime 和 keepaliveTime 设置过长,会让“带锁残留”的连接存活更久,放大问题
  • 真正难排查的是那种“半截死掉”的连接:客户端崩溃或网络中断,MySQL 没及时感知,锁要等 wait_timeout(默认 8 小时)才释放

真正麻烦的从来不是看到 Table_locks_waited 在涨,而是它涨得不规律、不集中——可能隔几分钟突然跳几十,然后归于平静。这种毛刺型上涨往往意味着某个定时任务或异步作业在偷偷用 MyISAM 表做中间计算,没人记得它存在。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2073

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2792

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4628

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4891

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4362

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5694

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习