### wait_timeout and interactive_timeout 參數 - 非交互模式連接:通常情況下,應用到RDS實例會採用非交互模式,具體採用哪個模式需要查看應用的連接方式配置,比如PHP通過傳遞MYSQL_CLIENT_INTERACTIVE常量給mysql_connect() ...
wait_timeout and interactive_timeout 參數
- 非交互模式連接:通常情況下,應用到RDS實例會採用非交互模式,具體採用哪個模式需要查看應用的連接方式配置,比如PHP通過傳遞MYSQL_CLIENT_INTERACTIVE常量給mysql_connect()函數即可開啟連接的交互模式。wait_timeout參數控制非交互模式連接的超時時間(單位秒,預設值為24小時即86400秒),當非互動式連接空閑時間超過wait_timeout指定的時間後,RDS實例會主動關閉連接。
- 對於交互模式連接:通過 mysql 客戶端 與 mysql server 建立的連接是互動式連接,interactive_timeout參數控制交互模式連接的超時時間(單位秒,預設值為2小時即7200秒),當互動式連接空閑時間超過interactive_timeout指定的時間後,RDS實例會主動關閉連接。
- wait_timeout和interactive_timeout這兩個參數的修改,修改前已經存在的會話保持修改前的設置,修改後新創建的會話使用新的參數設置。
wait_timeout指的是“連接完成後,使用過程中”的等待時間
參數 | 作用 |
---|---|
wait_timeout | 非互動式連接建立完成後,使用過程中的等待時間(單位:秒) |
interactive_timeout | 互動式連接建立完成後,使用過程中的等待時間(單位:秒) |
MySQL 8.0.26
client A | client B | client C | |
---|---|---|---|
T1 | mysql -h -P -u -p set global wait_timeout = 10; set global interactive_timeout = 20; select @@global.wait_timeout, @@global.interactive_timeout; result (10, 20) |
||
T2 | mysql -h -P -u -p select @@session.wait_timeout, @@session.interactive_timeout; result (20, 20) |
db = pymysql.connect() cursor = db.cursor() cursor.execute("select @@session.wait_timeout, @@session.interactive_timeout;") result (10,20 ) |
|
T3 | set @@session.wait_timeout = 10; select @@session.wait_timeout, @@session.interactive_timeout; result (10, 20) |
||
T4 | wait 15s | time.sleep(15) | |
T5 | select @@session.wait_timeout, @@session.interactive_timeout; (ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.) result(20,20) |
cursor.execute("select @@session.wait_timeout, @@session.interactive_timeout;") pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') |
|
T6 | set @@session.wait_timeout = 20; set @@session.interactive_timeout = 10; select @@session.wait_timeout, @@session.interactive_timeout; result (20, 10) |
cursor.execute("set @@session.wait_timeout = 20;") cursor.execute("set @@session.interactive_timeout = 10;") �cursor.execute("select @@session.wait_timeout, @@session.interactive_timeout;") result(20, 10) |
|
T7 | wait 15s | time.sleep(15) | |
T8 | select @@session.wait_timeout, @@session.interactive_timeout; (Query OK) result(20,10) |
�cursor.execute("select @@session.wait_timeout, @@session.interactive_timeout;") (Query OK) result(20,10) |
client A 在 T1 時刻將全局變數 wait_timeout 和 interactive_timeout 分別設置為 10s 和 20s。
client B 在 T2 時刻通過 mysql 客戶端與 mysql server 建立連接(互動式連接),該連接中會話變數 wait_timeout 和 interactive_timeout 分別為 20s 和 20s, 因此可知互動式連接的會話變數 wait_timeout 和 interactive_timeout 都繼承自全局變數 interactive_timeout 的值,接著 client B 在 T3 時刻,將會話變數 wait_timeout 設置為 10s,之後等待 15s,再查看會話變數 wait_timeout、interactive_timeout 時,發現連接已經斷開,這說明互動式連接的連接閑置閾值由會話變數 wait_timeout 控制,client B 在 T6 時刻,將會話變數 wait_timeout 和 interactive_timeout 的值分別設置為 20s 和 10s,之後同樣等待 15s,在 T8 時刻,再查看會話變數 wait_timeout、interactive_timeout 時,發現連接依舊未斷開,直到 20s 後才斷開連接,因此可知互動式連接的連接閑置閾值由會話變數 wait_timeout 控制,與會話變數 interactive_timeout 無關。
client C 在 T2 時刻通過 pymysql 與 mysql server 建立連接(非互動式連接),該連接中會話變數 wait_timeout 和 interactive_timeout 分別為 10s 和 20s, 因此可知非互動式連接的會話變數 wait_timeout 和 interactive_timeout 分別繼承全局變數 wait_timeout 和 interactive_timeout 的值,接著 client C 在 T4 時刻等待 15s,再查看會話變數 wait_timeout、interactive_timeout 時,發現連接已經斷開,這說明非互動式連接的連接閑置閾值由會話變數 wait_timeout 控制,client C 在 T6 時刻將會話變數 wait_timeout 和 interactive_timeout 的值分別設置為 20s 和 10s。之後等待 15s,在 T8 時刻,再查看會話變數 wait_timeout、interactive_timeout 時,發現連接依舊未斷開,直到 20s 後才斷開連接,因此可知非互動式連接的連接閑置閾值由會話變數 wait_timeout 控制,與會話變數 interactive_timeout 無關。
總結
- 互動式連接的會話變數 wait_timeout 和 interactive_timeout 都繼承自全局變數 interactive_timeout 的值
- 非互動式連接的會話變數 wait_timeout 和 interactive_timeout 分別繼承自全局變數 wait_timeout 和 interactive_timeout
- 無論是互動式連接還是非互動式連接,連接閑置閾值都由會話變數 wait_timeout 控制,與會話變數 interactive_timeout 無關。
FAQ
為什麼叫互動式和非互動式連接?通俗解釋不知道?
wait_timeout 和 interactive_timeout 參數應設置為多大?
- 參數 wait_timeout 和 interactive_timeout 應儘量設置成相同
- 設置為多大取決於業務,如果你面對的是成熟的開發(比如公司內部團隊),可以設置小些,分鐘級別就行。
參考資料
MySQL會話閑置時間控制
如何處理RDS MySQL連接數滿情況