MySQL 提供 200+ 服務器變量,靈活調整可適配業務個性化需求(時區、日期格式、排序規則等)。本文梳理「查看→區分→修改→驗證→備份」全鏈路最佳實踐,避開生效延遲、權限陷阱、業務衝突等坑點。
SHOW VARIABLES LIKE 'date%'; -- 列出所有 date 開頭變量
SHOW GLOBAL VARIABLES LIKE 'max_connection%'; -- 只看全局
SHOW SESSION VARIABLES LIKE 'sort_buffer%'; -- 只看當前會話
避坑: 單引號不可漏、大小寫不敏感、前後空格會導致無結果(' date%' ≠ 'date%')。
| 維度 | 全局變量 (GLOBAL) | 會話變量 (SESSION) |
|---|---|---|
| 作用域 | 影響整個服務器所有後續連接 | 僅影響當前連接 |
| 初始化 | 啟動時讀配置文件/命令行參數 | 連接時複製全局值 |
| 修改權限 | 需 SUPER 權限 | 無特殊權限要求 |
| 修改語法 | SET GLOBAL var=val; / SET @@GLOBAL.var=val; | SET SESSION var=val; / SET @@SESSION.var=val; |
| 生效對象 | 修改後新建連接生效,現有連接不受影響 | 當前連接立即生效 |
| 持久化 | 需同步寫入配置文件(my.cnf),重啟後保持 | 連接斷開即失效,不持久化 |
決策原則: 業務統一標準(時區、字符集、SQL_MODE)用全局;個性化調試、臨時優化用會話。
SET GLOBAL 後,只對新連接生效。測試方法:開新會話驗證 → 確認無誤 → 低峰期逐步斷開舊連接(或應用端重連)。innodb_buffer_pool_size)為只讀,運行時不可修改,必須改配置重啟。my.cnf,記錄「變更原因、時間、變更前後值、影響範圍、回滾方案」。time_zone / system_time_zone:統一時區,避免跨時區業務時間混亂。sql_mode:嚴格模式(STRICT_TRANS_TABLES、ONLY_FULL_GROUP_BY)提升數據質量。character_set_server / collation_server:統一字符集,防止亂碼。max_connections / thread_cache_size:應對連接風暴。sort_buffer_size / join_buffer_size:按會話調優複雜查詢(慎用全局大值)。變量調優核心三步:SHOW 精準定位 → GLOBAL/SESSION 正確選擇 → 灰度驗證 + 配置持久化。把「不重啟生效」的便利轉化為「可控、可追溯、可回滾」的工程能力,才是高級 DBA 的分水嶺。