對付 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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 mool 的頭像
    mool

    mool

    mool 發表在 痞客邦 留言(2) 人氣()