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地址。
配置my.cnf中參數為:
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,表示關閉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM