【问题标题】:Debug MySQLs "too many connections"调试 MySQL 的“连接太多”
【发布时间】:2009-07-15 02:28:01
【问题描述】:
我正在尝试调试在生产服务器上遇到的错误。有时 MySQL 放弃并且我的 Web 应用程序无法连接到数据库(我收到“连接太多”错误)。服务器每天有几千个访问者,晚上我运行一些 cron 作业,这些作业有时会做一些繁重的 mysql 工作(循环通过 50 000 行,插入和删除重复项等)
- 服务器在同一台机器上同时运行 apache 和 mysql
- MySQL 有一个非常标准的配置(最大连接数)
- Web 应用程序正在使用 PHP
如何调试此问题?我应该阅读哪些日志文件?我如何找到“邪恶”的脚本?奇怪的是,如果我重新启动 MySQL 服务器,它会再次开始工作。
编辑:
- 不同的应用程序/脚本对其数据库使用不同的连接器(主要是 mysqli,但也有 Zend_Db)
【问题讨论】:
标签:
php
mysql
debugging
cron
【解决方案1】:
首先,使用 innotop(谷歌)来监控您的连接。它主要针对 InnoDB 统计信息,但可以设置为显示所有连接,包括那些不在事务中的连接。
否则,以下内容会有所帮助:在您的 Web 应用程序中使用持久连接/连接池。增加您的最大连接数。
【解决方案2】:
不一定是长时间运行的 SQL 查询。
如果您在页面开头打开连接,则在 PHP 脚本终止之前它不会被释放 - 即使没有运行查询。
您应该向您的网页添加一些统计信息,以找出最慢的网页和最受欢迎的网页。如果可能,尽早关闭连接会有所帮助。
【解决方案3】:
尝试使用持久连接(mysql_pconnect),这将有助于减少因不断打开和关闭 MySQL 连接而导致的服务器负载。
【解决方案4】:
出发点大概是使用mysqladmin processlist来获取mysql服务器上的进程列表。下一步取决于您的发现。