2016-04-26 51 views
-1

當mysql用戶超過max_user_connections時,訪問者會收到Mysql錯誤,並返回當前值爲30 ,但max_connections和max_user_connections設置爲1000.發生問題時,CPU達到幾乎98%。錯誤!:SQLSTATE [42000] [1226]'max_user_connections'資源(當前值:30),但max_user_connections配置爲1000

在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 | 
    +------------------------+ 
+1

我會通過檢查每個腳本只有每腳本一次,而不是多次連接開始。 – RiggsFolly

+0

如果錯誤消息標識正在運行的腳本,請向我們顯示腳本 – RiggsFolly

+0

您還正在使用哪種版本的MYSQL? – RiggsFolly

回答

0

解決方案:

您可以使用以下命令重現錯誤:

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

問題是由州長造成的,我們已經Cloudlinux installaed在服務器上,但該選項是默認設置爲OFF,但在此服務器設置爲濫用者。如果CPU是高於400 Gobernor爲用戶設置的MAX_USER_CONNECTIONS在30

您可以檢查/var/log/dbgovernor-restrict.log

溶液SI日誌以正確地設置該值或掀起

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> 
+0

可能有助於防止DOS攻擊和其他黑客攻擊。 –

+0

好吧,不是DDOS攻擊,但是如果你與很多客戶共享主機,你可以限制每個用戶的mysql資源。 – nandoC

相關問題