DBA 常遇困惑:my.cnf 參數已調整,重啟服務卻不生效。排查半天才發現——改錯文件了。MySQL 允許存在多個配置文件,且有嚴格的讀取優先級,搞不清加載順序是「不生效」的頭號元兇。
MySQL 啟動時會依序讀取以下路徑,後讀取的會覆蓋先讀取的同名參數:
/etc/my.cnf — 全局預設,影響所有實例/etc/mysql/my.cnf — Debian/Ubuntu 系統常用/usr/local/mysql/etc/my.cnf — 源碼編譯安裝預設路徑~/.my.cnf — 當前用戶級,僅影響該用戶啟動的客戶端/服務端/data/mysql/yejr_3306/my.cnf(多實例部署常見)/etc/my.cnf,但實例實際讀取的是 /data/mysql/3306/my.cnf(優先級更高)--defaults-file 或 --defaults-extra-file 參數,覆蓋了默認搜尋路徑| 參數 | 作用 | 典型場景 |
|---|---|---|
--defaults-file=PATH | 僅讀取指定文件,忽略所有其他標準路徑 | 多實例部署,強制隔離配置 |
--defaults-extra-file=PATH | 先按標準順序讀取全局配置,再讀取指定文件覆蓋 | 基礎配置統一,實例級差異化覆蓋 |
最佳實踐: 生產環境多實例部署時,統一使用 --defaults-file 指定實例專屬配置文件,避免路徑搜尋帶來的不確定性。
別信文件內容,信運行時變量:
-- 查看實際生效的配置來源與值 mysql> SHOW VARIABLES LIKE 'max_connections'; mysql> SHOW GLOBAL VARIABLES; -- 全量導出對比
或啟動時加 --verbose --help 查看解析後的默認值:
mysqld --defaults-file=/data/mysql/3306/my.cnf --verbose --help 2>&1 | head -n 100
/etc/mysql/{instance_name}.cnf)--defaults-filesystemctl reload mysqld@3306 → SHOW VARIABLES 驗證 → 記錄變更日誌mysql 用戶可寫,防止誤改搞懂加載順序與優先級機制,配合 --defaults-file 顯式指定,MySQL 配置不生效的幽靈問題將徹底消失。