mysql出現ERROR : (2006, 'MySQL server has gone away') 的問題意思就是指client和MySQL server之間的鏈接斷開了。
造成這樣的原因一般是sql操作的時間過長,或者是傳送的數據太大(例如使用insert ... values的語句過長, 這種情況可以通過修改max_allowed_packed的配置參數來避免,也可以在程序中將數據分批插入)。
產生這個問題的原因有很多,總結下網上的分析:
原因一. MySQL 服務宕了
判斷是否屬于這個原因的方法很簡單,進入mysql控制臺,查看mysql的運行時長
mysql> show global status like 'uptime';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Uptime | 3414707 |
+---------------+---------+
1 row in set或者查看MySQL的報錯日志,看看有沒有重啟的信息
如果uptime數值很大,表明mysql服務運行了很久了。說明最近服務沒有重啟過。
如果日志沒有相關信息,也表名mysql服務最近沒有重啟過,可以繼續檢查下面幾項內容。
原因二. mysql連接超時
即某個mysql長連接很久沒有新的請求發起,達到了server端的timeout,被server強行關閉。
此后再通過這個connection發起查詢的時候,就會報錯server has gone away
(大部分PHP腳本就是屬于此類)
mysql> show global variables like '%timeout';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+----------------------------+----------+
10 rows in set
wait_timeout 是28800秒,即mysql鏈接在無操作28800秒后被自動關閉
原因三. mysql請求鏈接進程被主動kill
這種情況和原因二相似,只是一個是人為一個是MYSQL自己的動作
新聞熱點
疑難解答