为什么我收到 max_user_connections SQL 错误?

erb*_*mar 2 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
Run Code Online (Sandbox Code Playgroud)

我使用的是非常昂贵的 VPS!

O. *_*nes 5

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

发出这个命令,你会发现你有多少可用的全局连接:

show global variables like '%connections%'
Run Code Online (Sandbox Code Playgroud)

您可以像这样找出在任何给定时刻正在使用的连接数:

show status like '%connected%'
Run Code Online (Sandbox Code Playgroud)

您可以像这样了解每个连接在做什么:

show full processlist
Run Code Online (Sandbox Code Playgroud)

如果我是你,我会尝试至少 100 个连接的全局值。如果您无权这样做,您的服务提供商应该能够帮助您。它需要在my.cnfMySQL的文件配置中完成。不要将它设置得太高,否则你的 MySQL 服务器进程可能会吞噬你所有的 RAM。

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

控制这个问题的最后一种方法更加微妙。您可能正在使用 Apache Web 服务器作为底层技术。您可以减少同时运行的 Apache 任务的数量,以增加吞吐量。那是因为 Apache 对请求进行排队。如果它有几个任务有效地通过队列,这通常比许多任务快,因为争用较少。它还需要更少的 MySQL 连接,这将解决您的直接问题。这在这里解释:当EC2微实例上的ubuntu在内存不足时杀死它时自动重新启动Mysql

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