文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

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 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_variablessession_variablesvariables_by_threadpersisted_variables 中檢視敏感系統變數的值,發出 SELECT 語句以傳回它們的值,並追蹤連線的會話追蹤器中對它們的變更。沒有此權限的使用者無法檢視或追蹤這些系統變數值。

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