文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  持久化系統變數

7.1.9.3 持久化系統變數

MySQL 伺服器維護用於設定其運作方式的系統變數。系統變數可以有一個影響整體伺服器運作的全域值,一個影響目前工作階段的工作階段值,或兩者都有。許多系統變數都是動態的,可以使用 SET 陳述式在執行階段變更,以影響目前伺服器執行個體的運作。SET 也可用於將某些全域系統變數持久化到資料目錄中的 mysqld-auto.cnf 檔案,以影響後續啟動的伺服器運作。RESET PERSISTmysqld-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 GLOBALSET PERSIST 設定全域變數的執行階段值,同時也會將變數設定寫入 mysqld-auto.cnf 檔案 (如果有的話,會取代任何現有的變數設定)。

  • 若要將全域系統變數保存到 mysqld-auto.cnf 檔案,而不設定全域變數的執行階段值,請在變數名稱前面加上 PERSIST_ONLY 關鍵字或 @@PERSIST_ONLY. 限定詞

    SET PERSIST_ONLY back_log = 1000;
    SET @@PERSIST_ONLY.back_log = 1000;

    如同 PERSISTPERSIST_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 檔案的格式和伺服器處理

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 檔案的管理應交由伺服器處理。檔案的操控應僅使用 SETRESET 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_variablessession_variablesvariables_by_threadpersisted_variables 中檢視敏感系統變數的值,發出 SELECT 語句以返回它們的值,並在連線的 Session 追蹤器中追蹤對它們的變更。沒有此權限的使用者無法檢視或追蹤這些系統變數值。

如果對敏感系統變數發出 SET 語句,則會將查詢重寫,在將其記錄到一般日誌和稽核日誌之前,將值替換為 <redacted>。即使伺服器執行個體上沒有透過金鑰環元件進行安全儲存,也會發生這種情況。