萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL8.0新特性之持久化全局參數修改

MySQL8.0新特性之持久化全局參數修改

下面我們來看一篇關於MySQL8.0新特性之持久化全局參數修改,希望這篇文章能夠讓各位理解到MySQL8.0新特性之持久化全局參數吧。

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

copyright © 萬盛學電腦網 all rights reserved