Mysql资源暂时不可用

时间:2012-04-12 20:50:34

标签: mysql

我在高负载时看到了一些错误:

mysql_connect() [<a
href='function.mysql-connect'>function.mysql-connect</a>]: [2002] Resource
temporarily unavailable (trying to connect via
unix:///var/lib/mysql/mysql.sock)

据我所知,mysql服务器没有达到其最大连接限制,但还有其他东西阻止它提供查询。 MySQL会遇到什么其他限制?

我正在使用MySQL 5.5.21运行RHEL 6.2 64位

4 个答案:

答案 0 :(得分:22)

假设您的系统目前基于Unix(如问题陈述中所示)。如果这是正确的,请参阅以下问题:

  1. 您已经没有MySQL可用的memory

    这是您面临的最可能的问题。 MySQL连接池中的每个连接都需要内存才能运行,如果此资源耗尽,则无法进一步建立连接。当然,如果您发现这是一个问题,可以在your equivalent to my.cnf中调整各种操作的内存占用量和最大数据包大小。

    Here's an additional thread that can help there,但您也可以考虑使用更简单的分析工具,例如top,以便对所发生的事情进行良好的估算。

  2. 您的MySQL用户帐户可用file descriptors

    另一个常见问题:如果您尝试为需要高于1,024边界的文件IO的请求提供服务(默认情况下),您将遇到操作失败的情况。这是因为大多数系统都指定了每个用户一次可用的打开文件描述符数量的软限制和硬限制,并且超过此阈值可能会导致问题。

    这通常会在您的日志文件中显示一系列明显的标志。检查/var/log/messages和您的可比较目录(例如,/var/log/mysql,看看您是否能找到任何有趣的内容。

  3. 您已遇到线程不可满足的livelock or deadlock场景。

    内存和文件描述符耗尽的推论,如果您超越了系统能够处理的计算负载,线程可能会超时。它不会抛出此错误消息,但这是将来需要注意的事项。

  4. 您的系统已用尽fork可用的PID。

    另一种常见情况:fork在任何给定时间只有很多PID可用。如果您的系统只是overforked,它将不再能够为请求提供服务。

    最简单的检查是查看是否有任何其他服务可以连接到该计算机。例如,尝试通过SSH进入框并发现不可能是一个很大的线索。

  5. 上游代理或连接管理器资源耗尽,停止处理请求。

    如果您的客户端和MySQL之间有任何服务层,则需要检查它是否已崩溃,挂起或以其他方式变得不稳定。以上建议适用。

  6. 您的端口映射器已耗尽after 65,536 connections

    不太可能,但又一次,可能是穷尽的情况。如上所述,检查琐碎的服务连接,也就是这里最好的停靠点。

  7. 简而言之:这是资源耗尽的情况,包括服务器只是&#34; down&#34;。您将需要进一步分析您的系统以查看你阻止了什么。在这种情况下,所有错误消息都表明资源对客户端不可用 - 我们需要查看有关服务器的更多信息,以确定更充分的补救措施。

答案 1 :(得分:2)

我仍然没有找到它受到的限制,但我确实设法解决了这个问题。我们的会话表(在vbulletin中)使用MEMORY引擎时出现问题。这个表的索引是HASH,因此当vbulletin每小时清除一次这个表时,它会锁定表足够长的时间以阻止其他查询并将mysql推送到其资源的限制。

通过将索引更改为BTREE,这允许MySQL更快地删除会话表中的行,并避免以前达到的任何限制。这些错误只在我们将主数据库服务器升级到MySQL 5.5时才开始,因此我猜测在最新版本中MEMORY表的处理方式不同。

有关通过HASH For MEMORY使用BTREE索引提高速度的信息,请参阅http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables/

答案 2 :(得分:1)

Geez,这可能是很多事情。可能是套接字缓冲区空间已耗尽。可能是mysql没有像他们进来那样快地接受连接并且达到了积压限制(尽管我希望能给你一个&#34;拒绝连接&#34;错误,我不确定您将获得的Unix域套接字是什么。这可能是@MrGomez所指出的任何事情。

由于您在同一台服务器上运行Apache和MySQL,这在高负载下是一个问题,很可能是Apache正在使某些资源系统匮乏,而您只是没有看到(注意到?)在日志中丢失/失败的传入连接/请求。

您使用的是连接池吗?如果没有,我就从那里开始。

我还会在mysql_connect错误的同时在Apache日志和syslog中查找错误,看看还有什么问题。我特别建议让MySQL转移到自己独立的专用服务器上。

答案 3 :(得分:0)

就我而言,我正在使用JSON(PHP驱动程序)处理PDO数据类型。 我正在使用fetch来检索一项,但是忘记向查询中添加LIMIT 1。添加它可以解决问题。