まず、次のクエリを実行する必要があります。
SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
これにより、SUPER特権を持つすべてのユーザーがリストされます。アプリケーション関連のDB処理を行うほとんどのユーザーには、この特権は必要ありません。MySQLドキュメントによると、SUPER権限を持つユーザーは次のことができます。
- レプリケーション座標を制御するためにCHANGE MASTER TOを実行します
- KILLまたは
mysqladmin kill
他のアカウントに属するスレッドを強制終了する
- バイナリログをパージして、バイナリログを体系的に削除します
- SET GLOBALを使用して構成を変更し、グローバルシステム変数を変更する
- mysqladmin debugコマンド
- ロギングの有効化または無効化
- * 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で、mysqldを再起動せずに300に上げる必要がある場合は、次のコマンドでmax_connectionsを動的に増やすことができます。
mysql> SET GLOBAL max_connections = 300;
これにより、より多くの接続がすぐに有効になりますが、気まぐれに任意に数を増やすだけではありません。mysqlが増加に対応するのに十分なRAMを持っていることを確認する必要があります。
警告:max_connectionsを動的に300に変更する場合は、/ etc / my.cnfに配置してください
[mysqld]
max_connections=300
MySQL DBサーバーでmysqltuner.plを実行できます。それがない場合は、次を実行します。
cd
wget mysqltuner.pl
perl mysqltuner.pl
Performance Metricsの3行目には
-------- 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で乗算されます。この例では、最大で約10.8GのRAMになります。したがって、max_connectionsを増やすたびに、mysqltuner.plを実行して、OSにメモリを押しすぎていないかどうかを確認する必要があります。
いずれの場合も、SUPER権限を持つユーザーを制限することで、そのようなユーザーにmysqldのDB接続によるフラッディングを軽減する機会が与えられます。