MySQL 伺服器維護設定其運作方式的系統變數。系統變數可以具有影響伺服器整體運作的全域值、影響目前連線的工作階段值,或兩者都有。許多系統變數是動態的,可以使用 SET
陳述式在執行階段變更,以影響目前伺服器執行個體的運作。SET
也可以用來將某些全域系統變數持久化到資料目錄中的 mysqld-auto.cnf
檔案,以影響後續啟動的伺服器運作。RESET PERSIST
從 mysqld-auto.cnf
中移除持久化設定。
以下討論描述持久化系統變數的各個方面
在執行階段持久化全域系統變數的功能,可讓伺服器組態在伺服器啟動後仍能持續存在。儘管可以使用 my.cnf
選項檔案,或在執行階段使用 SET
陳述式在啟動時設定許多系統變數,但這些設定伺服器的方法都需要登入伺服器主機的權限,或者無法在執行階段或遠端持續設定伺服器
修改選項檔案需要直接存取該檔案,這需要登入 MySQL 伺服器主機的權限。這並非總是方便的。
使用
SET GLOBAL
修改系統變數是可以在執行階段進行的功能,可以從本機執行的客戶端或遠端主機進行,但變更僅影響目前正在執行的伺服器實例。這些設定不是持久性的,也不會延續到後續的伺服器啟動。
為了增強伺服器配置的管理功能,使其超越編輯選項檔案或使用 SET GLOBAL
所能實現的範圍,MySQL 提供了 SET
語法的變體,可將系統變數設定持久化到資料目錄中名為 mysqld-auto.cnf
的檔案中。範例:
SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;
SET PERSIST_ONLY back_log = 100;
SET @@PERSIST_ONLY.back_log = 100;
MySQL 還提供了 RESET PERSIST
語句,用於從 mysqld-auto.cnf
中移除持久化的系統變數。
透過持久化系統變數執行的伺服器配置具有以下特性:
持久化的設定是在執行階段進行的。
持久化的設定是永久性的。它們會在伺服器重新啟動後繼續生效。
持久化的設定可以從本機客戶端或從遠端主機連線的客戶端進行。這提供了從中央客戶端主機遠端配置多個 MySQL 伺服器的便利性。
若要持久化系統變數,您不需要登入 MySQL 伺服器主機或存取選項檔案的檔案系統權限。持久化設定的能力是透過 MySQL 權限系統控制的。請參閱 第 7.1.9.1 節,「系統變數權限」。
具有足夠權限的管理員可以透過持久化系統變數來重新配置伺服器,然後執行
RESTART
語句,使伺服器立即使用變更後的設定。持久化的設定提供有關錯誤的立即回饋。手動輸入設定中的錯誤可能要到很久以後才會被發現。
SET
語句持久化系統變數避免了設定格式錯誤的可能性,因為語法錯誤的設定不會成功,也不會變更伺服器配置。
這些 SET
語法選項可用於持久化系統變數:
若要將全域系統變數持久化到資料目錄中的
mysqld-auto.cnf
選項檔案,請在變數名稱前加上PERSIST
關鍵字或@@PERSIST.
限定詞。SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
與
SET GLOBAL
類似,SET PERSIST
設定全域變數的執行階段值,也會將變數設定寫入mysqld-auto.cnf
檔案 (如果存在,則會取代任何現有的變數設定)。若要將全域系統變數持久化到
mysqld-auto.cnf
檔案,而無需設定全域變數執行階段值,請在變數名稱前加上PERSIST_ONLY
關鍵字或@@PERSIST_ONLY.
限定詞。SET PERSIST_ONLY back_log = 1000; SET @@PERSIST_ONLY.back_log = 1000;
與
PERSIST
類似,PERSIST_ONLY
會將變數設定寫入mysqld-auto.cnf
。但是,與PERSIST
不同,PERSIST_ONLY
不會修改全域變數執行階段值。這使得PERSIST_ONLY
適用於配置只能在伺服器啟動時設定的唯讀系統變數。
有關 SET
的更多資訊,請參閱 第 15.7.6.1 節,「SET 語法變數指派」。
這些 RESET PERSIST
語法選項可用於移除持久化的系統變數:
若要從
mysqld-auto.cnf
中移除所有持久化的變數,請使用RESET PERSIST
,而不需命名任何系統變數。RESET PERSIST;
若要從
mysqld-auto.cnf
中移除特定的持久化變數,請在語句中命名它。RESET PERSIST system_var_name;
這包括外掛程式系統變數,即使目前未安裝該外掛程式。如果檔案中不存在該變數,則會發生錯誤。
若要從
mysqld-auto.cnf
中移除特定的持久化變數,但如果檔案中不存在該變數時產生警告而不是錯誤,請將IF EXISTS
子句新增至先前的語法。RESET PERSIST IF EXISTS system_var_name;
有關 RESET PERSIST
的更多資訊,請參閱 第 15.7.8.7 節,「RESET PERSIST 語句」。
使用 SET
將全域系統變數持久化為 DEFAULT
值或其文字預設值,會將變數指派為其預設值,並為 mysqld-auto.cnf
中的變數新增設定。若要從檔案中移除該變數,請使用 RESET PERSIST
。
某些系統變數無法持久化。請參閱 第 7.1.9.4 節,「不可持久化和持久化限制的系統變數」。
如果在外掛程式執行 SET
語句時已安裝,則可持久化外掛程式實作的系統變數。如果外掛程式仍然安裝,則持久化的外掛程式變數的指派會在後續伺服器重新啟動時生效。如果不再安裝外掛程式,則當伺服器讀取 mysqld-auto.cnf
檔案時,該外掛程式變數不存在。在此情況下,伺服器會將警告寫入錯誤日誌並繼續執行。
currently unknown variable 'var_name'
was read from the persisted config file
Performance Schema persisted_variables
資料表提供 mysqld-auto.cnf
檔案的 SQL 介面,使其內容可以在執行階段使用 SELECT
語句進行檢查。請參閱 第 29.12.14.2 節,「Performance Schema persisted_variables 資料表」。
Performance Schema variables_info
資料表包含資訊,顯示每個系統變數最近一次設定的時間和使用者。請參閱 第 29.12.14.3 節,「Performance Schema variables_info 資料表」。
RESET PERSIST
會影響 persisted_variables
資料表的內容,因為資料表內容對應於 mysqld-auto.cnf
檔案的內容。另一方面,由於 RESET PERSIST
不會變更變數值,因此在伺服器重新啟動之前,它不會影響 variables_info
資料表的內容。
mysqld-auto.cnf
檔案使用如下的 JSON
格式 (為了方便閱讀,略微重新格式化)
{
"Version": 1,
"mysql_server": {
"max_connections": {
"Value": "152",
"Metadata": {
"Timestamp": 1519921341372531,
"User": "root",
"Host": "localhost"
}
},
"transaction_isolation": {
"Value": "READ-COMMITTED",
"Metadata": {
"Timestamp": 1519921553880520,
"User": "root",
"Host": "localhost"
}
},
"mysql_server_static_options": {
"innodb_api_enable_mdl": {
"Value": "0",
"Metadata": {
"Timestamp": 1519922873467872,
"User": "root",
"Host": "localhost"
}
},
"log_replica_updates": {
"Value": "1",
"Metadata": {
"Timestamp": 1519925628441588,
"User": "root",
"Host": "localhost"
}
}
}
}
}
啟動時,伺服器會在所有其他選項檔案之後處理 mysqld-auto.cnf
檔案 (請參閱 第 6.2.2.2 節,「使用選項檔案」)。伺服器按如下方式處理檔案內容:
如果停用
persisted_globals_load
系統變數,伺服器會忽略mysqld-auto.cnf
檔案。"mysql_server_static_options"
區段包含使用SET PERSIST_ONLY
持久化的唯讀變數。此區段也可能包含某些非唯讀的動態變數 (儘管其名稱如此)。此區段中的所有變數都會附加到命令列,並與其他命令列選項一起處理。所有剩餘的持久化變數會在稍後透過執行等效於
SET GLOBAL
語句的方式設定,就在伺服器開始接聽客戶端連線之前。因此,這些設定直到啟動過程的後期才會生效,這可能不適合某些系統變數。最好在my.cnf
中設定此類變數,而不是在mysqld-auto.cnf
中設定。
對 mysqld-auto.cnf
檔案的管理應留給伺服器處理。對檔案的操作應僅使用 SET
和 RESET PERSIST
語句進行,而不是手動進行。
移除檔案會導致下次伺服器啟動時遺失所有持久化的設定。(如果您的目的是在沒有這些設定的情況下重新配置伺服器,這是允許的。) 若要移除檔案中的所有設定而不移除檔案本身,請使用此語句:
RESET PERSIST;
手動變更檔案可能會導致伺服器啟動時發生剖析錯誤。在這種情況下,伺服器會報告錯誤並退出。如果發生此問題,請停用
persisted_globals_load
系統變數,或使用--no-defaults
選項來啟動伺服器。或者,移除mysqld-auto.cnf
檔案。但是,如先前所述,移除此檔案會導致遺失所有持久化的設定。
MySQL 9.0 具備安全儲存包含敏感資料(例如私鑰或密碼)的持久化系統變數值,並限制檢視這些值的能力。目前沒有任何 MySQL Server 系統變數被標記為敏感,但此功能允許未來將包含敏感資料的系統變數安全地持久化儲存。由 MySQL 9.0 建立的 mysqld-auto.cnf
選項檔案無法被較舊版本的 MySQL Server 讀取。
必須在 MySQL Server 執行個體上啟用金鑰環元件,才能支援持久化系統變數值的安全儲存,而非金鑰環外掛程式,後者不支援此功能。請參閱第 8.4.4 節「MySQL 金鑰環」。
在 mysqld-auto.cnf
選項檔案中,敏感系統變數的名稱和值會以加密格式儲存,同時還會儲存一個產生的檔案金鑰,用於解密它們。產生的檔案金鑰又會使用儲存在金鑰環中的主金鑰 (persisted_variables_key
) 進行加密。當伺服器啟動時,會解密並使用持久化的敏感系統變數。預設情況下,如果選項檔案中存在加密值,但在啟動時無法成功解密,則會使用其預設設定。可選的最安全設定會使伺服器在無法解密加密值時停止啟動。
系統變數 persist_sensitive_variables_in_plaintext
控制伺服器是否允許以未加密格式儲存敏感系統變數的值,如果在使用 SET PERSIST
設定值時,金鑰環元件支援不可用。它還控制伺服器是否可以在無法解密加密值時啟動。
預設設定為
ON
,如果金鑰環元件支援可用,則會加密這些值,如果不可用,則會以未加密方式持久化它們(並發出警告)。下次設定任何持久化的系統變數時,如果當時金鑰環支援可用,伺服器會加密任何未加密的敏感系統變數的值。ON
設定還允許伺服器在無法解密加密的系統變數值時啟動,在這種情況下,會發出警告,並使用系統變數的預設值。在這種情況下,除非它們可以被解密,否則它們的值無法更改。最安全的設定為
OFF
,表示如果金鑰環元件支援不可用,則無法持久化敏感系統變數值。OFF
設定還表示如果無法解密加密的系統變數值,伺服器將不會啟動。
權限 SENSITIVE_VARIABLES_OBSERVER
允許持有者在 Performance Schema 表格 global_variables
、session_variables
、variables_by_thread
和 persisted_variables
中檢視敏感系統變數的值,發出 SELECT
語句以傳回它們的值,並追蹤連線的會話追蹤器中對它們的變更。沒有此權限的使用者無法檢視或追蹤這些系統變數值。
如果針對敏感系統變數發出 SET
語句,則查詢會被重寫,以將值替換為 「<redacted>
」,然後再將其記錄到一般日誌和稽核日誌中。即使伺服器執行個體上沒有可透過金鑰環元件進行安全儲存的功能,也會發生這種情況。