MySQL 系統(tǒng)變量(system variables)
來源:程序員人生 發(fā)布時間:2014-10-08 08:12:21 閱讀次數(shù):2949次
MySQL系統(tǒng)變量(system variables)實(shí)際上是一些系統(tǒng)參數(shù),用于初始化或設(shè)定數(shù)據(jù)庫對系統(tǒng)資源的占用,文件存放位置等等。這些個系統(tǒng)變量可以分為全局以及會話級別層面來修改,有些也可以進(jìn)行動態(tài)修改。本文主要介紹了系統(tǒng)變量的一些概念以及如何設(shè)置查看這些系統(tǒng)變量。
1、什么是系統(tǒng)變量
系統(tǒng)變量實(shí)際上用于控制數(shù)據(jù)庫的一些行為和方式的參數(shù)。比如我們啟動數(shù)據(jù)庫的時候設(shè)定多大的內(nèi)存,使用什么樣的隔離級別,日志文件的大小,存放位置等等一系列的東東。當(dāng)然我們數(shù)據(jù)庫系統(tǒng)啟動后,有些系統(tǒng)變量(參數(shù))也可以通過動態(tài)修改來及時調(diào)整數(shù)據(jù)庫。這個系統(tǒng)變量在Oracle里邊是通過pfile或者spfile來控制,稱之為參數(shù),是一個意思。
系統(tǒng)變量取值:都有默認(rèn)值,可以在啟動時及啟動后修改。
設(shè)置范圍:全局與回話級別,全局級別需要super權(quán)限,會話級別只影響自身會話。
設(shè)置方法:啟動前可以通過配置文件以及啟動選項(xiàng)來修改,啟動后通過SET子句來設(shè)置。
生效周期:全局變量全局可見,但只影響在更改后連接的從該全局變量初始化相應(yīng)會話變量的客戶端。當(dāng)前會話及已登錄的會話不受影響。
對于有關(guān)涉及到size的設(shè)置值,可以使用后綴K、M或G分別表示千字節(jié)、兆字節(jié)或gigabytes,不區(qū)分大小寫。
2、set設(shè)置系統(tǒng)變量的用法
--當(dāng)前的版本
mysql> show variables like 'version%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| version | 5.5.37 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+
--獲取有關(guān)set的幫助
mysql> help set
Name: 'SET'
Description:
Syntax:
SET variable_assignment [, variable_assignment] ...
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| [@@global. | @@session. | @@]system_var_name = expr
--查看全部系統(tǒng)變量
root@localhost[tempdb]> show variables; --該命令會輸出當(dāng)前系統(tǒng)全部系統(tǒng)變量
--查看sort_buffer
mysql> show variables like 'sort_buffer%';
+------------------+---------+
| Variable_name | Value |
+------------------+---------+
| sort_buffer_size | 2097152 |
+------------------+---------+
--在省略global與session關(guān)鍵字的情形下為session級別
mysql> set sort_buffer_size=1024*1024*4; --設(shè)置為4M
mysql> show variables like 'sort_buffer%';
+------------------+---------+
| Variable_name | Value |
+------------------+---------+
| sort_buffer_size | 4194304 |
+------------------+---------+
--恢復(fù)到缺省值
mysql> set sort_buffer_size=default;
mysql> show variables like 'sort_buffer%';
+------------------+---------+
| Variable_name | Value |
+------------------+---------+
| sort_buffer_size | 2097152 |
+------------------+---------+
3、全局與會話級別設(shè)置示例
--如何設(shè)置隔離級別
mysql> help isolation
Name: 'ISOLATION'
Description:
Syntax:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
--下面我們通過演示隔離級別來設(shè)置全局與session級別變量
--查看當(dāng)前session級別的隔離方式
root@localhost[(none)]> show variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
--修改當(dāng)前session級別的隔離方式為READ-COMMITTED
root@localhost[(none)]> set session transaction isolation level read committed;
root@localhost[(none)]> show variables like '%isolation%';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+
--另外的一個session , 登錄用戶為fred
--當(dāng)前sessioin級別繼承全局隔離級別為REPEATABLE-READ
fred@localhost[(none)]> show variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
--在root會話中設(shè)置全局隔離級別為serializable
root@localhost[(none)]> set global transaction isolation level serializable;
--注意,在root會話中 session級別還是為READ-COMMITTED
root@localhost[(none)]> show variables like '%isolation%';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+
--在root會話中我可以看到全局的值已經(jīng)變?yōu)镾ERIALIZABLE
root@localhost[(none)]> show global variables like '%isolation%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tx_isolation | SERIALIZABLE |
+---------------+--------------+
--在fred中全局的也變成了SERIALIZABLE
fred@localhost[(none)]> show global variables like '%isolation%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tx_isolation | SERIALIZABLE |
+---------------+--------------+
--從上面的演示來說,無論global級別如何設(shè)置,不會影響到當(dāng)前session級別的設(shè)置
--下面我們使用一個新用戶登錄來看看全局設(shè)置是否影響新會話
robin@SZDB:~> mysql -urobin
--如下查詢新會話的隔離級別等于全局的隔離級別
robin@localhost[(none)]> show variables like '%isolation%';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| tx_isolation | SERIALIZABLE |
+---------------+--------------+
4、如何獲取變量值
除了通過前面演示的使用show global|session variables like 'vari_name'方式之外,我們可以通過查詢
information_schema數(shù)據(jù)中特定的表來獲得這些變量的值。
通過查詢數(shù)據(jù)information_schema的表global_variables
root@localhost[information_schema]> select variable_value from global_variables where
-> variable_name='tx_isolation';
+----------------+
| variable_value |
+----------------+
| SERIALIZABLE |
+----------------+
--Author: Leshami
--Blog : http://blog.csdn.net/leshami
root@localhost[information_schema]> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| SERIALIZABLE |
+-----------------------+
root@localhost[information_schema]> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-COMMITTED |
+------------------------+
--下面查詢session_variables結(jié)果與查詢global_variables獲得的值相同,究其原因還在進(jìn)一步研究中。
root@localhost[information_schema]> select * from session_variables where variable_name='tx_isolation';
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| TX_ISOLATION | SERIALIZABLE | --經(jīng)過重新設(shè)置一次session級別的tx_isolation后查詢正常。補(bǔ)充@20140928
+---------------+----------------+
5、總結(jié)
a、設(shè)置方法
要想設(shè)置一個GLOBAL變量的值,使用下面的語法:
mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;
要想設(shè)置一個SESSION變量的值,使用下面的語法:
mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;
LOCAL是SESSION的同義詞。
如果設(shè)置變量時不指定GLOBAL、SESSION或者LOCAL,默認(rèn)使用SESSION。
b、檢索設(shè)置
要想檢索一個GLOBAL變量的值,使用下面的語法:
mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';
要想檢索一個SESSION變量的值,使用下面的語法:
mysql> SELECT @@sort_buffer_size;
mysql> SELECT @@session.sort_buffer_size;
mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';
這里,LOCAL也是SESSION的同義詞。
c、其他注意事項(xiàng)
當(dāng)你用SELECT @@var_name搜索一個變量時(也就是說,不指定global.、session.或者local.),
MySQL返回SESSION值(如果存在),否則返回GLOBAL值。
對于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。
![鵬城DBA總?cè)? border= 鵬城DBA總?cè)? src=]()
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈