MySQL Semaphore wait has lasted使用详解

 更新时间:2025年07月24日 09:49:45   作者:喝醉酒的小白  
MySQL 5.7.19 Semaphore wait >600秒错误源于InnoDB线程等待信号量超时,常见于死锁、资源竞争或IO瓶颈,排查需检查长事务、高并发写入、磁盘性能及数据页损坏,建议升级至5.7或8.0版本以修复问题

MySQL 5.7.19 版本出现 Semaphore wait has lasted > 600 seconds 错误,意味着 InnoDB 内部某些线程等待信号量超过了10分钟,导致数据库挂起崩溃。

针对这个问题,排查和定位的思路及步骤如下:

1. 理解信号量(Semaphore)和等待的背景

  • InnoDB 通过信号量机制保护共享资源访问,例如缓冲池页、锁、事务信息等
  • 长时间等待信号量一般是死锁、资源竞争、内部异常或IO瓶颈导致的。
  • 错误日志中会列出等待信号量的线程堆栈位置(源码文件 + 行号),有助定位是哪类资源阻塞。

2. 收集环境与上下文信息

MySQL版本

  • 5.7.19,是较早的5.7版本,InnoDB还有一些已修复的问题,建议考虑升级。

服务器硬件与资源状况

  • CPU、内存利用率
  • 磁盘IO状况(IOPS、延迟)

数据库负载情况

  • 并发连接数
  • 读写比例
  • 是否有长事务/大事务

具体业务场景

  • 当时运行什么SQL,是否有大量INSERT/UPDATE/DELETE
  • 是否有DDL操作(alter、drop)

3. 查看MySQL错误日志和InnoDB状态

a. 错误日志中的关键信息

确认报错线程对应的源码文件和行号:

mtr0mtr.ccrow0ins.cc 等,分别代表:

  • mtr0mtr.cc:多版本事务相关管理(Mini-transaction)
  • row0ins.cc:行插入相关代码

这些提示可能表明在插入操作中出现了阻塞。

b. 通过SHOW ENGINE INNODB STATUS\G观察

  • 锁等待情况(LATEST DETECTED DEADLOCK)
  • 当前活跃事务列表
  • semaphore wait 信息(SEMAPHORE WAIT块)
  • 主线程或阻塞线程的详细信息

4. 结合源码行号,定位具体阻塞点

可以通过查看5.7.19版本源码对应文件(MySQL官方github或者源码包)定位:

  • mtr0mtr.cc line 567

涉及Mini-transaction相关锁等待,可能是InnoDB内部的metadata锁或缓冲池访问竞争。

  • row0ins.cc line 193

插入行时等待信号量,可能是插入缓冲区竞争或插入锁等待。

5. 重点排查方向

5.1 长事务导致锁资源占用

  • SHOW PROCESSLIST 看是否存在长时间未提交的事务。
  • INFORMATION_SCHEMA.INNODB_TRX 查看当前活动事务。
  • 关闭长事务或者合理设置事务超时。

5.2 高并发写入导致缓冲池争用

高并发大批量写入,缓冲池页锁争用严重。

调整 InnoDB 参数,如:

  • innodb_thread_concurrency
  • innodb_lock_wait_timeout
  • innodb_buffer_pool_size (确保足够大,避免频繁刷盘)

5.3 磁盘IO瓶颈

  • 使用系统工具(iostat, vmstat)检查磁盘负载和延迟。
  • 高IO延迟会导致InnoDB锁等待。

5.4 表空间或数据页损坏

  • 使用 CHECK TABLE 检查相关表。
  • 参考错误日志是否有提示页损坏。

6. 其他诊断技巧

6.1 启用详细InnoDB调试日志

启动MySQL时添加:

[mysqld]
innodb_print_all_deadlocks=ON
innodb_lock_wait_timeout=50

查看死锁详细信息。

6.2 使用性能Schema定位锁等待

  • 查询 performance_schema.data_locksperformance_schema.data_lock_waits ,定位锁资源。

7. 解决建议总结

问题点排查方法解决措施
长事务占用锁SHOW PROCESSLIST, INNODB_TRX关闭或优化长事务,合理拆分事务
高并发写压力大观察缓冲池争用,线程锁等待优化参数,分批写入,升级版本
磁盘IO瓶颈iostat, vmstat优化存储,使用SSD,提高IO性能
表空间或页损坏CHECK TABLE, innodb_force_recovery尝试恢复数据,导出备份,重建表空间
InnoDB版本缺陷官方Bug报告,源码分析升级MySQL版本到最新稳定版

8. 典型诊断命令举例

-- 查看当前阻塞事务
SELECT * FROM information_schema.innodb_trx\G;

-- 查看当前等待锁的线程
SELECT * FROM performance_schema.data_locks WHERE LOCK_STATUS='WAITING';

-- 查看进程列表,看长时间执行的SQL
SHOW FULL PROCESSLIST;

-- 查看死锁日志(在错误日志中)
-- 或启用 innodb_print_all_deadlocks=ON 后捕获

总结

先从当前活跃事务和锁等待入手排查。

结合InnoDB状态和系统IO性能分析瓶颈。

若怀疑数据损坏,尝试使用 innodb_force_recovery

5.7.19版本较老,建议升级至5.7较新版本,或者8.0版本,获得更多稳定性和bug修复。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql错误Every derived table must have its own alias解决方法

    Mysql错误Every derived table must have its own alias解决方法

    这篇文章主要介绍了Mysql错误Every derived table must have its own alias解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Mysql数据库存储布尔值的详细教程

    Mysql数据库存储布尔值的详细教程

    在日常开发中,布尔值(true/false)是最常用的数据类型之一,本文将和大家详细介绍Mysql数据库存储布尔值的真实方式,感兴趣的小伙伴可以了解下
    2026-05-05
  • mysql中整数数据类型tinyint详解

    mysql中整数数据类型tinyint详解

    大家好,本篇文章主要讲的是mysql中整数数据类型tinyint详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Mysql 聚合函数嵌套使用操作

    Mysql 聚合函数嵌套使用操作

    这篇文章主要介绍了Mysql 聚合函数嵌套使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • MySQL数据库事务原理及应用

    MySQL数据库事务原理及应用

    MySQL数据库事务是指一组数据库操作,要么全部执行成功,要么全部回滚。事务可以确保数据的一致性和完整性,避免了多个用户同时对同一数据进行修改所带来的问题。MySQL通过事务日志记录事务的操作,支持事务的回滚和提交等操作
    2023-04-04
  • Centos7使用yum安装Mysql5.7.19的详细步骤

    Centos7使用yum安装Mysql5.7.19的详细步骤

    本篇文章主要介绍了Centos7使用yum安装Mysql5.7.19的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • mysql8查看锁信息

    mysql8查看锁信息

    MYSQL中有一个重要的特性就是锁,下面这篇文章主要给大家介绍了关于mysql8查看锁信息的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL数据库中的安全设置方案

    MySQL数据库中的安全设置方案

    MySQL 是一个真正的多用户、多线程SQL数据库服务器,它是一个客户机/服务器结构的实现。MySQL是现在流行的关系数据库中其中的一种,相比其它的数据库管理系统(DBMS)来说,MySQL具有小巧、功能齐全、查询迅捷等优点。MySQL 主要目标是快速、健壮和易用。
    2015-04-04
  • mysql 时间转换函数的使用方法

    mysql 时间转换函数的使用方法

    都是实例,大家可以参考一一写一下
    2008-07-07
  • mysql中关于between和in的区别

    mysql中关于between和in的区别

    这篇文章主要介绍了mysql中关于between和in的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论