MySQL--數據庫連接異常問題匯總
========================================================
Name or service not known
錯誤消息:
[Warning] IP address ‘xxx.xxx.xx.xxx‘ could not be resolved: Name or service not known
錯誤原因:
MySQL數據庫服務器上沒有配置/ect/hosts,也沒有DNS服務,導致MySQL服務線程解析IP對應的主機名時發生失敗。
解決辦法:
使用參數--skip-name-resolve來禁用DNS的主機名解析功能,禁用該功能後,在MySQL授權表裏面,只能使用IP地址。
skip_host_cache
skip-name-resolve=1
========================================================
Aborted Connections類錯誤
錯誤消息:
[Note] Aborted connection 854 to db: ‘employees‘ user: ‘josh‘
客戶端無法正常連接MySQL數據庫,主要原因:
1、用戶賬號不正確
2、用戶權限不足
3、連接包存在問題(網絡丟包等問題)
4、建立連接時間超過 connect_timeout 參數的閥值
========================================================
Aborted_clients類錯誤
錯誤原因:
客戶端成功連接MySQL數據庫但非正常斷開或者異常中止,主要原因有:
1、客戶端應用關閉前沒有正常調用mysql close()方法
2、客戶端建立連接後長時間未向MySQL發出請求,休眠時間超過 wait_timeout 或 interactive_timeout 兩個參數
3、客戶端在數據傳輸過程中非正常關閉。
========================================================
No operations allowed after connection closed
異常信息:
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
異常原因:
應用服務器連接數據庫服務器後,長時間未使用而導致連接空閑時間超過數據庫配置“wait_timeout”的閾值,MySQL自動將這些連接斷開,但應用服務器並不知曉該連接失效,再次使用這些連接時就可以報錯。
解決辦法:
1、增到MySQL參數“wait_timeout”的值
2、減少 Connection pools 中 connection 的 lifetime
3、應用服務器定期檢查連接池中各連接的有效性。
========================================================
Cannot assign requested address
問題描述:
使用python+MySQLdb來收集幾百個MySQL數據庫節點的數據庫信息,每個MySQL數據庫節點進行1000+次的數據庫查詢,並將查詢結果插入的本地數據庫中上(數據庫服務器與程序運行在同一服務器中),同樣造成1000+的數據庫插入,在程序運行中,不定期出現連接失敗的異常,異常信息為:
2003,Can’t connect to MySQL server on ‘XXX.XXX.XXX.XXX′(99)
錯誤代碼99含義為:
OS error code 99: Cannot assign requested address
表示無法分配本地地址資源,socket無法創建。
在Linux級別使用命令 netstat -anp |grep TIME_WAIT 可以發現有大量的TIME_WAIT,超過1W+的等待:
問題原因:
在程序運行過程中,運行程序的服務器與其他MySQL數據庫服務器頻繁建立連接並執行MySQL命令,當MySQL命令執行完成後,TCP連接被關閉後處於TIME_WAIT狀態,TCP連接未被及時釋放而導致TCP連接端口占滿不可用。
解決辦法:
配置TCP連接可以重用和快速回收,在文件/etc/sysctl.conf中加入以下代碼:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
然後使用/sbin/sysctl -p 命令使配置文件生效。
配置完成後,在程序運行時仍存在大量(超過1W+)處於TIME_WAIT狀態的TCP連接,但未再出現連接失敗的情況。
相關知識:
net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
MySQL--數據庫連接異常問題匯總