首先,您需要执行以下查询:
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
这将列出所有具有SUPER特权的用户。执行与应用程序相关的数据库处理的大多数用户不需要此特权。根据MySQL文档,具有SUPER特权的用户可以执行以下操作:
- 运行CHANGE MASTER TO以控制复制坐标
- 杀死或
mysqladmin kill
杀死属于其他帐户的线程
- 清除二进制日志以系统地删除二进制日志
- 使用SET GLOBAL进行配置更改以修改全局系统变量
- mysqladmin调试命令
- 启用或禁用日志记录
- 即使启用了* read_only *系统变量也执行更新
- 在从属服务器上启动和停止复制
- 在存储的程序和视图的DEFINER属性中指定任何帐户
- 这是您的问题中最重要的一个:即使达到max_connections系统变量控制的连接限制,也可以使您连接(一次)。
您将需要以root @ localhost身份登录并撤销SUPER权限,如下所示:
UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;
完成此操作后,只要所有用户都淹没mysql连接,就只能root@localhost
登录。毕竟,如果每个人和他的祖母都拥有SUPER特权,那么这将root@localhost
永远无法与其他人保持联系。如果max_connections为200,并且您需要将其提高到300,而不必重新启动mysqld,则可以使用以下命令动态增加max_connections:
mysql> SET GLOBAL max_connections = 300;
这样一来,更多的连接将立即生效,但不要随心所欲地任意增加连接数。您必须确保mysql有足够的RAM来容纳增加的内存。
注意:如果将max_connections动态更改为300,请放在/etc/my.cnf中
[mysqld]
max_connections=300
您可以在MySQL数据库服务器上运行mysqltuner.pl。如果没有,请运行以下命令:
cd
wget mysqltuner.pl
perl mysqltuner.pl
绩效指标下的第三行有
-------- 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)
看到每个线程5.4M吗?这是max_connections的倍数。在此示例中,最大RAM约为10.8G。因此,每次增加max_connections时,都应运行mysqltuner.pl并检查是否按OS占用了太多内存。
无论如何,限制谁拥有SUPER特权将使此类用户有机会减轻数据库连接对mysqld的洪灾。