萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 8.0 持久化全局變量:SET PERSIST 讓配置修改跨重啟生效

前言

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 > 編譯默認值

三、啟用完整內存儀表(診斷 OOM 必備)

預設 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

五、關鍵源碼入口 (8.0.0)

  • sql/persisted_variable.cc/h:核心實現
  • Persisted_variables_cache::load_persist_file():啟動時解析 JSON、合法性校驗、載入內存
  • Persisted_variables_cache::set_persist_options():將變量應用到 Server
  • Persisted_variables_cache::set_variable():SET PERSIST 觸發,更新內存緩存
  • Persisted_variables_cache::flush_to_file():序列化 JSON 寫入 mysqld-auto.cnf(原子寫入:臨時文件 rename)

六、運維最佳實踐

  1. 版本控管:將 mysqld-auto.cnf 納入 GitOps,通過 CI/CD 下發,避免手工 SET PERSIST 導致配置漂移
  2. 只讀變量持久化:SET PERSIST_ONLY 用於 back_log、max_connections 等需重啟生效的變量
  3. 禁用持久化載入:啟動參數 persisted_globals_load=OFF 可跳過 mysqld-auto.cnf,應急恢復時有用
  4. 審計合規:定期導出 performance_schema.variables_info 對比基線,檢測未授權配置變更
  5. 避坑指南:
    • 即使 SET PERSIST 值未實際改變,也會寫入文件(冪等但產生新版本)
    • 只讀變量用 PERSIST_ONLY,否則報錯 ERROR 1238 (HY000): Variable 'xxx' is a read only variable
    • 集群環境下,mysqld-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 習慣。

copyright © 萬盛學電腦網 all rights reserved