本文為 ID 173127 文章的補充視角,重點強化 SHOW ENGINE INNODB STATUS 監控指標解讀、髒頁雙列表機制、Redo Log Buffer 刷盤策略與 Additional Memory Pool 尺寸規劃實戰建議。
執行 SHOW ENGINE INNODB STATUS 關注 BUFFER POOL AND MEMORY 區塊:
---------------------- BUFFER POOL AND MEMORY ----------------------
Total memory allocated 4395630592; in additional pool allocated 0
Dictionary memory allocated 28892957
Buffer pool size 262143 -- 總頁數 (262143 * 16KB ≈ 4GB)
Free buffers 0 -- Free List 空閒頁數
Database pages 258559 -- LRU 列表總頁數
Old database pages 95424 -- Old 子列表頁數 (≈37%)
Modified db pages 36012 -- 髒頁數量 (關鍵寫入壓力指標)
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 72342127 -- 升級為 Young 頁累計次數
Pages not young 0 -- 未升級頁累計次數
8.82 youngs/s, 0.00 non-youngs/s -- 每秒升級/未升級速率
Buffer pool hit rate 1000 / 1000 -- 命中率 (建議 > 95%)
診斷建議:
Buffer pool hit rate < 95% 且 youngs/s 低 → 疑似全表掃描污染 LRU,檢查 innodb_old_blocks_time 是否設為 1000;Modified db pages 持續高位 → 髒頁刷盤跟不上,調大 innodb_io_capacity、innodb_max_dirty_pages_pct 或檢查磁盤 I/O 瓶頸;Free buffers 長期為 0 → 緩衝池壓力大,考慮擴容 innodb_buffer_pool_size。參數 innodb_flush_log_at_trx_commit 三檔位權衡:
| 值 | 行為 | ACID | 效能 | 適用場景 |
|---|---|---|---|---|
| 1 (預設) | 每提交寫日誌 + fsync 刷盤 | 完整 | 最低 | 核心交易、金融系統 |
| 2 | 每提交寫日誌(OS Cache),每秒 fsync | OS Crash 可能丟 1 秒 | 高 | 高併發非核心業務 |
| 0 | 每秒寫日誌 + fsync | MySQL Crash 丟 1 秒 | 最高 | 日誌、監控、可重算數據 |
配合 innodb_log_buffer_size(建議 8-64MB)吸收寫入峰值,減少 fsync 頻率。
參數 innodb_additional_mem_pool_size(5.6.3 後棄用,併入 Buffer Pool)用於分配:
經驗公式:Buffer Pool (GB) * 2MB。如 4GB Buffer Pool → 設 8MB(預設 8MB 通常足夠)。若報錯 InnoDB: Warning: Additional memory pool is too small 則需調大。
innodb_buffer_pool_size = 3G
innodb_buffer_pool_instances = 8
innodb_old_blocks_pct = 37
innodb_old_blocks_time = 1000
innodb_max_dirty_pages_pct = 75
innodb_io_capacity = 2000 -- SSD 建議 2000-5000
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1