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)