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
是等效的。
當您使用啟動選項來設定一個數值變數時,該數值可以使用 K
、M
、G
、T
、P
或 E
(大小寫皆可)作為後綴,以表示 1024、10242、10243、10244、10245 或 10246 的倍數;也就是分別代表千位元組 (kilobytes)、百萬位元組 (megabytes)、十億位元組 (gigabytes)、兆位元組 (terabytes)、拍位元組 (petabytes) 或艾位元組 (ettabytes) 的單位。因此,以下命令會啟動伺服器,並將排序緩衝區大小設定為 256 千位元組,以及最大封包大小設定為 1 十億位元組。
mysqld --sort-buffer-size=256K --max-allowed-packet=1G
在選項檔案中,這些變數的設定方式如下:
[mysqld]
sort_buffer_size=256K
max_allowed_packet=1G
後綴字母的大小寫並不重要;256K
和 256k
是等效的,1G
和 1g
也是如此。
若要限制系統變數在執行階段使用 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
變數被變更。