MySQL server has gone away 問題的解決方法

mysql出現ERROR : (2006, 'MySQL server has gone away') 的問題意思就是指client和MySQL server之間的連接斷開了。
形成這樣的緣由通常是sql操做的時間過長,或者是傳送的數據太大(例如使用insert ... values的語句過長, 這種狀況能夠經過修改max_allowed_packed的配置參數來避免,也能夠在程序中將數據分批插入)。
產生這個問題的緣由有不少,總結下網上的分析:
緣由一. MySQL 服務宕了 
判斷是否屬於這個緣由的方法很簡單,進入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腳本就是屬於此類)sql

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本身的動做日誌

mysql> show global status like 'com_kill';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | Com_kill      | 21    |
 +---------------+-------+
 1 row in set

緣由四. Your SQL statement was too large.
當查詢的結果集超過 max_allowed_packet 也會出現這樣的報錯。定位方法是打出相關報錯的語句。
用select * into outfile 的方式導出到文件,查看文件大小是否超過 max_allowed_packet ,若是超過則須要調整參數,或者優化語句。code

mysql> show global variables like 'max_allowed_packet';
 +--------------------+---------+
 | Variable_name      | Value   |
 +--------------------+---------+
 | max_allowed_packet | 1048576 |
 +--------------------+---------+
 1 row in set (0.00 sec)

修改參數:server

mysql> set global max_allowed_packet=1024*1024*16;
 mysql> show global variables like 'max_allowed_packet';
 +--------------------+----------+
 | Variable_name      | Value    |
 +--------------------+----------+
 | max_allowed_packet | 16777216 |
 +--------------------+----------+
 1 row in set (0.00 sec)
相關文章
相關標籤/搜索