Sha*_*ank 9 mysql phpmyadmin php
我在我的 linode 服务器上运行一个应用程序 PHPlist,同时运行 12 个 PHP 脚本,每个脚本打开一个 MySQL 连接。现在,当我访问 PHPlist 时,它经常显示此错误:
致命错误:抱歉,服务器当前太忙,请稍后再试。
当我尝试访问 phpMyAdmin 时,它显示 #1040 错误。我通过cron
作业运行的 PHP 脚本的输出显示:
PHP 警告:mysqli_connect():(HY000/1040):连接过多
我在带有 phpMyAdmin 的服务器上使用 LAMP 堆栈;top
终端中的输出显示mysqld
使用 100-130% CPU。当我试图解决这个问题时,我得到了一些线索:
有很多变量要设置,但我无法确定具体是哪些变量,我从以下方面获得了一些参考: 连接过多 和http://dev.mysql.com/doc/refman/5.5/en/table-cache。 html
但是根据我的使用情况如何增加内存以及对我来说最大的内存困难是多少。
在我的服务器上,我使用了大约 12 个 PHP 脚本、用于发送电子邮件的 PHPlist 应用程序以及用于用户注册的主要数据库。
请帮我解决这个问题。
Rol*_*DBA 12
首先你需要做的是运行这个查询:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
Run Code Online (Sandbox Code Playgroud)
这将列出所有拥有SUPER 权限的用户。大多数进行与应用程序相关的 DB 处理的用户不需要此权限。根据MySQL 文档,具有 SUPER 权限的人可以执行以下操作:
mysqladmin kill
杀死属于其他帐户的线程您需要以 root@localhost 身份登录并撤销 SUPER 权限,如下所示:
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
一旦你这样做了,每当所有用户涌入 mysql 连接时,就只能root@localhost
登录。毕竟,如果每个人和他的祖母都拥有超级特权,这将禁止root@localhost
在其他人之前进行连接。如果 max_connections 为 200 并且您需要将其提高到 300 而不必重新启动 mysqld,您可以使用以下命令动态增加max_connections:
mysql> SET GLOBAL max_connections = 300;
Run Code Online (Sandbox Code Playgroud)
这将允许更多连接立即生效,但不要随意增加数量。您必须确保 mysql 有足够的 RAM 来容纳增加。
CAVEAT : 如果您将 max_connections 动态更改为 300,请将其放在 /etc/my.cnf 中
[mysqld]
max_connections=300
Run Code Online (Sandbox Code Playgroud)
您可以在 MySQL 数据库服务器上运行 mysqltuner.pl。如果没有,请运行以下命令:
cd
wget mysqltuner.pl
perl mysqltuner.pl
Run Code Online (Sandbox Code Playgroud)
Performance Metrics 下的第三行有这个
-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)
Run Code Online (Sandbox Code Playgroud)
看到每线程 5.4M 了吗?这是由 max_connections 乘以的。在本例中,最大内存约为 10.8G。因此,每次增加 max_connections 时,您都应该运行 mysqltuner.pl 并检查您是否为操作系统按下了太多内存。
在任何情况下,限制谁拥有 SUPER 权限可以让这些用户有机会缓解 mysqld 与数据库连接的泛滥。