1.ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
使用select 一個大表,query的過程中被主庫kill掉會出現下面錯誤
2.ERROR 2006 (HY000): MySQL server has gone away
如果超過wait_timeout或者interactive_timeout時,再使用這個連接時
admin>show databases;
insert values()()如果數據量的大小超過了max_allow_packets的大小,也會報
ERROR 2006 (HY000): MySQL server has gone away
服務器端error log中報錯:
141111 19:30:16 [Warning] Aborted connection 1280 to db: 'deal' user: 'admin' host: '10.0.0.0' (Got timeout reading communication packets)
3.ERROR 1045 (28000): Access denied for user 'test'@'10.0.0.0' (using password: YES)
- ping一下要連接數據庫,看能否ping通;
- 使用mysql client嘗試連接一下,注意使用-h -u -P -p分別指定host、user、port,例如mysql -hdbxx -utest -P5002 -p,然后回車,輸入密碼;
- 強調一下,第2步的時候使用-p之后回車,然后輸入密碼,而不是把密碼作為參數直接輸入,這樣一個安全,二是避免了密碼中轉義字符引起的問題;
4.ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.1' (111)
這種情況下,說明還沒有連接上mysql,嘗試ping下數據庫,看是否能ping通;其次看下mysql server是否啟動;
5.ERROR 1040 (HY000): Too many connections
當前服務器端的連接數超過了設置的最大連接數max_connections
6.Host 'host_name
' is blocked because of many connection errors.Unblock with 'mysqladmin flush-hosts'
如果client在連接server的時候,出錯次數超過server設置的max_connect_errors(不包括錯誤的密碼嘗試),則會報這個錯誤;這個一般是網絡存在問題,如果確認網絡存在偶爾性的,可以增大max_connect_errors並執行flush-hosts
7.Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was *** millisecond ago。
1) mysql服務器默認的“wait_timeout”是8小時(也就是默認的值默認是28800秒),也就是說一個connection空閑超過8個小時,mysql將自動斷開該connection,通俗的講就是一個連接在8小時內沒有活動,就會自動斷開該連接。而連接池卻認為該連接還是有效的(因為並未校驗連接的有效性),當應用申請使用該連接時,就會導致上面的報錯。
2) 如果客戶端連接設置了socketTimeout=1000(即1s), 當客戶端連接發送一個慢查詢(超過1s)時,客戶端連接socket會斷開,同樣會報“Communications link failure” 錯誤
8.Could not create connection to database server. Attempted reconnect 3 times. Giving up。
1)如上錯誤常見情況是后端mysql服務不可用,請確認后端mysql服務正常以及連接使用的配置參數正確;
2)還有一種情況是業務使用了Atlas,業務連接串中配置了重連(autoReconnect=true),當連接池中連接損壞(如上7中描述了可能損壞的情況),業務再次使用該損壞連接的時候會發起重連(JDBC內部機制)並嘗試三次,但是報如上錯誤(確認連接參數無問題)。這是由於jdbc內部重連上后會發送“SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ” 請求,而該請求在0.0.2版本的Atlas中不支持(可升級0.1解決),只會影響當前請求,不影響這個連接下一次的使用。
服務器端
很明顯, MySQL認為讀到了一個錯誤的包,並將該連接Aborted了, 在errlog中記下這個warning, 通過show global status like '%Aborted_clients%' 可以看到Aborted_clients 值的增加。
出現該warning主要是因為客戶端沒有正常調用mysql_close()退出。我們針對php、python、perl做測試如下:
1) python 代碼如下:
運行該程序, 在另一個Term中kill 或者 kill -9 該進程, 在MySQL errlog中均會出現如上warning
運行該程序, 然后按下 crtl + c 中斷該程序, 在MySQL errlog中沒有出現如上waring
2)php 代碼如下:
運行該程序,在另一個Term中kill 或者 kill -9 該進程, 在MySQL errlog中均會出現如上warning
運行該程序, 然后按下 crtl + c 中斷該程序, 在MySQL errlog中出現如上waring
3)perl 代碼如下:
運行該程序,在另一個Term中kill 或者 kill -9 該進程, 在MySQL errlog中均會出現如上warning
運行該程序, 然后按下 crtl + c 中斷該程序, 在MySQL errlog中出現如上waring
注: 通過測試,發現python、php、perl 對 crtl + c (同 kill -2) 處理方式不同,僅python 對 kill -2 信號處理調用了 mysql_close() 正常關閉MySQL連接。
2.[Warning] Access denied for user 'test'@'localhost' (using password: YES)
服務器端報此錯誤,主要是客戶端連接的時候使用了錯誤的密碼。
創建測試用test, 並賦予test庫的增刪改查權限:
1) 在終端使用錯誤的密碼連接MySQL結果如下:
可以看到此時客戶端報用戶無權限連接 ERROR, 而此時服務器端errlog中會出現如上的warning
2) 在終端連接沒有權限的database 結果如下:
此時客戶端報沒有權限連接MySQL庫, 而服務器端errlog中沒有任何warning出現
3.[Warning] Aborted connection 104643 to db: 'test' user: 'root' host: 'localhost' (Got timeout reading communication packets)
主要是客戶端連接在wait_timeout 時間范圍內都無操作,服務器端會斷開此連接
1)首先我們設置wait_timeout值為10秒
2) 等待超過10s后服務器端報錯如下:
3) 再在MySQL客戶端中發起操作會報ERROR : MySQL server has gone away
4.[Warning] Aborted connection 104660 to db: 'test' user: 'root' host: 'localhost' (Got a packet bigger than 'max_allowed_packet' bytes)
此warning主要是因為客戶端向服務器端傳送了大於max_allowed_packet 指定大小的包所導致。測試如下:
1) 首先將數據通過mysqldump命名將數據導出
默認mysqldump會將數據導出成多個insert into語句, 每個語句大小接近1M
2)設置max_allowed_packet = 524288
3) 再使用MySQL命令將hostname.sql 導入結果如下:
服務器errlog中會報如上warning
轉自meituan wk