1. 程式人生 > >MySQL--數據庫連接異常問題匯總

MySQL--數據庫連接異常問題匯總

ann 運行時 mys 權限 service transient 空閑 opera cep

========================================================

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,表示關閉。

MySQL--數據庫連接異常問題匯總