MYSQL连接数过多错误无法消除。

3

我在运行在Ubuntu Linux上的C++程序中遇到了MySQL的"Too many connections"错误。

以下是出现错误的代码(它位于一个返回mysql错误(如果有)的方法内):

MYSQL connect;
mysql_init(&connect);
if (!mysql_real_connect(&connect,SERVER,USER,PASSWORD,DATABASE,0,NULL,0))
{
    return mysql_error(&connect);
}

这段代码一直返回字符串“连接太多”。

我在想这是否是其他错误。在我遇到这个错误之前,该程序已经运行了数月之久。当错误首次出现时,是因为我针对数千个更新/读取运行了该程序,所以很可能用尽了可用的连接。问题是,如果是这样的话,我找不到释放它们的方法。

以下是我尝试过的:

  • FLUSH HOSTS;
  • FLUSH TABLES;
  • 重新启动MYSQL
  • 完全重新启动机器

自从这个错误首次出现以来已经超过12个小时了,所以如果是连接问题,则没有被重置/释放。我本以为重新启动机器会释放一些东西。


只是一个快速的评论。这个问题并不是在问如何编写C++代码。当然我正在关闭连接和释放指针。我的问题是关于如何让MYSQL重置自己。这个程序将不再运行,因为MYSQL中存在某种内部状态,即使在空闲了12个小时并重新启动机器后,它仍然认为有太多的连接。 - Darren
请查看我回答的编辑版本。 - Bitmap
谢谢Bitmap,我会尝试增加max_connections设置。唯一的问题是,这并没有回答我如何重置连接的问题。肯定有一些方法可以在MySQL中重置连接。它真的会永远保留所有连接吗,即使重新启动后?那不是意味着我永远无法摆脱我的连接吗?这部分对我来说没有意义。 - Darren
不 - 这取决于您的客户端应用程序如何重新尝试连接。如果它们急切地重试连接-那可能是问题所在。您可以使用 sudo pkill MySQL 终止和分离正在监听和已建立的 MySQL 连接。您可以使用 netstat -apn | grep mysql | grep -i established 命令调试连接,以查看所有已建立的 MySQL 连接。 - Bitmap
非常感谢。我会尝试这些选项。我刚被拉到另一个任务上,稍后再检查! - Darren
2个回答

3

请参见C.5.2.7. 连接过多

查看所有MySQL连接。

 netstat -apn | grep mysql | grep -i established

提示

  • 只有在连接指针为空或无法连接到数据库时才建立并返回连接对象。
  • 在整个会话期间使用一个连接池。
  • 在每个会话结束时关闭连接,并释放/清理连接指针。
  • 在 /etc/mysql/my.cnf 中增加 max_connections=# 或使用 --max_connections=# 重新启动 MySQL。

谢谢。我使用了这个并确定没有当前的连接。经过更深入的挖掘,发现有很多连接被快速打开。我曾认为由于调用是在循环中进行的,所以连接会及时释放。程序之前的运行从未遇到过这种“数据块”,所以这是第一次出现错误,但...毕竟这是程序的问题 :( - Darren

0

在完成连接时,请确保关闭它们。

考虑重用连接或使用连接池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接