問題描述
串連數滿會導致用戶端無法串連到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使用率高的原因和解決方案。