MySQL Server has gone away报错原因汇总
原因一: MySQL 服務宕了
判斷是否屬于這個原因的方法很簡單,執行以下命令,查看mysql的運行時長:
$ mysql -uroot -p -e "show global status like 'uptime';"
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Uptime ? ? ? ?| 68928 | +---------------+-------+ 1 row in set (0.04 sec)
或者查看MySQL的報錯日志,看看有沒有重啟的信息:
$ tail /var/log/mysql/error.log 130101 22:22:30 InnoDB: Initializing buffer pool, size = 256.0M 130101 22:22:30 InnoDB: Completed initialization of buffer pool 130101 22:22:30 InnoDB: highest supported file format is Barracuda. 130101 22:22:30 InnoDB: 1.1.8 started; log sequence number 63444325509 130101 22:22:30 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306 130101 22:22:30 [Note] ? - '127.0.0.1' resolves to '127.0.0.1'; 130101 22:22:30 [Note] Server socket created on IP: '127.0.0.1'. 130101 22:22:30 [Note] Event Scheduler: Loaded 0 events 130101 22:22:30 [Note] /usr/sbin/mysqld: ready for connections. Version: '5.5.28-cll' ?socket: '/var/lib/mysql/mysql.sock' ?port: 3306 ?MySQL Community Server (GPL)
如果uptime數值很大,表明MySQL服務運行了很久了,說明最近服務沒有重啟過。?如果日志沒有相關信息,也說明MySQL服務最近沒有重啟過,可以繼續檢查下面幾項內容。
原因2:連接超時
如果程序使用的是長連接,則這種情況的可能性會比較大。 即某個長連接很久沒有發起新的請求,達到了server端的time out,被server強行關閉。此后再通過這個client發起查詢的時候,就會報錯server has gone away。
$ mysql -uroot -p -e "show global variables like '%timeout';"
+----------------------------+----------+ | Variable_name ? ? ? ? ? ? ?| Value ? ?| +----------------------------+----------+ | connect_timeout ? ? ? ? ? ?| 30 ? ? ? | | 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 ? ?| +----------------------------+----------+
mysql> SET SESSION wait_timeout=5;
?
#Wait 10 second
?
smysql> SELECT NOW(); ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: ? ?132361 Current database: *** NONE ***
+---------------------+ | NOW() ? ? ? ? ? ? ? | +---------------------+ | 2013-01-02 11:31:15 | +---------------------+ 1 row in set (0.00 sec)
原因3: 進程在server端被主動kill
這種原因和第2種原因比較相似,只是發起者是DBA,或者其他job,發現有長時間的慢查詢執行kill xxx導致。
$ mysql -uroot -p -e "show global status like 'com_kill'"
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_kill ? ? ?| 0 ? ? | +---------------+-------+
?
原因4: Your SQL statement was too large
當查詢的結果集超過?max_allowed_packet?也會出現這樣的報錯,定位方法是打出相關報錯的語句。 用select*into outfile?的方式導出到文件,查看文件大小是否超過max_allowed_packet,如果超過則需要調整參數,或者優化語句。
mysql> show global variables like 'max_allowed_packet'; +--------------------+---------+ | Variable_name ? ? ?| Value ? | +--------------------+---------+ | max_allowed_packet | 1048576 | +--------------------+---------+ 1 row in set (0.00 sec)
?
# 修改參數:
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)
總結
以上是生活随笔為你收集整理的MySQL Server has gone away报错原因汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南昌起义的部队是谁的部队?
- 下一篇: 航空报国精神是中国航空工业的什么