24、MySQL 8.0 5.1.6使用系統變量

MySQL服務器維護許多系統變量,指出它如何配置。第5.1.5節“服務器系統變量”描述了這些變量的含義。每個系統變量都有一個默認值。可以在服務器啓動時使用命令行上的選項或選項文件來設置系統變量。它們中的大多數都可以在服務器通過SET 語句運行時動態更改 ,這使您可以修改服務器的操作,而無需停止並重新啓動它。您也可以在表達式中使用系統變量值。


由服務器組件實現的系統變量在安裝該組件時公開並且具有以組件特定前綴開頭的名稱。例如, log_filter_dragnet錯誤日誌過濾器組件實現了一個名爲的系統變量 log_error_filter_rules,其全名是 dragnet.log_error_filter_rules。要引用此變量,請使用全名。


有兩個系統變量存在的範圍。全局變量影響服務器的整體操作。會話變量影響其對各個客戶端連接的操作。給定的系統變量可以同時具有全局值和會話值。全局和會話系統變量如下所示:


當服務器啓動時,它將每個全局變量初始化爲其默認值。這些默認值可以通過在命令行或選項文件中指定的選項來更改。(請參見 第4.2.3節“指定程序選項”。)


服務器還爲每個連接的客戶端維護一組會話變量。客戶端的會話變量在連接時使用相應全局變量的當前值進行初始化。例如,客戶端的SQL模式由會話sql_mode值控制,該 值在客戶端連接到全局sql_mode值的值時被初始化。


對於某些系統變量,會話值不是從相應的全局值初始化的; 如果是這樣,則在變量描述中指出。


通過使用命令行或選項文件中的選項,可以在服務器啓動時全局設置系統變量值。當您使用啓動選項設置採用數字值的變量時,可以使用後綴“ K, M”或G(大寫或小寫)給出該值,以表示倍數1024,1024 2或1024 3 ; 即分別爲千字節,兆字節或千兆字節的單位。因此,以下命令以InnoDB16兆字節的日誌文件大小和1千兆字節的最大數據包大小啓動服務器:


mysqld --innodb_log_file_size=16M --max_allowed_packet=1G
在選項文件中,這些變量是這樣設置的:


[mysqld]
innodb_log_file_size=16M
max_allowed_packet=1G
後綴字母的信箱無關緊要; 16M和16m是等價的,因爲是1G和1g。


要限制在運行時可以用SET 語句設置系統變量的 最大值,請使用 服務器啓動時表單的選項來指定此最大值 。例如,要防止在運行時增加值 超過32MB,請使用該選項 。 --maximum-var_name=valueinnodb_log_file_size--maximum-innodb_log_file_size=32M


許多系統變量都是動態的,可以在運行時通過使用SET 語句來更改 。有關列表,請參見 第5.1.6.2節“動態系統變量”。要更改系統變量 SET,請按名稱引用它,可選地在前面加上一個修飾符:


要指出一個變量是一個全局變量,在其名稱前面加上GLOBAL關鍵字或 @@global.限定符:


SET GLOBAL max_connections = 1000;
SET @@global.max_connections = 1000;
該SYSTEM_VARIABLES_ADMIN或 SUPER特權需要設置全局變量。


設置全局變量的另一種方法是在PERSIST關鍵字或 @@persist.限定符之前添加其名稱:


SET PERSIST max_connections = 1000;
SET @@persist.max_connections = 1000;
通過此SET語法,您可以在運行時進行配置更改,這種更改在服務器重新啓動時也持續存在 就像 SET GLOBAL, SET PERSIST改變了運行時的變量值,而且還會變量設置一個選項叫文件 mysqld-auto.cnf在數據目錄(替換任何現有的變量設置,如果有一個)。在啓動時,服務器在所有其他選項文件之後處理該文件。該 SYSTEM_VARIABLES_ADMIN或 SUPER權限才能堅持全局變量。


注意
mysqld-auto.cnf文件的 管理應留給服務器,不要手動執行:


刪除文件會導致下次服務器啓動時丟失所有持久設置。(如果您的意圖是不使用這些設置重新配置服務器,則這是允許的。)要刪除文件中的所有設置而不刪除文件本身,請使用以下語句:


RESET PERSIST;
手動更改文件可能導致服務器啓動時出現分析錯誤。在這種情況下,服務器會報告錯誤並退出。如果發生此問題,請啓動服務器並 persisted_globals_load 禁用系統變量或使用 --no-defaults選項。或者,刪除mysqld-auto.cnf文件,但如前所述,刪除此文件會導致所有持久設置丟失。


如果插件在SET PERSIST執行時被安裝,插件變量可以被持久化。如果插件仍然安裝,持久化插件變量的分配將對後續服務器重新啓動生效。如果插件不再安裝,則當服務器讀取mysqld-auto.cnf文件時,插件變量將不存在。在這種情況下,服務器向錯誤日誌寫入警告並繼續:


currently unknown variable 'var_name'
was read from the persisted config file
該PERSIST_ONLY關鍵字或 @@persist_only.限定類似於 PERSIST:


SET PERSIST_ONLY back_log = 1000;
SET @@persist_only.back_log = 1000;
像PERSIST, PERSIST_ONLY寫入變量設置 mysqld-auto.cnf。但是,不像 PERSIST,PERSIST_ONLY 不會修改運行時全局系統變量值,使其適用於配置只能在服務器啓動時設置的只讀系統變量。該 PERSIST_RO_VARIABLES_ADMIN 特權需要使用PERSIST_ONLY。


該mysqld-auto.cnf文件使用這樣的格式(稍微重新格式化):


{
  "Version": 1,
  "mysql_server": {
    "max_connections": {
      "Value": "152",
      "Metadata": {
        "Timestamp": 1.519921356e+15,
        "User": "root",
        "Host": "localhost"
      }
    },
    "transaction_isolation": {
      "Value": "READ-COMMITTED",
      "Metadata": {
        "Timestamp": 1.519921553e+15,
        "User": "root",
        "Host": "localhost"
      }
    },
    "mysql_server_static_options": {
      "innodb_api_enable_mdl": {
        "Value": "0",
        "Metadata": {
          "Timestamp": 1.519921573e+15,
          "User": "root",
          "Host": "localhost"
        }
      },
      "log_slave_updates": {
        "Value": "1",
        "Metadata": {
          "Timestamp": 1.519921582e+15,
          "User": "root",
          "Host": "localhost"
        }
      }
    }
  }
}
只有只讀變量持續使用 PERSIST_ONLY寫入該 "mysql_server_static_options"部分。"mysql_server_static_options"服務器啓動時,該部分內的所有變量都會 附加到命令行中。通過執行SET GLOBAL語句來設置所有剩餘的持久變量 。


要指出變量是會話變量,請在其名稱前面加上SESSION關鍵字或者 @@session.或者@@ 限定符:


SET SESSION sql_mode = 'TRADITIONAL';
SET @@session.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';
設置會話變量通常不需要特殊權限,但有例外情況需要 SYSTEM_VARIABLES_ADMIN或 SUPER特權(例如 sql_log_bin)。客戶端可以更改自己的會話變量,但不能更改其他客戶端的會話變量。


僅會話系統變量不能被保存。它們不能在服務器啓動時設置,所以沒有理由列出它們mysqld-auto.cnf。


LOCAL並且@@local.是同義詞SESSION和 @@session.。


如果不存在修飾符,則 SET 更改會話變量。


在這些情況下發生錯誤:


在設置僅具有會話值的變量時 使用SET GLOBAL(或@@global.), SET PERSIST(或@@persist.)或 SET PERSIST_ONLY(或 @@persist_only.)


mysql> SET GLOBAL sql_log_bin = ON;
ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION
variable and can't be used with SET GLOBAL
設置僅具有全局值的變量時 省略GLOBAL(或 @@global.),PERSIST (或@@persist.)或 PERSIST_ONLY(或 @@persist_only.):


mysql> SET max_connections = 1000;
ERROR 1229 (HY000): Variable 'max_connections' is a
GLOBAL variable and should be set with SET GLOBAL
在設置僅具有全局值的變量時 使用SET SESSION(或@@SESSION.):


mysql> SET SESSION max_connections = 1000;
ERROR 1229 (HY000): Variable 'max_connections' is a
GLOBAL variable and should be set with SET GLOBAL
前面的修飾符只適用於系統變量。嘗試將它們應用於用戶定義的變量,存儲過程或函數參數或存儲的程序局部變量時發生錯誤。


一個SET 語句可以包含多個變量賦值,用逗號分隔。該語句將值分配給用戶定義的變量和系統變量:


SET @x = 1, SESSION sql_mode = '';
如果設置多個系統變量,最近一段時間 GLOBAL,PERSIST, PERSIST_ONLY,或SESSION 在語句修飾用於以下有沒有指定的組合分配。


多變量賦值的例子:


SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@global.sort_buffer_size = 1000000, @@local.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
如果語句中的任何變量賦值 SET 失敗,則整個語句將失敗,並且不會更改變量,也不會mysqld-auto.cnf更改文件。


如果更改了會話系統變量,則該值將在會話中保持有效,直到您將變量更改爲不同的值或會話結束。該更改對其他會話沒有影響。


如果更改全局系統變量,則會將該值記住並用於新會話,直到將該變量更改爲其他值或服務器退出。任何訪問全局變量的客戶端都可以看到該更改。但是,更改僅影響更改後連接的客戶端的相應會話變量。全局變量更改不影響任何當前客戶端會話的會話變量(甚至不包括SET GLOBAL 發生該語句的會話 )。


要使全局系統變量設置爲永久性的,以便它適用於跨服務器重新啓動,請修改它 SET PERSIST或PERSIST_ONLY 將其記錄在mysqld-auto.cnf文件中。也可以使用SET GLOBAL和手動修改my.cnf 文件,但這更麻煩,並且手動輸入設置中的錯誤可能直到很晚纔會被發現。 SET PERSIST或者PERSIST_ONLY更方便,並避免錯誤設置的可能性。


性能模式 persisted_variables表爲該mysqld-auto.cnf文件提供了一個SQL接口,使其能夠在運行時使用SELECT語句來檢查其內容 。請參見 第26.11.13.1節“性能模式persisted_variables表”。


Performance Schema variables_info 表格包含顯示最近設置每個系統變量的時間和用戶的信息。請參見 第26.11.13.2節“性能模式變量_信息表”。


要將GLOBAL編譯的MySQL默認值或SESSION變量的GLOBAL值設置爲當前對應值,請將變量設置爲該值DEFAULT。例如,以下兩個語句在將會話值設置max_join_size爲當前全局值時是相同的:


SET @@session.max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
並非所有系統變量都可以設置爲DEFAULT。在這種情況下,將DEFAULT結果分配給錯誤。


使用SET PERSIST(或@@persist.),將全局變量設置爲DEFAULT或設置爲其默認值時,會將該變量的默認值分配給該變量,併爲該變量添加一個設置mysqld-auto.cnf。要從文件中刪除變量,請使用 RESET PERSIST。


嘗試分配DEFAULT 給用戶定義變量,存儲過程或函數參數或存儲的程序局部變量時發生錯誤。


要在表達式中引用系統變量的值,請使用其中一個@@-modifiers(除非 @@persist.表達式中不允許)。例如,您可以SELECT像這樣在一個語句中檢索值 :


SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;
爲了引用表達式中的系統變量 (而不是or ),MySQL會返回會話值(如果存在的話),否則返回全局值。這不同於 ,它總是指會話值。 @@var_name@@global.@@session.SET @@var_name = expr


在服務器啓動時設置變量時,可以使用用於指定值乘數的後綴,但不要SET 在運行時設置值。另一方面, SET您可以使用表達式分配變量的值,當您在服務器啓動時設置變量時,這不是真的。例如,下列第一行在服務器啓動時是合法的,但第二行不是:


shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024
相反,下面的第二行在運行時是合法的,但第一行不是:


mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
注意
某些系統變量可以SET 通過將它們設置爲ON或 來啓用 語句1,或者通過將它們設置爲OFF或來禁用它們 0。但是,要在命令行或選項文件中設置此類變量,必須將其設置爲1或0; 設置它ON或OFF 不會工作。例如,在命令行上, --delay_key_write=1工作但 --delay_key_write=ON沒有。


要顯示系統變量名稱和值,請使用以下 SHOW VARIABLES語句:


mysql> SHOW VARIABLES;
+---------------------------------+-----------------------------------+
| Variable_name                   | Value                             |
+---------------------------------+-----------------------------------+
| auto_increment_increment        | 1                                 |
| auto_increment_offset           | 1                                 |
| automatic_sp_privileges         | ON                                |
| back_log                        | 151                               |
| basedir                         | /home/mysql/                      |
| binlog_cache_size               | 32768                             |
| bulk_insert_buffer_size         | 8388608                           |
| character_set_client            | utf8                              |
| character_set_connection        | utf8                              |
| character_set_database          | utf8mb4                           |
| character_set_filesystem        | binary                            |
| character_set_results           | utf8                              |
| character_set_server            | utf8mb4                           |
| character_set_system            | utf8                              |
| character_sets_dir              | /home/mysql/share/mysql/charsets/ |
| collation_connection            | utf8_general_ci                   |
| collation_database              | utf8mb4_0900_ai_ci                |
| collation_server                | utf8mb4_0900_ai_ci                |
...
| innodb_autoextend_increment     | 8                                 |
| innodb_buffer_pool_size         | 8388608                           |
| innodb_commit_concurrency       | 0                                 |
| innodb_concurrency_tickets      | 500                               |
| innodb_data_file_path           | ibdata1:10M:autoextend            |
| innodb_data_home_dir            |                                   |
...
| version                         | 8.0.1-dmr-log                     |
| version_comment                 | Source distribution               |
| version_compile_machine         | i686                              |
| version_compile_os              | suse-linux                        |
| wait_timeout                    | 28800                             |
+---------------------------------+-----------------------------------+
使用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返回SESSION值。


GLOBAL在設置GLOBAL-only變量時 要求使用關鍵字的原因是,在檢索它們時不要使用關鍵字以防止將來出現問題:


被我們刪除SESSION具有相同名稱作爲變量GLOBAL變量,客戶端與 SYSTEM_VARIABLES_ADMIN或 SUPER特權可能會意外地改變GLOBAL變量,而不僅僅是SESSION爲它的連接變量。


如果我們要添加一個SESSION與變量名稱相同的GLOBAL變量,那麼打算更改該GLOBAL變量的客戶端可能只會找到自己的SESSION變量。本文由:學什麼技術好網翻譯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章