當一些 PHP 開啟 MySQL 連線後, 沒有成功關閉 MySQL 連線, 會有一大堆 sleep 的 process, 在 MySQL 可以執行以下指令查看:
mysql> SHOW PROCESSLIST;
執行上面的 MySQL 指令會出現很多 Sleep 的連線, 當這些 Sleep 的連線過多時, 很容易會觸及 max_connections 的限制, 出現 too many connections 的錯誤。
在 MySQL 限制連線逾時的變數是 wait_timeout, 這個變數的預設值是 28800, 單位是秒, 即 8 個小時。這個數值真的十分大, 因為預計應該不會有程式每次執行要用上 8 個小時吧。
要解決這個問題, 只要降低 wait_timeout 的數值, 那麼每個 process 會在超過這個限制的秒數後, 自動將它 kill 掉。
首先需要先用 root 登入 MySQL:
$ mysql -u root -p
登入後輸入以下 MySQL 指令, 將 wait_timeout 及 interactive_timeout 設定成 300, 即每個連線最多保留 300 秒:
mysql> SET @@GLOBAL.wait_timeout=300
mysql> SET @@GLOBAL.interactive_timeout=300
mysql> SET @@GLOBAL.interactive_timeout=300
這時 wait_timeout 及 interactive_timeout 的設定便會立即生效, 但當下次重新啟動 MySQL 後便會回復使用預設值, 需要修改 my.cnf 設定:
$ sudo vi /etc/my.cnf
在 [mysqld] 段落加入 wait_timeout 及 interactive_timeout 的設定, 即改成類似這樣:
[mysqld]
interactive_timeout=300
wait_timeout=300
interactive_timeout=300
wait_timeout=300
在 vi 儲存檔案及離開:
:wq
下次重新啟動 MySQL 便會自動使用新設定。