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;也就是分別表示千位元組、百萬位元組、十億位元組、兆位元組、拍位元組或艾位元組的單位。因此,以下命令啟動伺服器時,排序緩衝區大小為 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
變數。