MySQL Semaphore wait has lasted使用詳解
MySQL 5.7.19 版本出現(xiàn) Semaphore wait has lasted > 600 seconds 錯誤,意味著 InnoDB 內(nèi)部某些線程等待信號量超過了10分鐘,導(dǎo)致數(shù)據(jù)庫掛起崩潰。
針對這個問題,排查和定位的思路及步驟如下:
1. 理解信號量(Semaphore)和等待的背景
- InnoDB 通過信號量機(jī)制保護(hù)共享資源訪問,例如緩沖池頁、鎖、事務(wù)信息等。
- 長時間等待信號量一般是死鎖、資源競爭、內(nèi)部異?;騃O瓶頸導(dǎo)致的。
- 錯誤日志中會列出等待信號量的線程堆棧位置(源碼文件 + 行號),有助定位是哪類資源阻塞。
2. 收集環(huán)境與上下文信息
MySQL版本:
- 5.7.19,是較早的5.7版本,InnoDB還有一些已修復(fù)的問題,建議考慮升級。
服務(wù)器硬件與資源狀況:
- CPU、內(nèi)存利用率
- 磁盤IO狀況(IOPS、延遲)
數(shù)據(jù)庫負(fù)載情況:
- 并發(fā)連接數(shù)
- 讀寫比例
- 是否有長事務(wù)/大事務(wù)
具體業(yè)務(wù)場景:
- 當(dāng)時運(yùn)行什么SQL,是否有大量INSERT/UPDATE/DELETE
- 是否有DDL操作(alter、drop)
3. 查看MySQL錯誤日志和InnoDB狀態(tài)
a. 錯誤日志中的關(guān)鍵信息
確認(rèn)報錯線程對應(yīng)的源碼文件和行號:
mtr0mtr.cc,row0ins.cc 等,分別代表:
mtr0mtr.cc:多版本事務(wù)相關(guān)管理(Mini-transaction)row0ins.cc:行插入相關(guān)代碼
這些提示可能表明在插入操作中出現(xiàn)了阻塞。
b. 通過SHOW ENGINE INNODB STATUS\G觀察
- 鎖等待情況(LATEST DETECTED DEADLOCK)
- 當(dāng)前活躍事務(wù)列表
- semaphore wait 信息(
SEMAPHORE WAIT塊) - 主線程或阻塞線程的詳細(xì)信息
4. 結(jié)合源碼行號,定位具體阻塞點(diǎn)
可以通過查看5.7.19版本源碼對應(yīng)文件(MySQL官方github或者源碼包)定位:
mtr0mtr.cc line 567
涉及Mini-transaction相關(guān)鎖等待,可能是InnoDB內(nèi)部的metadata鎖或緩沖池訪問競爭。
row0ins.cc line 193
插入行時等待信號量,可能是插入緩沖區(qū)競爭或插入鎖等待。
5. 重點(diǎn)排查方向
5.1 長事務(wù)導(dǎo)致鎖資源占用
SHOW PROCESSLIST看是否存在長時間未提交的事務(wù)。INFORMATION_SCHEMA.INNODB_TRX查看當(dāng)前活動事務(wù)。- 關(guān)閉長事務(wù)或者合理設(shè)置事務(wù)超時。
5.2 高并發(fā)寫入導(dǎo)致緩沖池爭用
高并發(fā)大批量寫入,緩沖池頁鎖爭用嚴(yán)重。
調(diào)整 InnoDB 參數(shù),如:
innodb_thread_concurrencyinnodb_lock_wait_timeoutinnodb_buffer_pool_size(確保足夠大,避免頻繁刷盤)
5.3 磁盤IO瓶頸
- 使用系統(tǒng)工具(
iostat,vmstat)檢查磁盤負(fù)載和延遲。 - 高IO延遲會導(dǎo)致InnoDB鎖等待。
5.4 表空間或數(shù)據(jù)頁損壞
- 使用
CHECK TABLE檢查相關(guān)表。 - 參考錯誤日志是否有提示頁損壞。
6. 其他診斷技巧
6.1 啟用詳細(xì)InnoDB調(diào)試日志
啟動MySQL時添加:
[mysqld] innodb_print_all_deadlocks=ON innodb_lock_wait_timeout=50
查看死鎖詳細(xì)信息。
6.2 使用性能Schema定位鎖等待
- 查詢
performance_schema.data_locks和performance_schema.data_lock_waits,定位鎖資源。
7. 解決建議總結(jié)
| 問題點(diǎn) | 排查方法 | 解決措施 |
|---|---|---|
| 長事務(wù)占用鎖 | SHOW PROCESSLIST, INNODB_TRX | 關(guān)閉或優(yōu)化長事務(wù),合理拆分事務(wù) |
| 高并發(fā)寫壓力大 | 觀察緩沖池爭用,線程鎖等待 | 優(yōu)化參數(shù),分批寫入,升級版本 |
| 磁盤IO瓶頸 | iostat, vmstat | 優(yōu)化存儲,使用SSD,提高IO性能 |
| 表空間或頁損壞 | CHECK TABLE, innodb_force_recovery嘗試 | 恢復(fù)數(shù)據(jù),導(dǎo)出備份,重建表空間 |
| InnoDB版本缺陷 | 官方Bug報告,源碼分析 | 升級MySQL版本到最新穩(wěn)定版 |
8. 典型診斷命令舉例
-- 查看當(dāng)前阻塞事務(wù) SELECT * FROM information_schema.innodb_trx\G; -- 查看當(dāng)前等待鎖的線程 SELECT * FROM performance_schema.data_locks WHERE LOCK_STATUS='WAITING'; -- 查看進(jìn)程列表,看長時間執(zhí)行的SQL SHOW FULL PROCESSLIST; -- 查看死鎖日志(在錯誤日志中) -- 或啟用 innodb_print_all_deadlocks=ON 后捕獲
總結(jié)
先從當(dāng)前活躍事務(wù)和鎖等待入手排查。
結(jié)合InnoDB狀態(tài)和系統(tǒng)IO性能分析瓶頸。
若懷疑數(shù)據(jù)損壞,嘗試使用 innodb_force_recovery。
5.7.19版本較老,建議升級至5.7較新版本,或者8.0版本,獲得更多穩(wěn)定性和bug修復(fù)。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
- 解決mysql插入數(shù)據(jù)鎖等待超時報錯:Lock?wait?timeout?exceeded;try?restarting?transaction
- MySQL數(shù)據(jù)庫wait_timeout參數(shù)詳細(xì)介紹
- MySQL鎖等待超時問題的原因和解決方案(Lock wait timeout exceeded; try restarting transaction)
- mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決
- MySQL Lock wait timeout exceeded錯誤解決
- mysql之連接超時wait_timeout問題及解決方案
- MySQL出現(xiàn)"Lock?wait?timeout?exceeded"錯誤的原因是什么詳解
相關(guān)文章
Mysql錯誤Every derived table must have its own alias解決方法
這篇文章主要介紹了Mysql錯誤Every derived table must have its own alias解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
Mysql數(shù)據(jù)庫存儲布爾值的詳細(xì)教程
在日常開發(fā)中,布爾值(true/false)是最常用的數(shù)據(jù)類型之一,本文將和大家詳細(xì)介紹Mysql數(shù)據(jù)庫存儲布爾值的真實(shí)方式,感興趣的小伙伴可以了解下2026-05-05
mysql中整數(shù)數(shù)據(jù)類型tinyint詳解
大家好,本篇文章主要講的是mysql中整數(shù)數(shù)據(jù)類型tinyint詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
MySQL數(shù)據(jù)庫事務(wù)原理及應(yīng)用
MySQL數(shù)據(jù)庫事務(wù)是指一組數(shù)據(jù)庫操作,要么全部執(zhí)行成功,要么全部回滾。事務(wù)可以確保數(shù)據(jù)的一致性和完整性,避免了多個用戶同時對同一數(shù)據(jù)進(jìn)行修改所帶來的問題。MySQL通過事務(wù)日志記錄事務(wù)的操作,支持事務(wù)的回滾和提交等操作2023-04-04
Centos7使用yum安裝Mysql5.7.19的詳細(xì)步驟
本篇文章主要介紹了Centos7使用yum安裝Mysql5.7.19的詳細(xì)步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
MySQL數(shù)據(jù)庫中的安全設(shè)置方案
MySQL 是一個真正的多用戶、多線程SQL數(shù)據(jù)庫服務(wù)器,它是一個客戶機(jī)/服務(wù)器結(jié)構(gòu)的實(shí)現(xiàn)。MySQL是現(xiàn)在流行的關(guān)系數(shù)據(jù)庫中其中的一種,相比其它的數(shù)據(jù)庫管理系統(tǒng)(DBMS)來說,MySQL具有小巧、功能齊全、查詢迅捷等優(yōu)點(diǎn)。MySQL 主要目標(biāo)是快速、健壯和易用。2015-04-04
mysql中關(guān)于between和in的區(qū)別
這篇文章主要介紹了mysql中關(guān)于between和in的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

