原因一: MySQL服務宕了
查看mysql的運行時長:
show global status like 'uptime';
輸出:
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Uptime | 3414707 |
+---------------+---------+
原因二: MySQL連接超時
某個mysql長連接很久沒有新的請求發起,達到了server端的timeout,被server強行關閉。
此後再通過這個connection發起查詢的時候,就會報錯server has gone away
(大部分PHP腳本就是屬於此類)
show global variables like '%timeout';
輸出:
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| connect_timeout | 28800 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 5 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 1800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 300 |
| net_write_timeout | 300 |
| rpl_semi_sync_master_timeout | 5000 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 1800 |
+------------------------------+----------+
interactive_timeout/wait_timeout 是1800秒,即mysql鏈接在無操作1800秒後被自動關閉
原因三: MySQL請求鏈接進程被主動kill
show global status like 'com_kill';
輸出:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_kill | 7 |
+---------------+-------+
原因四: Your SQL statement was too large
當查詢的結果集超過 max_allowed_packet 也會出現這樣的報錯。
show global variables like 'max_allowed_packet';
輸出: 64M
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 67108864 |
+--------------------+----------+
修改參數:
set global max_allowed_packet=1024*1024*16;
解決方案
在my.cnf文件中添加或者修改以下兩個變量:(需重啓)
wait_timeout=28800
interactive_timeout = 28800
如果不能修改my.cnf,可以執行語句(重啓後失效)
SET GLOBAL interactive_timeout=28800;
SET GLOBAL wait_timeout=28800;