[MySQL] 解決MySQL server has gone away問題

下 SQL 語法對 MySQL server 做存取時 (縱使只是使用 use database1; 這樣的指令, 不一定要用到 SELECT 指令) 可能會遇到以下這個錯誤訊提示:

MySQL server has gone away

可以從以下幾個方向去看看是哪一類問題:

1. 是不是 SQL 命令超過最大長度了?
我們可能為了一些比較特別的存取而兜出一串很長的 SQL 命令, 這時候就可能會發生SQL 命令超過最大長度的問題. 調整 SQL 命令的最大長度可以更改 my.cnf (例如: /etc/my.cnf) 中的 max_allowed_packet 欄位, 將原有數值加大, 例如原本是 max_allowed_packet = 1M, 可以嘗試改成 max_allowed_packet = 10M 以後重跑 MySQL server 後再試一次 (命令: service mysqld stop; service mysqld start). 一般人比較不會是這種情況, 如果無效的話, 請將 max_allowed_packet 設定回原數值, 然後嘗試下一項.

2. 調整連線的逾時的數值
請修改 my.cnf (例如: /etc/my.cnf) 中的 wait_timeout 和 interactive_timeout 數值: 例如改成:
wait_timeout=2880000
interactive_timeout = 2880000
儲存修改內容以後重跑 MySQL server, 然後再試試看. 如果無法更動 my.cnf 檔案的話, 可以在 SQL 語法中, 例如在 mysql_query(‘SET NAMES’) 之後, 下 mysql_query(‘SET SESSION wait_timeout = 2880000; SET SESSION interactive_timeout = 2880000’, $rLink); 之類的命令. 如果無效的話, 請將上述設定回復原數值, 然後嘗試下一項.

3.讓每次建立 MySQL 連線時都重新建立一條連線
例如:
[cc lang=’php’ height=’100%’ width=’100%’]
mysql_connect(‘localhost’, $sUser, $sPasswd, TRUE);
[/cc]
也就是 mysql_connect 的第四個參數設定成 TRUE, 這樣每次建立 MySQL 連線時都重新建立一條連線, 以避免前一個 MySQL 連線未結束, 而後來建立的 MySQL 連線取得和前一個MySQL 連線一樣的 PHP resource ID, 這樣會出現 mysql server has gone away 問題.

這一篇文章的關鍵字: MySQL server has gone away, my.cnf, max_allowed_packet, wait_timeout, interactive_timeout

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.