問題描述
連接數滿會導致客戶端無法連接到RDS MySQL數據庫。
問題原因
空閑連接過多。
活動連接過多。
解決方案
如果對實例或數據有修改、變更等風險操作,務必注意實例的容災、容錯能力,確保數據安全。
如果對實例(包括但不限于ECS、RDS)等進行配置與數據修改,建議提前創建快照或開啟RDS日志備份等功能。
如果在阿里云平臺授權或者提交過登錄賬號、密碼等安全信息,建議及時修改。
定位
可以通過RDS控制臺中云數據庫RDS/實例列表/監控與報警頁面,找到會話連接監控項,確認當前的連接問題是由于空閑連接數還是活躍連接數mysql.active_session導致的。
空閑連接過多
原因
應用使用長連接模式:對于長連接模式(比如Java應用),應用側應該配置連接池。連接池的初始連接數設置過高,應用啟動后建立多個到RDS實例空閑連接。
應用使用短連接模式:對于短連接模式(比如PHP應用),出現大量的空閑連接說明應用沒有在查詢執行完畢后顯式的關閉連接。
解決方法
通過RDS控制臺/會話管理、DMS或者
kill
命令來終止當前空閑會話,詳細步驟請參見RDS MySQL如何終止會話。修改應用,長連接模式需要啟用連接池的復用功能(建議也啟用連接檢測功能)。
修改應用,短連接模式需要在代碼中修改查詢結束后調用關閉連接的方法。
對于非交互模式連接,在控制臺的參數設置里設置
wait_timeout
參數為較小值。wait_timeout
參數控制非交互模式連接的超時時間(單位秒,默認值為24小時即86400秒),當非交互式連接空閑時間超過wait_timeout
指定的時間后,RDS實例會主動關閉連接。對于交互模式連接,在控制臺的參數設置里設置
interactive_timeout
參數為較小值。interactive_timeout
參數控制交互模式連接的超時時間(單位秒,默認值為2小時即7200秒),當交互式連接空閑時間超過interactive_timeout
指定的時間后,RDS實例會主動關閉連接。
在RDS MySQL實例連接數完全打滿的情況下,通過DMS或者其他方式是無法連接實例的。因此對于長連接模式,建議連接池的最大連接數要略小于實例規格的連接數限制,比如保留10個連接給DMS或其他管理操作使用。當發生無法連接的情況時,建議先在控制臺修改wait_timeout參數為較小值,促使RDS實例主動關閉空閑時間超過閾值的連接。
通常情況下,應用到RDS實例會采用非交互模式,具體采用哪個模式需要查看應用的連接方式配置,比如PHP通過傳遞MYSQL_CLIENT_INTERACTIVE常量給 mysql_connect() 函數即可開啟連接的交互模式。
wait_timeout和interactive_timeout這兩個參數的修改,修改前已經存在的會話保持修改前的設置,修改后新創建的會話使用新的參數設置。
活動連接過多
原因
慢查詢SQL增多導致活動連接數堆積。
鎖等待導致活動連接數堆積(包括InnoDB鎖等待、表元數據鎖等待)。
CPU使用率過高導致活動連接數堆積。
IOPS使用率高導致活動連接數堆積。
解決方法
InnoDB鎖等待處理,請參見RDS for MySQL行鎖等待和行鎖等待超時的處理。
表元數據鎖等待,請參見解決MDL鎖導致無法操作數據庫的問題。
CPU使用率高導致活動連接數堆積,請參見RDS MySQL/MariaDB版實例CPU使用率較高。
IOPS使用率高導致活動連接數堆積,請參見MySQL實例IOPS使用率高的原因和解決方法。