1. 程式人生 > >24、MySQL 8.0 5.1.6使用系統變數

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變數。本文由:
學什麼技術好
網翻譯