ubuntu mysql 连接数过多

ubuntu mysql 连接数过多

我在 ubuntu 12.04 上使用 django 和 mysql。

奇怪的是,当我尝试在mysql中执行非常简单的命令时,它会提示错误“ERROR 1040 (HY000): 连接数过多”

我只想用django mysql框架south创建大约20个表。我是唯一一个连接mysql的用户,怎么会有太多连接呢?

我没有更改 mysql 中的配置文件,因此我相信最大连接数应该是默认的 150。

有人能帮我吗?非常感谢

更新 1:我重启 mysql 服务器并运行 show processlist 后,尽管我没有执行任何操作,但还是发现了 26 个连接。有时这个数字会下降到 10,然后又上升到 25 左右。这是正常的吗?

更新2:

好的,我找到问题所在了。谢谢你的帮助。

答案1

MySQL 连接有时会被操作系统暂时搁置。

每周有很多次,某个应用程序会保留一些 MySQL 连接,而这些连接本应由 Apache、Python 或 PHP 关闭。当然,从应用程序的角度来看,这些连接是关闭的,但 TIME_WAIT 有时会优先出现。我最近在 中发现了一种 hack ServerFault。我现在知道这个 hack:

这是一个关于 TIME_WAIT 的好问题:如何强制关闭处于TIME_WAIT状态的套接字?我用的是这个答案:https://serverfault.com/a/329848/69271

本质上,我会在 Ubuntu 机器上运行它:

SEC_TO_TIMEWAIT=1
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_recycle
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_reuse

答案2

好的,让我回答我的问题。

后来我发现我运行了另一个忘记终止的python脚本。该脚本每1秒运行一次以查询mysql数据库。

+-----+------+-----------------+----------+---------+------+-------+------------------+
| Id  | User | Host            | db       | Command | Time | State | Info             |
+-----+------+-----------------+----------+---------+------+-------+------------------+
| 384 | root | localhost       | EZ_Green | Sleep   | 2682 |       | NULL             |
| 407 | root | localhost       | EZ_Green | Sleep   | 2052 |       | NULL             |
| 411 | root | localhost:47347 | NULL     | Sleep   |    3 |       | NULL             |
| 412 | root | localhost:47350 | NULL     | Sleep   |    1 |       | NULL             |
| 445 | root | localhost       | EZ_Green | Sleep   |  972 |       | NULL             |
| 448 | root | localhost       | EZ_Green | Sleep   |  882 |       | NULL             |
| 451 | root | localhost       | EZ_Green | Sleep   |  792 |       | NULL             |
| 454 | root | localhost       | EZ_Green | Sleep   |  702 |       | NULL             |
| 457 | root | localhost       | EZ_Green | Sleep   |  612 |       | NULL             |
| 460 | root | localhost       | EZ_Green | Sleep   |  522 |       | NULL             |
| 463 | root | localhost       | EZ_Green | Sleep   |  432 |       | NULL             |
| 466 | root | localhost       | EZ_Green | Sleep   |  342 |       | NULL             |
| 469 | root | localhost       | EZ_Green | Sleep   |  252 |       | NULL             |
| 472 | root | localhost       | EZ_Green | Sleep   |  162 |       | NULL             |
| 475 | root | localhost       | EZ_Green | Sleep   |   72 |       | NULL             |
| 476 | root | localhost       | EZ_Green | Sleep   |   42 |       | NULL             |
| 478 | root | localhost       | EZ_Green | Sleep   |   12 |       | NULL             |
| 479 | root | localhost       | NULL     | Query   |    0 | NULL  | show processlist |
+-----+------+-----------------+----------+---------+------+-------+------------------+

但我仍然不明白为什么它需要这么多连接,而且它们都处于休眠状态?我使用 python 线程执行另一个每 1 秒查询一次数据库的函数。有 2 个活动的 python 线程不断运行,所有其他线程在完成时都会终止。脚本在这里。

while True: 
    now = time.time() 
    if now < next: 
        time.sleep(next - now) 
        t = Thread(target=my_function,)
        t.start()# start a thread

    next += interval

答案3

我不是 Python 爱好者,所以不能肯定地说,您使用的连接池可能没有正确关闭连接。如果不知道您在 my_function 中做什么,就很难说什么。对于 sqlalchemy,连接对象不是线程安全的(我在这里引用文档),您可能需要尝试在脚本本身中关闭连接,看看是否有帮助。

相关内容