MySQL 8.0 引入 持久化全局變量 特性,解決「動態修改配置重啟後失效」與「雲環境無權修改配置文件」兩大痛點。通過 SET PERSIST 將變量寫入數據目錄下的 mysqld-auto.cnf (JSON 格式),啟動時自動加載,優先級高於 my.cnf。本文詳解語法、底層實現、元數據查詢與運維最佳實踐。
-- 持久化設置(寫入 mysqld-auto.cnf 並即時生效)
SET PERSIST innodb_flush_log_at_trx_commit = 1;
SET PERSIST sync_binlog = 1;
-- 持久化且僅寫文件不即時生效(適用於需重啟生效的只讀變量)
SET PERSIST_ONLY back_log = 200;
-- 恢復默認值(從 mysqld-auto.cnf 移除該配置)
SET PERSIST innodb_flush_log_at_trx_commit = DEFAULT;
-- 重置所有持久化配置
RESET PERSIST;
$ cat /var/lib/mysql/mysqld-auto.cnf
{
"mysql_server": {
"innodb_flush_log_at_trx_commit": "1",
"sync_binlog": "1"
}
}
優先級順序:
命令行參數 > mysqld-auto.cnf > my.cnf > 編譯默認值
預設 performance_schema 僅統計自身內存。需開啟所有 memory/% 儀表:
-- 動態開啟(僅對新分配內存對象生效)
UPDATE performance_schema.setup_instruments
SET enabled = 'YES' WHERE name LIKE 'memory%';
-- 全生命週期統計(需配置文件+重啟)
[mysqld]
performance-schema-instrument='memory/%=COUNTED'
-- 查看所有持久化變量
SELECT * FROM performance_schema.variables_info
WHERE variable_source = 'PERSISTED';
-- 輸出示例
+-----------------+----------------+----------------------------------------+-----------+-----------+
| VARIABLE_NAME | VARIABLE_SOURCE| VARIABLE_PATH | MIN_VALUE | MAX_VALUE |
+-----------------+----------------+----------------------------------------+-----------+-----------+
| sync_binlog | PERSISTED | /var/lib/mysql/mysqld-auto.cnf | 0 | 4294967295|
+-----------------+----------------+----------------------------------------+-----------+-----------+
-- 所有變量來源類型枚舉
-- COMPILED, GLOBAL, SERVER, EXPLICIT, EXTRA, MYSQL_USER, LOGIN, COMMAND_LINE, PERSISTED, DYNAMIC
sql/persisted_variable.cc/h:核心實現Persisted_variables_cache::load_persist_file():啟動時解析 JSON、合法性校驗、載入內存Persisted_variables_cache::set_persist_options():將變量應用到 ServerPersisted_variables_cache::set_variable():SET PERSIST 觸發,更新內存緩存Persisted_variables_cache::flush_to_file():序列化 JSON 寫入 mysqld-auto.cnf(原子寫入:臨時文件 rename)mysqld-auto.cnf 納入 GitOps,通過 CI/CD 下發,避免手工 SET PERSIST 導致配置漂移SET PERSIST_ONLY 用於 back_log、max_connections 等需重啟生效的變量persisted_globals_load=OFF 可跳過 mysqld-auto.cnf,應急恢復時有用performance_schema.variables_info 對比基線,檢測未授權配置變更SET PERSIST 值未實際改變,也會寫入文件(冪等但產生新版本)PERSIST_ONLY,否則報錯 ERROR 1238 (HY000): Variable 'xxx' is a read only variablemysqld-auto.cnf 不隨備份還原自動同步,需額外管理| 場景 | 5.7 及之前 | 8.0+ |
|---|---|---|
| 動態修改持久化 | 手工編輯 my.cnf + 重啟 | SET PERSIST 秒級生效 |
| 雲托管無權改 my.cnf | 無解或工單申請 | SET PERSIST 自助完成 |
| 配置審計 | 對比文件修改時間 | variables_info 表精準溯源 |
SET PERSIST 將 MySQL 配置管理帶入「基礎設施即代碼」時代。結合 performance_schema.variables_info 審計能力,DBA 可實現配置變更的可追溯、可回滾、可自動化。建議所有 8.0 實例納入 GitOps 管理 mysqld-auto.cnf,廢除手工 SET GLOBAL 習慣。