为什么我得到max_user_connections SQL错误?

时间:2015-11-13 11:09:20

标签: php mysql wordpress phpbb3 question2answer

为什么我一次又一次地在我的网站http://elancemarket.com/上收到此错误?

Error establishing a database connection

SQL ERROR [ mysqli ]
User elancema_user already has more than 'max_user_connections' active connections [1203]

Warning: mysqli::mysqli(): (HY000/1203): User elancema_user already has more than 'max_user_connections' active connections in /home/elancemarket/public_html/ask/qa-include/qa-db.php on line 66

我的VPS很贵!

2 个答案:

答案 0 :(得分:4)

服务器会抛出此错误:

appCfg * appCfg::p_instance = 0;
SingletonDestroyer appCfg::destroyer;

SingletonDestroyer::~SingletonDestroyer() {  
    delete p_instance;
}
void SingletonDestroyer::initialize( appCfg* p ) {
    p_instance = p;
}

appCfg& appCfg::getInstance() {
    if(!p_instance)     {
        p_instance = new appCfg();
        destroyer.initialize( p_instance);    
    }
    return *p_instance;
}

appCfg::appCfg()
{
    pSetting = new QSettings(Const::SettingPath()+"/main.cfg",QSettings::IniFormat);
}
//called on Windows and Linux platforms, but not on Android    
appCfg::~appCfg()
{
    pSetting->sync();
    delete pSetting;
}

...

这意味着特定数据库用户此时已经用完了所有并发连接,并且无法处理更多连接。

在不进行任何编程更改的情况下修复的唯一选项是更改MySQL配置中的SQL ERROR [ mysqli ] User database_user already has more than 'max_user_connections' active connections [1203] 值。 Linux上的配置文件通常是max_user_connections

其他解决方案可能是:

  • 在网站上减少查询次数
  • 如果使用相同的数据库用户,则为不同的项目创建单独的数据库用户。

您可以通过运行命令/etc/my.cnf来检查用户的当前值。

答案 1 :(得分:4)

最好的办法是增加max_user_connections。对于一个服务于三个不同网络应用程序(原始php,WordPress,phpBB)的MySQL实例,你可能想要一个至少为60的值。

发出此命令,您将了解有多少全局连接可用:

show global variables like '%connections%'

您可以在任何特定时刻找到正在使用的连接数:

show status like '%connected%'

你可以找到每个连接的作用:

show full processlist

如果我是你,我会尝试至少100个连接的全局值。如果您无权访问,您的服务提供商应该能够为您提供帮助。它需要在MySQL的my.cnf文件配置中完成。不要设置得太高,否则你冒着MySQL服务器进程吞噬所有内存的风险。

第二种方法允许您将这些整体连接分配给不同的MySQL用户。如果您的每个Web应用程序都有不同的MySQL用户名,则此方法适合您。这种方法写在这里。 https://www.percona.com/blog/2014/07/29/prevent-mysql-downtime-set-max_user_connections/

控制这个问题的最终方法更加微妙。您可能正在使用Apache Web服务器作为底层技术。您可以减少同时运行的Apache任务的数量,矛盾的是,增加吞吐量。那是因为Apache排队请求。如果它有一些任务有效地敲击队列,那通常比许多任务更快,因为争用较少。它还需要更少的MySQL连接,这将解决您的直接问题。这在此解释:Restart Mysql automatically when ubuntu on EC2 micro instance kills it when running out of memory

顺便说一句,像WordPress这样的网络应用使用持久连接池。也就是说,它们建立与MySQL数据库的连接,保持它们打开,并重用它们。如果你的应用程序很忙,每个连接的生命周期应该是几分钟。 (基于过度简化的语句数据库连接是在几秒钟内创建和删除,您的托管服务提供商的支持技术人员不理解这部分Web应用程序操作的微妙之处。)