Windows 環境下 MySQL 運行十幾小時後句柄數飆升至 10 萬+,系統響應極慢。經排查發現雖配置 skip-innodb 但 InnoDB 相關後台線程仍在運行,調整 innodb_flush_log_at_trx_commit=2 後句柄數穩定在 2 萬左右,性能恢復正常。本文記錄排查思路、參數含義、調優前後對比與最佳實踐建議。
my.ini)mysqld.exe 句柄數達 100,000+,系統整體卡頓,任何程序操作延遲極高skip-innodbinnodb_buffer_pool_size=8M 過大 → 調整無效innodb_flush_log_at_trx_commit 參數說明:| 值 | 行為 | 性能 | 數據安全性 |
|---|---|---|---|
| 0 | 事務提交不寫日誌文件,由後台線程每秒 fsync 一次 | 最快 | MySQL 崩潰可能丟失 1 秒數據 |
| 1 (默認) | 每次事務提交同步 fsync 到磁盤 | 最慢 | 完全 ACID,不丟數據 |
| 2 | 事務提交寫入 OS 緩存,後台線程每秒 fsync 刷盤 | 接近 0 | 僅 OS 崩潰/掉電丟失 1-2 秒數據 |
# my.ini 中 [mysqld] 區塊
innodb_flush_log_at_trx_commit = 2
# 重啟服務
net stop mysql
net start mysql
skip-innodb 僅禁用 InnoDB 存儲引擎接口,不會停止 InnoDB 內部後台線程(如 Master Thread、IO Thread、Purge Thread)innodb_flush_log_at_trx_commit=1 強制每次提交 fsync,產生大量同步 I/O 與內核對象(句柄)innodb_flush_log_at_trx_commit=2,平衡性能與安全=2Innodb_os_log_writes、Innodb_log_write_requests、句柄數趨勢