您好,登錄后才能下訂單哦!
這篇文章介紹的是MySQL 5.6中的變量,基本是我以前學習MySQL 5.6手冊時整理而來。
MySQL中的變量可分為以下幾種:
1、 MySQL系統(tǒng)變量:該類型變量反映了MySQL服務器是如何配置的。每一個系統(tǒng)變量都有一個默認值。系統(tǒng)變量可以在MySQL配置文件中進行設(shè)置,或使用MySQL啟動選項進行設(shè)置。大多數(shù)系統(tǒng)變量都可以在MySQL運行時使用SET命令進行動態(tài)修改。
2、 MySQL狀態(tài)變量:該類型變量反映了MySQL服務器的運行狀態(tài)。
變量按作用范圍可分為:
1、 全局變量(global):對MySQL服務器全局生效。
2、 會話變量(session):僅對單個客戶端會話有影響。
有些MySQL選項只有全局變量或會話變量,而有些則同時有全局變量和會話變量。全局和會話變量的關(guān)聯(lián)是這樣的:
1、 當MySQL服務啟動時,它會初始每一個全局變量為默認值。這個默認值可以在配置文件中或使用MySQL啟動選項進行修改。
2、 MySQL也會為每一個客戶端連接維護一個會話變量集。當客戶端連接MySQL服務時,它所有的會話變量都會初始化為相應全局變量的當前值。對于少數(shù)系統(tǒng)變量,它的會話值可能不會被初始化為相應全局變量的值,具體可查詢MySQL官方手冊。
系統(tǒng)變量根據(jù)是否可動態(tài)修改(dynamic),分為:
動態(tài)變量:可動態(tài)修改變量的值。修改后無需重啟MySQL服務即可生效。
非動態(tài)變量:不可動態(tài)修改變量的值。修改后需重啟MySQL服務才可生效。
完整的變量屬性列表可以在MySQL參考手冊中查詢得到。比如,可以了解到某一個變量是系統(tǒng)變量還是狀態(tài)變量,是全局變量還是還是變量還是兩種都有,是動態(tài)變量還是非動態(tài)變量。
要查看MySQL的所有默認系統(tǒng)變量值(忽略配置文件中的設(shè)置),使用命令:
[root@gw ~]# mysqld --no-defaults --verbose --help |
要查看MySQL的所有默認系統(tǒng)變量值(讀取配置文件中的設(shè)置后的),使用命令:
[root@gw ~]# mysqld --verbose --help |
SHOW命令查看系統(tǒng)變量的值,語法格式為:
mysql> SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] |
當使用關(guān)鍵字GLOBAL時,是查看所有全局變量的當前值:
mysql> SHOW GLOBAL VARIABLES; |
當不使用關(guān)鍵字或使用關(guān)鍵字SESSION時,是查看所有會話變量的當前值(有會話變量的則顯示當前會話變量的值,沒有的則顯示全局變量的值):
mysql> SHOW VARIABLES; mysql> SHOW SESSION VARIABLES; |
可以加上LIKE語句并使用通配符 % 或 _ 來匹配特定的變量。百分號 % 匹配任意數(shù)量字符,下劃線 _ 匹配單個字符。示例:
mysql> SHOW VARIABLES LIKE 'innodb_buffer%'; mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer%'; |
另外,也可以使用 SELECT 語句來查看系統(tǒng)變量的值。比如:
mysql> SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode; |
對于在表達式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會返回會話變量的值(如果存在),否則會返回全局變量的值。有 @@global. 前綴的是顯式指定查看全局變量的值,有 @@session. 前綴的是顯式指定查看會話變量的值。
SHOW命令查看狀態(tài)變量的值,語法格式為:
mysql> SHOW [GLOBAL | SESSION] STATUS [like_or_where] |
當使用關(guān)鍵字GLOBAL時,顯示的是全局狀態(tài)值。一個全局狀態(tài)變量可能表示的是服務器自身的一些狀態(tài)(比如,Aborted_connects),或者是所有連接會話的聚合狀態(tài)(比如,Bytes_received 和 Bytes_sent)。如果一個變量沒有全局狀態(tài)值,顯示的就是會話狀態(tài)值。
mysql> SHOW GLOBAL STATUS; |
當不使用關(guān)鍵字或使用關(guān)鍵字SESSION時,顯示的是會話狀態(tài)值。如果一個變量沒有會話值,顯示的就是全局狀態(tài)值。LOCAL關(guān)鍵字含義與SESSION相同。
mysql> SHOW STATUS; mysql> SHOW SESSION STATUS; mysql> SHOW LOCAL STATUS; |
使用FLUSH STATUS命令可以將一些狀態(tài)變量的值重置為0:
mysql> FLUSH STATUS; |
要修改系統(tǒng)變量的值,有幾種方式:在MySQL配置文件中修改,使用MySQL啟動選項修改,或在MySQL啟動后使用SET命令動態(tài)修改。每一個變量具體支持哪幾種方式,見MySQL官方手冊中的列表。
在設(shè)置系統(tǒng)變量的值時,變量值為容量大小的,默認單位為字節(jié)(bytes),或者也可以顯式指定單位為K、M、G(大小寫均可,分別表示1024、10242、10243字節(jié))。變量值為文件名的,可以使用絕對路徑名,但如果使用相對路徑,那么路徑是相對于MySQL數(shù)據(jù)目錄。
動態(tài)變量的值可以在MySQL運行時使用SET命令進行修改:
要指明所修改的是一個全局變量,使用 GLOBAL 關(guān)鍵字或加上 @@global. 修飾符。示例:
SET GLOBAL max_connections = 1000; SET @@global.max_connections = 1000; |
要指明所修改的是一個會話變量,使用 SESSION 關(guān)鍵字或加上 @@session. 或 @@ 修飾符。一個客戶端只能修改它自己的會話變量,而不能修改其它客戶端的。示例:
SET SESSION sql_mode = 'TRADITIONAL'; SET @@session.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; |
LOCAL 和 @@local. 與 SESSION 和 @@session. 同義,作用相同。
如果未提供修飾符,SET命令修改的就是會話變量。但如果那個變量沒有會話值,就會報錯:
mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL |
SET命令可以同時設(shè)置多個變量的值,使用逗號分隔開來。示例:
SET @x = 1, SESSION sql_mode = ''; |
同時設(shè)置多個變量時,最接近的GLOBAL或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命令中的某一個變量設(shè)置失敗了,那么整個語句都會失敗,其它變量也就不會被修改。
SET命令修改會話變量的值后,修改對當前會話是即時生效的,直到你將它改為另一個值或當前會話終止。修改不會對其它會話造成影響。修改全局變量的值后,修改也是即時生效的,新的值會被記住并應用于新的會話,直到你將它改為另一個值或MySQL服務關(guān)閉。全局變量的值只會影響相應的會話變量的值,也因此只會對新建會話造成影響,不會對現(xiàn)有會話,甚至不會對執(zhí)行SET GLOBAL語句的當前會話造成影響。為了讓全局變量的值永久生效,你還應該在MySQL配置文件中設(shè)置相應選項的值。
要設(shè)置一個全局變量值為MySQL的默認值,或設(shè)置一個會話變量值為當前對應的全局變量的值,可以將變量的值設(shè)為關(guān)鍵字DEFAULT。比如,下面兩個語句是相同的,都是將會話變量max_join_size的值設(shè)置為當前相應的全局變量的值:
SET @@session.max_join_size=DEFAULT; SET @@session.max_join_size=@@global.max_join_size; |
當然,并不是所有系統(tǒng)變量的值都可以被設(shè)置為DEFAULT,那樣會報錯。不允許將值DEFAULT分配給用戶自定義變量、存儲過程或函數(shù)參數(shù)、或存儲程序的本地變量。
要在表達式中引用系統(tǒng)變量的值,使用其中一個 @@ 修飾符。比如,要在 SELECT 語句中獲取變量的值,可以:
SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode; |
對于在表達式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會返回會話變量的值(如果存在),否則會返回全局變量的值。這與語句 SET @@var_name = expr 是不相同的,那個語句總是設(shè)置的會話變量的值。
MySQL啟動選項中,變量值可以顯式地指定單位K、M或G(不區(qū)分大小寫),但使用SET命令時不行;另一方面,MySQL啟動選項中,變量值不能通過表達式計算活動,而SET命令中則可以。比如,下面第一個是可以的,第二個則不行:
[root@gw ~]# mysql --max_allowed_packet=16M //啟動選項中,這種用法可以 [root@gw ~]# mysql --max_allowed_packet=16*1024*1024 //啟動選項中,這種用法不行 |
相對地,下面第二個是可以的,第一個則不行:
mysql> SET GLOBAL max_allowed_packet=16M; //SET命令中,這種用法不行 mysql> SET GLOBAL max_allowed_packet=16*1024*1024; //SET命令中,這種用法可以 |
SET命令還可以用于設(shè)置自定義變量。在變量名前加上 @ 修飾符,就是表示設(shè)置自定義變量。變量名稱可以由字母、數(shù)字、"."、"_"和"$"組成。當然,在以字符串或者標識符引用時也可以包含其他字符(例如:@'my-var',@"my-var",或者@`my-var`)。
mysql> SET @x = 1; |
自定義變量是會話級別的變量,作用域僅限于當前會話。當前會話終止時,其所有的會話變量將會被釋放,包括自定義變量。使用SELECT命令可以查看自定義變量的值:
mysql> SELECT @x; |
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。