1. 程式人生 > >MySQL 5.6中的變量

MySQL 5.6中的變量

-m 完整 color 兩個 mysql服務器 roo 前綴 用戶自定義變量 路徑名

這篇文章介紹的是MySQL 5.6中的變量,基本是我以前學習MySQL 5.6手冊時整理而來。

基礎概念

MySQL中的變量可分為以下幾種:

1、 MySQL系統變量:該類型變量反映了MySQL服務器是如何配置的。每一個系統變量都有一個默認值。系統變量可以在MySQL配置文件中進行設置,或使用MySQL啟動選項進行設置。大多數系統變量都可以在MySQL運行時使用SET命令進行動態修改。

2、 MySQL狀態變量:該類型變量反映了MySQL服務器的運行狀態。

變量按作用範圍可分為:

1、 全局變量(global):對MySQL服務器全局生效。

2、 會話變量(session):僅對單個客戶端會話有影響。

有些MySQL選項只有全局變量或會話變量,而有些則同時有全局變量和會話變量。全局和會話變量的關聯是這樣的:

1、 當MySQL服務啟動時,它會初始每一個全局變量為默認值。這個默認值可以在配置文件中或使用MySQL啟動選項進行修改。

2、 MySQL也會為每一個客戶端連接維護一個會話變量集。當客戶端連接MySQL服務時,它所有的會話變量都會初始化為相應全局變量的當前值。對於少數系統變量,它的會話值可能不會被初始化為相應全局變量的值,具體可查詢MySQL官方手冊。

系統變量根據是否可動態修改(dynamic),分為:

  • 動態變量:可動態修改變量的值。修改後無需重啟MySQL服務即可生效。

  • 非動態變量:不可動態修改變量的值。修改後需重啟MySQL服務才可生效。

完整的變量屬性列表可以在MySQL參考手冊中查詢得到。比如,可以了解到某一個變量是系統變量還是狀態變量,是全局變量還是還是變量還是兩種都有,是動態變量還是非動態變量。

查看變量的值

要查看MySQL的所有默認系統變量值(忽略配置文件中的設置),使用命令:

[root@gw ~]# mysqld --no-defaults --verbose --help

要查看MySQL的所有默認系統變量值(讀取配置文件中的設置後的),使用命令:

[root@gw ~]# mysqld --verbose --help

SHOW命令查看系統變量的值,語法格式為:

mysql> SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]

  • 當使用關鍵字GLOBAL時,是查看所有全局變量的當前值:

mysql> SHOW GLOBAL VARIABLES;

  • 當不使用關鍵字或使用關鍵字SESSION時,是查看所有會話變量的當前值(有會話變量的則顯示當前會話變量的值,沒有的則顯示全局變量的值):

mysql> SHOW VARIABLES;

mysql> SHOW SESSION VARIABLES;

  • 可以加上LIKE語句並使用通配符 % 或 _ 來匹配特定的變量。百分號 % 匹配任意數量字符,下劃線 _ 匹配單個字符。示例:

mysql> SHOW VARIABLES LIKE 'innodb_buffer%';

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer%';

另外,也可以使用 SELECT 語句來查看系統變量的值。比如:

mysql> SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

對於在表達式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會返回會話變量的值(如果存在),否則會返回全局變量的值。有 @@global. 前綴的是顯式指定查看全局變量的值,有 @@session. 前綴的是顯式指定查看會話變量的值。

SHOW命令查看狀態變量的值,語法格式為:

mysql> SHOW [GLOBAL | SESSION] STATUS [like_or_where]

  • 當使用關鍵字GLOBAL時,顯示的是全局狀態值。一個全局狀態變量可能表示的是服務器自身的一些狀態(比如,Aborted_connects),或者是所有連接會話的聚合狀態(比如,Bytes_received 和 Bytes_sent)。如果一個變量沒有全局狀態值,顯示的就是會話狀態值。

mysql> SHOW GLOBAL STATUS;

  • 當不使用關鍵字或使用關鍵字SESSION時,顯示的是會話狀態值。如果一個變量沒有會話值,顯示的就是全局狀態值。LOCAL關鍵字含義與SESSION相同。

mysql> SHOW STATUS;

mysql> SHOW SESSION STATUS;

mysql> SHOW LOCAL STATUS;

使用FLUSH STATUS命令可以將一些狀態變量的值重置為0:

mysql> FLUSH STATUS;

設置變量的值

要修改系統變量的值,有幾種方式:在MySQL配置文件中修改,使用MySQL啟動選項修改,或在MySQL啟動後使用SET命令動態修改。每一個變量具體支持哪幾種方式,見MySQL官方手冊中的列表。

在設置系統變量的值時,變量值為容量大小的,默認單位為字節(bytes),或者也可以顯式指定單位為K、M、G(大小寫均可,分別表示1024、10242、10243字節)。變量值為文件名的,可以使用絕對路徑名,但如果使用相對路徑,那麽路徑是相對於MySQL數據目錄。

動態變量的值可以在MySQL運行時使用SET命令進行修改:

  • 要指明所修改的是一個全局變量,使用 GLOBAL 關鍵字或加上 @@global. 修飾符。示例:

SET GLOBAL max_connections = 1000;

SET @@global.max_connections = 1000;

  • 要指明所修改的是一個會話變量,使用 SESSION 關鍵字或加上 @@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命令可以同時設置多個變量的值,使用逗號分隔開來。示例:

SET @x = 1, SESSION sql_mode = '';

同時設置多個變量時,最接近的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命令中的某一個變量設置失敗了,那麽整個語句都會失敗,其它變量也就不會被修改。

  • SET命令修改會話變量的值後,修改對當前會話是即時生效的,直到你將它改為另一個值或當前會話終止。修改不會對其它會話造成影響。修改全局變量的值後,修改也是即時生效的,新的值會被記住並應用於新的會話,直到你將它改為另一個值或MySQL服務關閉。全局變量的值只會影響相應的會話變量的值,也因此只會對新建會話造成影響,不會對現有會話,甚至不會對執行SET GLOBAL語句的當前會話造成影響。為了讓全局變量的值永久生效,你還應該在MySQL配置文件中設置相應選項的值。

  • 要設置一個全局變量值為MySQL的默認值,或設置一個會話變量值為當前對應的全局變量的值,可以將變量的值設為關鍵字DEFAULT。比如,下面兩個語句是相同的,都是將會話變量max_join_size的值設置為當前相應的全局變量的值:

SET @@session.max_join_size=DEFAULT;

SET @@session.max_join_size=@@global.max_join_size;

當然,並不是所有系統變量的值都可以被設置為DEFAULT,那樣會報錯。不允許將值DEFAULT分配給用戶自定義變量、存儲過程或函數參數、或存儲程序的本地變量。

  • 要在表達式中引用系統變量的值,使用其中一個 @@ 修飾符。比如,要在 SELECT 語句中獲取變量的值,可以:

SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

對於在表達式中使用 @@var_name 這種形式引用變量的值(而不是使用 @@global. 或 @@session.),MySQL會返回會話變量的值(如果存在),否則會返回全局變量的值。這與語句 SET @@var_name = expr 是不相同的,那個語句總是設置的會話變量的值。

  • MySQL啟動選項中,變量值可以顯式地指定單位K、M或G(不區分大小寫),但使用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命令還可以用於設置自定義變量。在變量名前加上 @ 修飾符,就是表示設置自定義變量。變量名稱可以由字母、數字、"."、"_"和"$"組成。當然,在以字符串或者標識符引用時也可以包含其他字符(例如:@'my-var',@"my-var",或者@`my-var`)。

mysql> SET @x = 1;

自定義變量是會話級別的變量,作用域僅限於當前會話。當前會話終止時,其所有的會話變量將會被釋放,包括自定義變量。使用SELECT命令可以查看自定義變量的值:

mysql> SELECT @x;

MySQL 5.6中的變量