這篇文章介紹的是MySQL 5.6中的變量,基本是我以前學(xué)習(xí)MySQL 5.6手冊(cè)時(shí)整理而來。
MySQL中的變量可分為以下幾種:
1、 MySQL系統(tǒng)變量:該類型變量反映了MySQL服務(wù)器是如何配置的。每一個(gè)系統(tǒng)變量都有一個(gè)默認(rèn)值。系統(tǒng)變量可以在MySQL配置文件中進(jìn)行設(shè)置,或使用MySQL啟動(dòng)選項(xiàng)進(jìn)行設(shè)置。大多數(shù)系統(tǒng)變量都可以在MySQL運(yùn)行時(shí)使用SET命令進(jìn)行動(dòng)態(tài)修改。
2、 MySQL狀態(tài)變量:該類型變量反映了MySQL服務(wù)器的運(yùn)行狀態(tài)。
變量按作用范圍可分為:
1、 全局變量(global):對(duì)MySQL服務(wù)器全局生效。
2、 會(huì)話變量(session):僅對(duì)單個(gè)客戶端會(huì)話有影響。
有些MySQL選項(xiàng)只有全局變量或會(huì)話變量,而有些則同時(shí)有全局變量和會(huì)話變量。全局和會(huì)話變量的關(guān)聯(lián)是這樣的:
1、 當(dāng)MySQL服務(wù)啟動(dòng)時(shí),它會(huì)初始每一個(gè)全局變量為默認(rèn)值。這個(gè)默認(rèn)值可以在配置文件中或使用MySQL啟動(dòng)選項(xiàng)進(jìn)行修改。
2、 MySQL也會(huì)為每一個(gè)客戶端連接維護(hù)一個(gè)會(huì)話變量集。當(dāng)客戶端連接MySQL服務(wù)時(shí),它所有的會(huì)話變量都會(huì)初始化為相應(yīng)全局變量的當(dāng)前值。對(duì)于少數(shù)系統(tǒng)變量,它的會(huì)話值可能不會(huì)被初始化為相應(yīng)全局變量的值,具體可查詢MySQL官方手冊(cè)。
系統(tǒng)變量根據(jù)是否可動(dòng)態(tài)修改(dynamic),分為:
動(dòng)態(tài)變量:可動(dòng)態(tài)修改變量的值。修改后無需重啟MySQL服務(wù)即可生效。
非動(dòng)態(tài)變量:不可動(dòng)態(tài)修改變量的值。修改后需重啟MySQL服務(wù)才可生效。
完整的變量屬性列表可以在MySQL參考手冊(cè)中查詢得到。比如,可以了解到某一個(gè)變量是系統(tǒng)變量還是狀態(tài)變量,是全局變量還是還是變量還是兩種都有,是動(dòng)態(tài)變量還是非動(dòng)態(tài)變量。
要查看MySQL的所有默認(rèn)系統(tǒng)變量值(忽略配置文件中的設(shè)置),使用命令:
[root@gw ~]# mysqld --no-defaults --verbose --help |
要查看MySQL的所有默認(rèn)系統(tǒng)變量值(讀取配置文件中的設(shè)置后的),使用命令:
[root@gw ~]# mysqld --verbose --help |
SHOW命令查看系統(tǒng)變量的值,語法格式為:
mysql> SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] |
當(dāng)使用關(guān)鍵字GLOBAL時(shí),是查看所有全局變量的當(dāng)前值:
mysql> SHOW GLOBAL VARIABLES; |
當(dāng)不使用關(guān)鍵字或使用關(guān)鍵字SESSION時(shí),是查看所有會(huì)話變量的當(dāng)前值(有會(huì)話變量的則顯示當(dāng)前會(huì)話變量的值,沒有的則顯示全局變量的值):
mysql> SHOW VARIABLES; mysql> SHOW SESSION VARIABLES; |
可以加上LIKE語句并使用通配符 % 或 _ 來匹配特定的變量。百分號(hào) % 匹配任意數(shù)量字符,下劃線 _ 匹配單個(gè)字符。示例:
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; |
對(duì)于在表達(dá)式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會(huì)返回會(huì)話變量的值(如果存在),否則會(huì)返回全局變量的值。有 @@global. 前綴的是顯式指定查看全局變量的值,有 @@session. 前綴的是顯式指定查看會(huì)話變量的值。
SHOW命令查看狀態(tài)變量的值,語法格式為:
mysql> SHOW [GLOBAL | SESSION] STATUS [like_or_where] |
當(dāng)使用關(guān)鍵字GLOBAL時(shí),顯示的是全局狀態(tài)值。一個(gè)全局狀態(tài)變量可能表示的是服務(wù)器自身的一些狀態(tài)(比如,Aborted_connects),或者是所有連接會(huì)話的聚合狀態(tài)(比如,Bytes_received 和 Bytes_sent)。如果一個(gè)變量沒有全局狀態(tài)值,顯示的就是會(huì)話狀態(tài)值。
mysql> SHOW GLOBAL STATUS; |
當(dāng)不使用關(guān)鍵字或使用關(guān)鍵字SESSION時(shí),顯示的是會(huì)話狀態(tài)值。如果一個(gè)變量沒有會(huì)話值,顯示的就是全局狀態(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啟動(dòng)選項(xiàng)修改,或在MySQL啟動(dòng)后使用SET命令動(dòng)態(tài)修改。每一個(gè)變量具體支持哪幾種方式,見MySQL官方手冊(cè)中的列表。
在設(shè)置系統(tǒng)變量的值時(shí),變量值為容量大小的,默認(rèn)單位為字節(jié)(bytes),或者也可以顯式指定單位為K、M、G(大小寫均可,分別表示1024、10242、10243字節(jié))。變量值為文件名的,可以使用絕對(duì)路徑名,但如果使用相對(duì)路徑,那么路徑是相對(duì)于MySQL數(shù)據(jù)目錄。
動(dòng)態(tài)變量的值可以在MySQL運(yùn)行時(shí)使用SET命令進(jìn)行修改:
要指明所修改的是一個(gè)全局變量,使用 GLOBAL 關(guān)鍵字或加上 @@global. 修飾符。示例:
SET GLOBAL max_connections = 1000; SET @@global.max_connections = 1000; |
要指明所修改的是一個(gè)會(huì)話變量,使用 SESSION 關(guān)鍵字或加上 @@session. 或 @@ 修飾符。一個(gè)客戶端只能修改它自己的會(huì)話變量,而不能修改其它客戶端的。示例:
SET SESSION sql_mode = 'TRADITIONAL'; SET @@session.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; |
LOCAL 和 @@local. 與 SESSION 和 @@session. 同義,作用相同。
如果未提供修飾符,SET命令修改的就是會(huì)話變量。但如果那個(gè)變量沒有會(huì)話值,就會(huì)報(bào)錯(cuò):
mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL |
SET命令可以同時(shí)設(shè)置多個(gè)變量的值,使用逗號(hào)分隔開來。示例:
SET @x = 1, SESSION sql_mode = ''; |
同時(shí)設(shè)置多個(gè)變量時(shí),最接近的GLOBAL或SESSION修飾符會(huì)應(yīng)用于后面沒有修飾符的變量。示例:
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命令中的某一個(gè)變量設(shè)置失敗了,那么整個(gè)語句都會(huì)失敗,其它變量也就不會(huì)被修改。
SET命令修改會(huì)話變量的值后,修改對(duì)當(dāng)前會(huì)話是即時(shí)生效的,直到你將它改為另一個(gè)值或當(dāng)前會(huì)話終止。修改不會(huì)對(duì)其它會(huì)話造成影響。修改全局變量的值后,修改也是即時(shí)生效的,新的值會(huì)被記住并應(yīng)用于新的會(huì)話,直到你將它改為另一個(gè)值或MySQL服務(wù)關(guān)閉。全局變量的值只會(huì)影響相應(yīng)的會(huì)話變量的值,也因此只會(huì)對(duì)新建會(huì)話造成影響,不會(huì)對(duì)現(xiàn)有會(huì)話,甚至不會(huì)對(duì)執(zhí)行SET GLOBAL語句的當(dāng)前會(huì)話造成影響。為了讓全局變量的值永久生效,你還應(yīng)該在MySQL配置文件中設(shè)置相應(yīng)選項(xiàng)的值。
要設(shè)置一個(gè)全局變量值為MySQL的默認(rèn)值,或設(shè)置一個(gè)會(huì)話變量值為當(dāng)前對(duì)應(yīng)的全局變量的值,可以將變量的值設(shè)為關(guān)鍵字DEFAULT。比如,下面兩個(gè)語句是相同的,都是將會(huì)話變量max_join_size的值設(shè)置為當(dāng)前相應(yīng)的全局變量的值:
SET @@session.max_join_size=DEFAULT; SET @@session.max_join_size=@@global.max_join_size; |
當(dāng)然,并不是所有系統(tǒng)變量的值都可以被設(shè)置為DEFAULT,那樣會(huì)報(bào)錯(cuò)。不允許將值DEFAULT分配給用戶自定義變量、存儲(chǔ)過程或函數(shù)參數(shù)、或存儲(chǔ)程序的本地變量。
要在表達(dá)式中引用系統(tǒng)變量的值,使用其中一個(gè) @@ 修飾符。比如,要在 SELECT 語句中獲取變量的值,可以:
SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode; |
對(duì)于在表達(dá)式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會(huì)返回會(huì)話變量的值(如果存在),否則會(huì)返回全局變量的值。這與語句 SET @@var_name = expr 是不相同的,那個(gè)語句總是設(shè)置的會(huì)話變量的值。
MySQL啟動(dòng)選項(xiàng)中,變量值可以顯式地指定單位K、M或G(不區(qū)分大小寫),但使用SET命令時(shí)不行;另一方面,MySQL啟動(dòng)選項(xiàng)中,變量值不能通過表達(dá)式計(jì)算活動(dòng),而SET命令中則可以。比如,下面第一個(gè)是可以的,第二個(gè)則不行:
[root@gw ~]# mysql --max_allowed_packet=16M //啟動(dòng)選項(xiàng)中,這種用法可以 [root@gw ~]# mysql --max_allowed_packet=16*1024*1024 //啟動(dòng)選項(xiàng)中,這種用法不行 |
相對(duì)地,下面第二個(gè)是可以的,第一個(gè)則不行:
mysql> SET GLOBAL max_allowed_packet=16M; //SET命令中,這種用法不行 mysql> SET GLOBAL max_allowed_packet=16*1024*1024; //SET命令中,這種用法可以 |
SET命令還可以用于設(shè)置自定義變量。在變量名前加上 @ 修飾符,就是表示設(shè)置自定義變量。變量名稱可以由字母、數(shù)字、"."、"_"和"$"組成。當(dāng)然,在以字符串或者標(biāo)識(shí)符引用時(shí)也可以包含其他字符(例如:@'my-var',@"my-var",或者@`my-var`)。
mysql> SET @x = 1; |
自定義變量是會(huì)話級(jí)別的變量,作用域僅限于當(dāng)前會(huì)話。當(dāng)前會(huì)話終止時(shí),其所有的會(huì)話變量將會(huì)被釋放,包括自定義變量。使用SELECT命令可以查看自定義變量的值:
mysql> SELECT @x; |
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。