MySQL / MariaDB 設定 wait_timeout 限制 sleep 連線


當一些 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

這時 wait_timeout 及 interactive_timeout 的設定便會立即生效, 但當下次重新啟動 MySQL 後便會回復使用預設值, 需要修改 my.cnf 設定:

$ sudo vi /etc/my.cnf

在 [mysqld] 段落加入 wait_timeout 及 interactive_timeout 的設定, 即改成類似這樣:

[mysqld]
interactive_timeout=300
wait_timeout=300

在 vi 儲存檔案及離開:

:wq

下次重新啟動 MySQL 便會自動使用新設定。

Leave a Reply