文件首頁
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 使用系統變數

MySQL 伺服器維護許多組態其操作的系統變數。第 7.1.8 節,「伺服器系統變數」描述了這些變數的意義。每個系統變數都有預設值。系統變數可以在伺服器啟動時,使用命令列上的選項或選項檔案進行設定。大多數系統變數可以在伺服器執行時,透過 SET 陳述式動態變更,這讓您可以在不用停止並重新啟動伺服器的情況下修改伺服器的操作。您也可以在運算式中使用系統變數值。

許多系統變數是內建的。系統變數也可以透過伺服器外掛程式或元件安裝。

  • 伺服器外掛程式實作的系統變數會在安裝外掛程式時公開,並且名稱會以外掛程式名稱開頭。例如,audit_log 外掛程式實作一個名為 audit_log_policy 的系統變數。

  • 元件實作的系統變數會在安裝元件時公開,並且名稱會以元件特定的前綴開頭。例如,log_filter_dragnet 錯誤日誌篩選器元件實作一個名為 log_error_filter_rules 的系統變數,其完整名稱為 dragnet.log_error_filter_rules。若要參照此變數,請使用完整名稱。

系統變數存在兩個範圍。全域變數會影響伺服器的整體操作。連線變數會影響個別用戶端連線的操作。一個給定的系統變數可以同時具有全域和連線值。全域和連線系統變數的關聯如下:

  • 伺服器啟動時,會將每個全域變數初始化為其預設值。這些預設值可以使用命令列上或選項檔案中指定的選項進行變更。(請參閱第 6.2.2 節,「指定程式選項」。)

  • 伺服器也會為每個連線的用戶端維護一組會期變數。用戶端的會期變數會在連線時使用對應的全域變數的目前值進行初始化。例如,用戶端的 SQL 模式由會期 sql_mode 值控制,該值會在用戶端連線時初始化為全域 sql_mode 值。

    對於某些系統變數,會期值不會從對應的全域值初始化;如果發生這種情況,會在變數描述中註明。

系統變數值可以在伺服器啟動時透過使用命令列上的選項或選項檔案來全域設定。在啟動時,系統變數的語法與命令選項的語法相同,因此在變數名稱中,破折號和底線可以互換使用。例如,--general_log=ON--general-log=ON 是等效的。

當您使用啟動選項來設定採用數值的變數時,可以在值後加上 KMGTPE 的後綴(大小寫皆可),表示乘以 1024、10242、10243、10244、10245 或 10246;也就是分別表示千位元組、百萬位元組、十億位元組、兆位元組、拍位元組或艾位元組的單位。因此,以下命令啟動伺服器時,排序緩衝區大小為 256 千位元組,最大封包大小為 1 十億位元組

mysqld --sort-buffer-size=256K --max-allowed-packet=1G

在選項檔案中,這些變數的設定方式如下

[mysqld]
sort_buffer_size=256K
max_allowed_packet=1G

後綴字母的大小寫無關緊要;256K256k 是等效的,1G1g 也是。

若要限制系統變數在執行階段使用 SET 陳述式可以設定的最大值,請在伺服器啟動時使用 --maximum-var_name=value 格式的選項來指定此最大值。例如,為了防止 sort_buffer_size 的值在執行階段增加到超過 32MB,請使用選項 --maximum-sort-buffer-size=32M

許多系統變數是動態的,可以使用 SET 陳述式在執行階段進行變更。如需清單,請參閱第 7.1.9.2 節,「動態系統變數」。若要使用 SET 變更系統變數,請依名稱參照它,可選擇性地加上修飾詞。在執行階段,系統變數名稱必須使用底線而非破折號來寫入。以下範例簡要說明此語法

  • 設定全域系統變數

    SET GLOBAL max_connections = 1000;
    SET @@GLOBAL.max_connections = 1000;
  • 將全域系統變數保存到 mysqld-auto.cnf 檔案(並設定執行階段值)

    SET PERSIST max_connections = 1000;
    SET @@PERSIST.max_connections = 1000;
  • 將全域系統變數保存到 mysqld-auto.cnf 檔案(但不設定執行階段值)

    SET PERSIST_ONLY back_log = 1000;
    SET @@PERSIST_ONLY.back_log = 1000;
  • 設定會期系統變數

    SET SESSION sql_mode = 'TRADITIONAL';
    SET @@SESSION.sql_mode = 'TRADITIONAL';
    SET @@sql_mode = 'TRADITIONAL';

如需關於 SET 語法的完整詳細資訊,請參閱第 15.7.6.1 節,「SET 變數指派語法」。如需設定和保存系統變數的權限需求的說明,請參閱第 7.1.9.1 節,「系統變數權限」

指定值乘數的後綴可以在伺服器啟動時設定變數時使用,但不能在執行階段使用 SET 設定值。另一方面,使用 SET 時,您可以使用運算式指派變數的值,當您在伺服器啟動時設定變數時,則不能使用運算式。例如,以下第一行在伺服器啟動時是合法的,但第二行則否

$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024

相反地,以下第二行在執行階段是合法的,但第一行則否

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

若要顯示系統變數名稱和值,請使用 SHOW VARIABLES 陳述式

mysql> SHOW VARIABLES;
+-------------------------------------------------------+----------------------+
| Variable_name                                         | Value                |
+-------------------------------------------------------+----------------------+
| activate_all_roles_on_login                           | OFF                  |
| admin_address                                         |                      |
| admin_port                                            | 33062                |
| admin_ssl_ca                                          |                      |
| admin_ssl_capath                                      |                      |
| admin_ssl_cert                                        |                      |
| admin_ssl_cipher                                      |                      |
| admin_ssl_crl                                         |                      |
| admin_ssl_crlpath                                     |                      |
| admin_ssl_key                                         |                      |
| admin_tls_ciphersuites                                |                      |
| admin_tls_version                                     | TLSv1.2,TLSv1.3      |
| authentication_policy                                 | *,,                  |
| auto_generate_certs                                   | ON                   |
| auto_increment_increment                              | 1                    |
| auto_increment_offset                                 | 1                    |
| autocommit                                            | ON                   |
| automatic_sp_privileges                               | ON                   |

...

| version                                               | 8.4.0                |
| version_comment                                       | Source distribution  |
| version_compile_machine                               | x86_64               |
| version_compile_os                                    | Linux                |
| version_compile_zlib                                  | 1.2.13               |
| wait_timeout                                          | 28800                |
| warning_count                                         | 0                    |
| windowing_use_high_precision                          | ON                   |
| xa_detach_on_prepare                                  | ON                   |
+-------------------------------------------------------+----------------------+

使用 LIKE 子句,此陳述式只會顯示符合模式的變數。若要取得特定變數名稱,請使用 LIKE 子句,如下所示

SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';

若要取得名稱符合模式的變數清單,請在 LIKE 子句中使用 % 通配符

SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';

通配符可以在要比對的模式中的任何位置使用。嚴格來說,因為 _ 是一個符合任何單一字元的通配符,您應該將其逸出為 \_ 以完全比對它。實際上,這很少是必要的。

對於 SHOW VARIABLES,如果您既未指定 GLOBAL 也未指定 SESSION,MySQL 會傳回 SESSION 值。

在設定僅限 GLOBAL 的變數時需要 GLOBAL 關鍵字,但在擷取它們時則不需要,這是為了避免未來發生問題

  • 如果刪除與 GLOBAL 變數同名的 SESSION 變數,則具有足夠權限修改全域變數的用戶端可能會意外變更 GLOBAL 變數,而不是只變更其自身會期的 SESSION 變數。

  • 如果新增與 GLOBAL 變數同名的 SESSION 變數,則打算變更 GLOBAL 變數的用戶端可能會發現只變更了其自身的 SESSION 變數。