對付 MySQL 的死連接
如果一個 mysql 伺服器有太多的連接,無疑的會耗損一些資源。如果遇到類似dos的攻擊,一下吃下太多的連接,正常的連接顯然會受影響。到 Mysql 中下指令,可以看到連線的狀況,若連線的方式使用 persistent 方式,操作結束時不會立刻斷連,而會進入 Sleep 狀態:
mysql> SHOW PROCESSLIST;
+-------+------+-----------------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+-----------------+------+---------+------+-------+------------------+
| 14850 | axer | localhost | NULL | Query | 0 | NULL | SHOW PROCESSLIST |
| 12210 | bill | localhost | bill | Sleep | 0 | | NULL |
+-------+------+-----------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
其中 Sleep 就是作完動作尚未 timeout 的連線,這時另一個欄位 Time 代表他 "sleep" 的時間,以上例而言為0 代表剛睡而已。
我們可以查看預設的連線時間,變數 wait_timeout:
mysql> SHOW variables;
+---------------------------------+-------------------------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------------------------+
....中間略 ...
| wait_timeout | 28800 |
+---------------------------------+-------------------------------------------------+
預設是 28800 秒,真是驚人,如果我們要結束他,可以使用以下的指令:
mysql> kill 12210;
修改 wait_time:
runtime修改
mysql> set wait_timeout=600;
永久設定
$ vi /etc/my.cnf
[mysqld]
...
wait_timeout=180
...
記得重啟 mysql
留言列表