記錄生產環境高頻優化操作:通用日誌控制、事務隔離、鎖超時、死鎖、長事務排查的具體命令與解決思路。
# 通用日誌(慎開,極耗 IO)
SHOW GLOBAL VARIABLES LIKE '%general%';
SET GLOBAL general_log = ON; -- 開啟
SET GLOBAL general_log = OFF; -- 關閉
# 事務狀態
SET autocommit = 0; -- 開啟手動提交模式
# InnoDB 核心狀態
SHOW ENGINE INNODB STATUS\G
-- 重點關注:
-- TRANSACTIONS 區:活躍事務 ID、鎖等待、Undo Log 記錄數
-- FILE I/O / BUFFER POOL / LOG 區
現象:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
原因:事務持有行鎖時間過長,超過 innodb_lock_wait_timeout(默認 50s)。
優化策略:
排查:SHOW ENGINE INNODB STATUS\G 查看 LATEST DETECTED DEADLOCK 區塊,分析雙方持有鎖與等待鎖。
預防:
SELECT ... LOCK IN SHARE MODE / FOR UPDATE 顯式加鎖。危害:阻塞 Purge 線程,History List Length 暴增,Undo Log 膨脹,導致讀性能下降、磁盤空間耗盡。
定位:
SHOW ENGINE INNODB STATUS\G
-- 找到 Trx_id、Trx_started、Trx_mysql_thread_id
-- 關聯 PROCESSLIST 找到具體 SQL 與應用
處理:
COMMIT/ROLLBACK、加超時控制。KILL (謹慎,可能導致大量回滾)。| 問題 | 核心指標 | 關鍵動作 |
|---|---|---|
| 鎖超時 | innodb_lock_wait_timeout | 調順序、拆事務、合語句、加索引 |
| 死鎖 | LATEST DETECTED DEADLOCK | 固定訪問順序、縮短事務、顯式鎖讀 |
| 長事務 | History list length > 1000 | 應用層修復、監控告警、緊急 Kill |
| 慢查詢 | slow_query_log, EXPLAIN | 加索引、改寫 SQL、調參數、分批 |
pt-deadlock-logger、pt-query-digest 自動化分析。MySQL 性能優化核心是縮短事務、縮小鎖範圍、消除全掃。建立「慢查詢日誌 -> EXPLAIN -> 索引/改寫 -> 驗證」與「InnoDB Status 監控 -> 鎖/事務異常告警 -> 應用層修復」雙閉環,將故障解決從「救火」轉為「防火」。