前言:變量是 MySQL 運行狀態的「儀表盤」
MySQL 維護兩大變量體系:**系統變量** 控制行為配置,**狀態變量** 反映運行指標。理解作用域(GLOBAL/SESSION)、動態調整權限、持久化機制、監控指標體系,是 DBA 實現「可觀測、可調控、可演進」運維的核心能力。本文系統梳理兩大變量體系架構、操作命令、關鍵差異與實戰應用模式。
一、系統變量:配置的「基因密碼」
1. 兩大作用域:GLOBAL vs SESSION
| 維度 | GLOBAL (全局變量) | SESSION (會話變量) |
| 影響範圍 | 整個 Server 實例 | 當前客戶端連接 |
| 初始化 | 啟動時讀取配置文件/命令行參數 | 連接時複製對應 GLOBAL 當前值 |
| 修改權限 | 需 SUPER 權限 | 無特殊權限,僅影響自身 |
| 修改生效對象 | **新建連接**繼承新值;現有連接**不受影響** | 立即生效,僅當前會話 |
| 持久化 | 5.7+ SET PERSIST 寫入 mysqld-auto.cnf,重啟保留 | 會話結束即銷毀 |
2. 修改語法與最佳實踐
-- 顯式指定作用域(推薦)
SET GLOBAL sort_buffer_size = 10*1024*1024; -- 10MB
SET SESSION sort_buffer_size = 4*1024*1024; -- 4MB
-- 未指定默認 SESSION
SET sort_buffer_size = 4*1024*1024;
-- 5.7+ 持久化全局變量(重啟生效,替代修改配置文件)
SET PERSIST max_connections = 1000;
SET PERSIST_ONLY back_log = 1000; -- 僅寫文件,不修改運行值
- 單位陷阱:緩衝區/長度/堆棧類變量單位均為**字節**,設定時建議用乘法表達式(如
10*1024*1024)提升可讀性。
- 動態 vs 靜態:
SHOW VARIABLES 不區分;需查閱文檔或嘗試 SET GLOBAL 判斷(靜態變量報錯)。靜態變量修改需改配置文件重啟。
3. 核心查看命令
-- 全量查看
SHOW VARIABLES;
SHOW GLOBAL VARIABLES;
SHOW SESSION VARIABLES;
-- 模糊匹配(高頻)
SHOW VARIABLES LIKE 'innodb_%';
SHOW VARIABLES LIKE '%buffer%';
二、狀態變量:運行的「心電圖」
1. 特性
- **只讀**,不可手動修改(除
FLUSH STATUS 歸零計數器)。
- 累計計數器:啟動至今累計值(如
Connections、Questions)。
- 即時快照:當前狀態值(如
Threads_running、Innodb_buffer_pool_pages_data)。
- 作用域:GLOBAL(實例級)與 SESSION(會話級,
SHOW SESSION STATUS)。
2. 核心查看命令
-- 全量
SHOW STATUS;
SHOW GLOBAL STATUS;
SHOW SESSION STATUS;
-- 關鍵指標模糊匹配
SHOW GLOBAL STATUS LIKE 'Threads_%';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_%';
SHOW GLOBAL STATUS LIKE 'Key_read%';
SHOW GLOBAL STATUS LIKE 'Qcache_%';
SHOW GLOBAL STATUS LIKE 'Created_tmp_%';
3. FLUSH STATUS:計數器歸零
- 將大多數**累計型**狀態變量重置為 0(如
Com_select、Connections、Key_reads)。
- 不影響:即時快照類變量(
Threads_running、Uptime 等)。
- 用途:基準測試前歸零、定時採樣計算增量速率(QPS、TPS、緩存命中率/分)。
三、關鍵差異對比:一表看懂
| 特性 | 系統變量 | 狀態變量 |
| 性質 | 配置參數(輸入) | 運行指標(輸出) |
| 可讀寫性 | 可讀可寫 (動態者) | 唯讀 |
| 作用域 | GLOBAL / SESSION | GLOBAL / SESSION |
| 持久化 | 配置文件 / SET PERSIST | 不持久化,重啟歸零 |
| 修改權限 | GLOBAL 需 SUPER | 不可修改 |
| 典型代表 | innodb_buffer_pool_size, max_connections | Threads_running, Key_read_requests |
| 查看命令 | SHOW VARIABLES | SHOW STATUS |
四、運維實戰:變量驅動的監控與調優閉環
1. 基準線建立(每日/每小時採樣)
-- 關鍵指標採樣腳本
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Com_select';
SHOW GLOBAL STATUS LIKE 'Com_insert';
SHOW GLOBAL STATUS LIKE 'Com_update';
SHOW GLOBAL STATUS LIKE 'Com_delete';
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_free';
SHOW GLOBAL STATUS LIKE 'Key_read_requests';
SHOW GLOBAL STATUS LIKE 'Key_reads';
2. 核心衍生指標計算(Prometheus/Grafana 規則)
| 指標 | 計算公式 | 健康閾值 |
| QPS | rate(Questions[1m]) | 業務基準線 ±20% |
| 讀寫比 | Com_select / (Com_insert+Com_update+Com_delete) | 視業務,典型 10:1~100:1 |
| 線程使用率 | Threads_running / max_connections | < 80% |
| InnoDB 緩存命中率 | 1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests | > 99.9% |
| Key Cache 命中率 | 1 - Key_reads / Key_read_requests | > 99.9% (MyISAM) |
| 臨時表磁碟化率 | Created_tmp_disk_tables / Created_tmp_tables | < 10% |
| 緩存碎片率 | Qcache_free_blocks / Qcache_total_blocks | < 20% |
3. 動態調優實戰模式
-- 場景:突發流量導致 Threads_running 飆升,臨時擴大連接數
SET GLOBAL max_connections = 2000; -- 即時生效,新連接受益
-- 同步更新配置文件持久化
-- 事後分析:是否需架構擴容/讀寫分離/限流
-- 場景:Key Cache 命中率下降,動態擴容
SET GLOBAL key_buffer_size = 2*1024*1024*1024; -- 2GB
-- 注意:MyISAM 專用,InnoDB 不受影響
- 動態調整**僅緩解症狀**,根因需結合
EXPLAIN、慢查詢、架構演進解決。
- 調整後必須 **同步更新配置文件** 或
SET PERSIST,否則重啟失效。
4. 變量變更審計與合規
mysql.audit_log / MariaDB Audit Plugin 記錄所有 SET GLOBAL 操作。
- 變更管理流程:工單申請 → 影響分析 → 灰度驗證 → 全量發布 → 配置文件同步 → 審計歸檔。
五、官方文檔導航(權威來源)
結語
系統變量是「方向盤」,狀態變量是「儀表盤」。掌握 **GLOBAL/SESSION 作用域邊界**、**動態調整即時生效與持久化分離**、**核心衍生指標計算體系**、**變更審計合規流程**,即可從「被動看報警」進階為「主動控制盤」,在 MySQL 運行的萬變洪流中,穩穩掌舵、精準導航、持續交付高可用服務。