2

当mysql用户超过max_user_connections时,访问者会得到一个Mysql错误,返回当前值为30,但max_connections和max_user_connections设置为1000。问题发生时,CPU几乎达到98%。

在 mysql 错误日志中,我们收到了来自另一个用户的大量拒绝访问错误,大约 5000 个拒绝连接。我的问题不是为什么 PHP 脚本会占用所有这些连接,而是要知道为什么不应用配置的变量 max_user_connections 和 max_connections。那些配置为 1000,但错误消息返回 30。怎么可能?

我激活了 log_warnings=2,以获取更多信息,但我们没有获得额外信息。知道为什么会出现这种行为吗?或者如何审计mysql来找到这个问题的根源?

收到的错误信息是:

错误!:SQLSTATE [42000] [1226] 用户“some_user”已超出“max_user_connections”资源(当前值:30)

select @@session.max_user_connections, @@global.max_connections;
+--------------------------------+--------------------------+
| @@session.max_user_connections | @@global.max_connections |
+--------------------------------+--------------------------+
|                           1000 |                     1000 |
+--------------------------------+--------------------------+` 

 show global variables like '%connections%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| extra_max_connections | 1     |
| max_connections       | 1000  |
| max_user_connections  | 1000  |
+-----------------------+-------+

 show status like '%connected%';
 +-------------------+-------+
 | Variable_name     | Value |
 +-------------------+-------+
 | Threads_connected | 4     |
 +-------------------+-------+

 select user,max_user_connections from mysql.user where          host='localhost'\G

 user: some_user
 max_user_connections: 0
 user: another_user
 max_user_connections: 0`

错误似乎是:错误:1226 SQLSTATE:42000(ER_USER_LIMIT_REACHED)

消息:用户“%s”已超出“%s”资源(当前值:%ld)

并不是 :

错误:1203 SQLSTATE:42000 (ER_TOO_MANY_USER_CONNECTIONS)

消息:用户 %s 已经有超过 'max_user_connections' 的活动连接

我们正在使用 MariaDB,版本:

  select version(); 
  +------------------------+
  | version()              |
  +------------------------+
  | 5.5.44-MariaDB-cll-lve |
  +------------------------+
4

1 回答 1

2

解决方案 :

您可以使用以下命令重现错误:

mysqlslap -a --concurrency=500 --number-of-queries 5000 --iterations=500 --engine=innodb --debug-info -utest -p

问题是由Governor引起的,我们在服务器上安装了Cloudlinux,但这个选项默认设置为OFF,但在这个服务器上设置为滥用者。如果 CPU 高于 400,Gobernor 将用户的 max_user_connections 设置为 30。

您可以检查 /var/log/dbgovernor-restrict.log 上的日志

解决方案 si 正确设置此值或设置 off

dbctl --lve-mode off

/etc/container/mysql-governor.xml

<lve use="abuser"></lve>
<restrict level1="60s" level2="15m" level3="1h" level4="1d"     
timeout="1h" log="/var/log/dbgovernor-restrict.log"          

user_max_connections="30"></restrict>

<statistic mode="on"></statistic>
<default>
<limit name="cpu" current="400" short="380" mid="350" long="300">      
</limit>
于 2016-04-27T18:52:14.613 回答