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
效能結構描述 persisted_variables
表格提供 mysqld-auto.cnf
檔案的 SQL 介面,可讓您使用 SELECT
陳述式在執行階段檢查其內容。請參閱 第 29.12.14.1 節「效能結構描述 persisted_variables 表格」。
效能結構描述 variables_info
表格包含資訊,顯示每個系統變數最近一次設定的時間和使用者。請參閱 第 29.12.14.2 節「效能結構描述 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 8.4 具備安全儲存包含敏感資料 (例如私密金鑰或密碼) 的保存系統變數值的功能,並限制檢視這些值。目前沒有 MySQL Server 系統變數標記為敏感,但此功能允許在未來安全地保存包含敏感資料的系統變數。舊版 MySQL Server 無法讀取 MySQL 8.4 建立的 mysqld-auto.cnf
選項檔案。
必須在 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
語句以返回它們的值,並在連線的 Session 追蹤器中追蹤對它們的變更。沒有此權限的使用者無法檢視或追蹤這些系統變數值。
如果對敏感系統變數發出 SET
語句,則會將查詢重寫,在將其記錄到一般日誌和稽核日誌之前,將值替換為 「<redacted>
」。即使伺服器執行個體上沒有透過金鑰環元件進行安全儲存,也會發生這種情況。