您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關MySQL中如何淺析interactive_timeout和wait_timeout,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一 前言
這篇文章源于自己一個無知的提問,作為一個DBA 老鳥,實在汗顏 。如圖,修改wait_timeout參數之后 并沒有及時生效,于是乎去跑到技術支持群里問了。。ps 應該去查g.cn 才對。。
本文通過測試我們要弄清楚兩個問題
a 繼承關系 wait_timeout在session和global級別分別繼承那個參數?
b 生效參數 在會話中到底哪個參數決定了會話的存活時間?
二 參數介紹
首先說明兩個關鍵詞 通過MySQL 客戶端連接db的是交互會話,通過jdbc等程序連接db的是非交互會話。
interactive_timeout: MySQL服務器關閉交互式連接前等待的秒數。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。參數默認值:28800秒(8小時)
wait_timeout: MySQL服務器關閉非交互連接之前等待的秒數。在會話啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決于客戶端類型--由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義。參數默認值:28800秒(8小時)
2.1 繼承關系
1) 單獨設置global級別的interactive_timeout
set global interactive_timeout = 300
session1 [RO] 09:34:20 >set global interactive_timeout=300;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 09:39:15 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
session1 [RO] 09:39:21 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
登陸另外一個會話
session2 [RO] 09:39:35 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
session2 [RO] 09:39:51 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 300 |
+---------------------+----------------+
2 rows in set (0.00 sec)
分析
在交互模式下,session和global級別的 interactive_timeout 繼承了 interactive_timeout global的值。而 wait_timeout 的值,session級別繼承了interactive_timeout。global級別的wait_timeout 則不受影響 。
2) 設置session級別的 interactive_timeout
session1 [RO] 09:44:07 >set session interactive_timeout=300;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 09:44:27 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
session1 [RO] 09:44:31 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
另外開啟一個會話
session2 [RO] 09:44:41 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.01 sec)
session2 [RO] 09:44:44 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800 |
| WAIT_TIMEOUT | 28800 |
+---------------------+----------------+
2 rows in set (0.00 sec)
分析
從上面的例子來看 wait_timeout 并不受session級別的interactive_timeout的值的影響。
3) 同時設置兩者的值,且不同。
session1 [RO] 09:46:42 >
(none) [RO] 09:46:42 >set global interactive_timeout=300;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 09:46:55 >set global wait_timeout=360;
Query OK, 0 rows affected (0.00 sec)
另開啟一個會話
session2 [RO] 09:47:20 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 300 |
+---------------------+----------------+
2 rows in set (0.00 sec)
session2 [RO] 09:47:22 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300 |
| WAIT_TIMEOUT | 360 |
+---------------------+----------------+
2 rows in set (0.00 sec)
分析
從案例1 2中可以得出session級別的wait_timeout 繼承global 級別的 interactive_timeout 的值 global級別的session則不受影響。在沒有改變 interactive_timeout的值的情況下,去修改wait_timeout的值
結果無效。就會出現前言中我遇到的情況。
2.2 有效參數
通過一個例子檢測影響會話的參數是哪個?驗證方式通過設置全局的timeout時間(注意兩者時間不同),另外起一個會話
session1 [RO] 10:20:56 >set global interactive_timeout=20;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 10:23:32 >set global wait_timeout=10;
Query OK, 0 rows affected (0.00 sec)
會話2進行查詢
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
1 row in set (5.01 sec)
然后在session1 中 查看show processlist;
分析
交互式 timeout時間受global級別的interactive_timeout影響。
2)非交互模式
目前的測試并沒有達到預期,測試模型如下設置
mysql> select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 35 |
| WAIT_TIMEOUT | 35 |
+---------------------+----------------+
2 rows in set (0.00 sec)
mysql> select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 35 |
| WAIT_TIMEOUT | 25 |
+---------------------+----------------+
2 rows in set (0.00 sec)
在python命令行中模擬非交互數據來訪問數據庫,查看數據庫timeout參數。同時在數據庫中執行show processlist 查看python的連接多久會被關閉。
查看session級別的參數
查看show processlist,通過python程序連接數據庫的會話等待了25s之后,被中斷。
分析
1 通過python 命令行獲取的timeout 參數和交互方式獲取的并不一致,在交互命令行中獲取session級別的wait_timeout 的值為35,使用非交互命令獲取的值為25,說明wait_timeout繼承全局的wait_timeout。
2 交互模式下會話空閑時間超過wait_timeout立即會被斷開。
3) 思考題
session1 通過非交互命令連接到db,此時全局的wait_timeout的值是28800,session 2 修改全局的wait_timeout 為30s ,問題 session1的會話會受到影響嗎?
三 總結
1 timeout 只是針對空閑會話有影響。
2 session級別的wait_timeout繼承global級別的interactive_timeout的值。而global級別的session則不受interactive_timeout的影響。
3 交互式會話的timeout時間受global級別的interactive_timeout影響。因此要修改非交互模式下的timeout,必須同時修改interactive_timeout的值。
4 非交互模式下,wait_timeout參數繼承global級別的wait_timeout。
以上就是MySQL中如何淺析interactive_timeout和wait_timeout,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。