PS: 本文內容基於MySQL8.0.0版本,由於目前才Release了第一個開發版本,不排除後續行為會發生變化
相信很多朋友都有這樣的體驗,在實例啟動的時候動態修改了某些配置,但是忘了修改配置文件,結果實例一重啟修改就丟失了。或者對於諸如部署在雲上的業務(例如RDS),通常用戶是沒有修改配置文件的權限的,這導致配置的設定不夠靈活。從MySQL8.0開始,大家不用擔心這個問題了,用戶可以選擇性的將配置進行持久化。
對應的Worklog: WL#8688
啟用這個功能,使用特定的語法SET PERSIST來設定任意可動態修改的全局變量,例如:
mysql> SET PERSIST innodb_flush_log_at_trx_commit = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SET PERSIST sync_binlog = 1;
Query OK, 0 rows affected (0.00 sec)
此時檢查默認的my.cnf文件並沒有發生任何修改,但是數據目錄下,多了個和之前MySQL版本不一樣的文件:
$ls -lh mysqld-auto.cnf
-rw-r----- 1 zhaiwx users 81 Sep 17 18:09 mysqld-auto.cnf
文件的格式是JSON存儲的,因此可以直接用內置的解析器進行解析
$cat mysqld-auto.cnf
{ "mysql_server": {"innodb_flush_log_at_trx_commit": "1" , "sync_binlog": "1" } }
mysqld-auto.cnf文件中的配置相比my.cnf文件具有高優先級,如果相同配置出現在兩個文件中,就以mysqld-auto.cnf文件中的記錄為主。
注意,即使你通過SET PERSIST修改配置的值並沒有任何變化,也會寫入到mysqld-auto.cnf文件中。但你可以通過設置成default值的方式將其從mysqld-auto.cnf文件中移走:
mysql> SET PERSIST innodb_flush_log_at_trx_commit = DEFAULT;
Query OK, 0 rows affected (0.00 sec)
=====
$cat mysqld-auto.cnf
{ "mysql_server": {"sync_binlog": "1" } }
你可以通過新的PS表performance_schema.variables_info來確定配置項的值的來源,共有幾類:
enum enum_variable_source
{
COMPILED= 1,
GLOBAL,
SERVER,
EXPLICIT,
EXTRA,
MYSQL_USER,
LOGIN,
COMMAND_LINE,
PERSISTED,
DYNAMIC
};
系統表相關代碼:storage/perfschema/table_variables_info.cc
==================
mysql> select * from performance_schema.variables_info where variable_source = 'PERSISTED'\G
*************************** 1. row ***************************
VARIABLE_NAME: sync_binlog
VARIABLE_SOURCE: PERSISTED
VARIABLE_PATH: /u01/my80/data/mysqld-auto.cnf
MIN_VALUE: 0
MAX_VALUE: 4294967295
1 row in set (0.00 sec)
如果你不想讓mysqld-auto.cnf中的配置生效,可以在啟動時關閉只讀參數persisted_globals_load,這樣在啟動時就不會載入mysqld-auto.cnf中的配置項了。
主要代碼:
Commit f2bc0f89b7f94cc8fe963d08157413a01d14d994
主要入口函數(8.0.0):
接口函數大多定義在sql/persisted_variable.cc文件中:
啟動時載入mysqld-auto.cnf的內容: Persisted_variables_cache::load_persist_file(); 通過json解析合法性,並存入內存
將文件中讀取的配置進行設置: Persisted_variables_cache::set_persist_options
運行SET PERSIST命令時,調用Persisted_variables_cache::set_variable 更新內存中存儲的值
寫入mysqld-auto.cnf文件中: Persisted_variables_cache::flush_to_file