1. 程式人生 > 實用技巧 >MySQL教程26-系統變數

MySQL教程26-系統變數

在 MySQL 資料庫,變數分為系統變數和使用者自定義變數。系統變數以 @@ 開頭,使用者自定義變數以 @ 開頭。

伺服器維護著兩種系統變數,即全域性變數(GLOBAL VARIABLES)和會話變數(SESSION VARIABLES)。全域性變數影響 MySQL 服務的整體執行方式,會話變數影響具體客戶端連線的操作。

每一個客戶端成功連線伺服器後,都會產生與之對應的會話。會話期間,MySQL 服務例項會在伺服器記憶體中生成與該會話對應的會話變數,這些會話變數的初始值是全域性變數值的拷貝。

檢視系統變數(全域性變數和會話變數)

可以使用以下命令檢視 MySQL 中所有的全域性變數資訊。

SHOW GLOBAL VARIABLES; 

可以使用以下命令檢視與當前會話相關的所有會話變數以及全域性變數

SHOW SESSION VARIABLES;

其中,SESSION 關鍵字可以省略。

MySQL 中的系統變數以兩個“@”開頭。

  • @@global 僅僅用於標記全域性變數;
  • @@session 僅僅用於標記會話變數;
  • @@ 首先標記會話變數,如果會話變數不存在,則標記全域性變數。

MySQL 中有一些系統變數僅僅是全域性變數,例如 innodb_data_file_path,可以使用以下 3 種方法檢視:

SHOW GLOBAL VARIABLES LIKE 'innodb_data_file_path
'; SHOW SESSION VARIABLES LIKE 'innodb_data_file_path'; SHOW VARIABLES LIKE 'innodb_data_file_path';

MySQL 中有一些系統變數僅僅是會話變數,例如 MySQL 連線 ID 會話變數 pseudo_thread_id,可以使用以下 2 種方法檢視。

SHOW SESSION VARIABLES LIKE 'pseudo_thread_id';
SHOW VARIABLES LIKE 'pseudo_thread_id';

MySQL 中有一些系統變數既是全域性變數,又是會話變數,例如系統變數 character_set_client 既是全域性變數,又是會話變數。

SHOW SESSION VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_client';

此時檢視全域性變數的方法如下:

SHOW GLOBAL VARIABLES LIKE 'character_set_client';

設定系統變數

可以通過以下方法設定系統變數:

  1. 修改 MySQL 原始碼,然後對 MySQL 原始碼重新編譯(該方法適用於 MySQL 高階使用者,這裡不做闡述)。
  2. 在 MySQL 配置檔案(mysql.ini 或 mysql.cnf)中修改 MySQL 系統變數的值(需要重啟 MySQL 服務才會生效)。
  3. 在 MySQL 服務執行期間,使用 SET 命令重新設定系統變數的值。

伺服器啟動時,會將所有的全域性變數賦予預設值。這些預設值可以在選項檔案中或在命令列中對執行的選項進行更改。

更改全域性變數,必須具有 SUPER 許可權。設定全域性變數的值的方法如下:

  • SET @@global.innodb_file_per_table=default;
  • SET @@global.innodb_file_per_table=ON;
  • SET global innodb_file_per_table=ON;

需要注意的是,更改全域性變數隻影響更改後連線客戶端的相應會話變數,而不會影響目前已經連線的客戶端的會話變數(即使客戶端執行 SET GLOBAL 語句也不影響)。也就是說,對於修改全域性變數之前連線的客戶端只有在客戶端重新連線後,才會影響到客戶端。

客戶端連線時,當前全域性變數的值會對客戶端的會話變數進行相應初始化。設定會話變數不需要特殊許可權,但客戶端只能更改自己的會話變數,而不能更改其它客戶端的會話變數。設定會話變數的值的方法如下:

  • SET @@session.pseudo_thread_id=5;
  • SET session pseudo_thread_id=5;
  • SET @@pseudo_thread_id=5;
  • SET pseudo_thread_id = 5;

如果沒有指定修改全域性變數還是會話變數,伺服器會當作會話變數來處理。比如:

SET @@sort_buffer_size = 50000;

上面語句沒有指定是 GLOBAL 還是 SESSION,伺服器會當做 SESSION 處理。

使用 SET 設定全域性變數或會話變數成功後,如果 mysql 服務重啟,資料庫的配置就又會重新初始化。一切按照配置檔案進行初始化,全域性變數和會話變數的配置都會失效。

MySQL 中還有一些特殊的全域性變數,如 log_bin、tmpdir、version、datadir,在 MySQL 服務例項執行期間它們的值不能動態修改,也就是不能使用 SET 命令進行重新設定,這種變數稱為靜態變數。資料庫管理員可以使用前面提到的修改原始碼或更改配置檔案來重新設定靜態變數的值。