我在 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,连接对象不是线程安全的(我在这里引用文档),您可能需要尝试在脚本本身中关闭连接,看看是否有帮助。