MySQL サーバ
リソースの使用を制限することの一つの方法として、スタートアップ変数の
max_user_connections
をゼロ以外の値に設定することがあります。しかし、この方法は完全にグローバルに適用するため、個別アカウントの管理はできません。これに加えて、この方法は、単一アカウントによる同時接続の数を制限するものであり、これは
クライアントが制限できることではありません。このようなタイプの制御は、インターネット
サービス プロバイダ業界などでの MySQL
管理者に高い関心をよせる点です。
MySQL 5.1 では、個別ユーザレベルで 3 つのサーバ リソースを制限できます。
時間単位の全クエリ数: 1 ユーザが実行できるクエリ
時間単位の全更新数: テーブルまたはデータベースを変更するクエリ
時間単位の接続数: 1 時間で新しく開ける接続
クライアントが発行できるステートメントはクエリ制限に対してカウントします。データベースまたはテーブルを変更するステートメントは更新制限に対してカウントします。
アカウント ベースでサーバへの同時接続の数を制限することも可能です。
ここでのアカウントは、user
テーブル エントリの 1 レコード (ユーザ)
です。このエントリは User
と
Host
のカラム値で識別します。
ここでの機能を使用をするための前提条件として、mysql
データベースの user
テーブルには、リソース関連のコラム
(フィールド)
が必要です。リソース制限は、max_questions
、max_updates
、max_connections
、max_user_connections
のカラムで保存します。user
テーブルにこれらのカラムがない場合は、項4.5.4. 「mysql_upgrade — MySQL アップグレードのテーブル チェック」
を参照して、アップグレードしてください。
GRANT
ステートメントでリソース制限を設定するには、WITH
節を使用します。この節は制限するリソースと制限値の時間単位の回数を指定します。たとえば、customer
データベースにアクセスできる新規アカウントを作成するときに、制限をつける場合は、次のようなステートメントを発行します。
mysql>GRANT ALL ON customer.* TO 'francis'@'localhost'
->IDENTIFIED BY 'frank'
->WITH MAX_QUERIES_PER_HOUR 20
->MAX_UPDATES_PER_HOUR 10
->MAX_CONNECTIONS_PER_HOUR 5
->MAX_USER_CONNECTIONS 2;
制限する種類をすべて WITH
節で指定する必要はありませんが、順番がバラバラになります。時間単位の制限値は時間単位を表す整数にします。GRANT
ステートメントに WITH
節がない場合は、この制限はデフォルト値、ゼロでの設定になります。つまり、制限がないことになります。MAX_USER_CONNECTIONS
の整数は、アカウントが一度にできる同時接続の最大回数を表します。この制限を、デフォルト
(ゼロ)
にした場合、max_user_connections
システム変数でアカウント同時接続回数を決定します。
既存アカウントの制限をセットまたは変更するには、グローバル
レベル (ON *.*
) で GRANT
USAGE
ステートメントを使用します。
francis
に対するクエリ制限を 100
に変更するステートメントは、次のようになります。
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_QUERIES_PER_HOUR 100;
このステートメントでは、アカウントにある既存の権限には影響しません。制限値の指定を行なうだけです。
既存の制限を削除するには、その値をゼロにセットします。たとえば、francis
が時間当たり接続できる回数の制限を削除するには、次のステートメントを使用します。
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_CONNECTIONS_PER_HOUR 0;
リソース使用のカウントは、アカウントの対象制限でリソースの値がゼロではないときに行なわれます。
サーバを実行すると、それぞれのアカウントのリソース使用回数のカウントが始まります。前の接続時間内で接続の制限値に到達すると、それ以後の接続はその時間が過ぎるまで接続できません。同様に、そのアカウントでクエリまたは更新の制限回数に到達すると、それ以後のクエリや更新はその時間が過ぎるまでできません。制限値に到達すると、それぞれでエラーが出ます。
リソースのカウントは、アカウント単位に行います。クライアント単にではありません。たとえば、アカウントのクエリ制限が 50 である場合、サーバへの接続を同時に 2 つのクライアントから行なっても、制限が 100 になるという具合に、制限値が上がることはありません。この 2 つの接続からのクエリは一緒にカウントします。
クエリ
キャッシュからのクエリ結果は、MAX_QUERIES_PER_HOUR
のカウントにはなりません。
現行の時間単位のリソース利用のカウントは、すべてのアカウントに対して、または別々にグローバルでリセットできます。
すべてのアカウントに対して現行のカウントをゼロにリセットするには、FLUSH
USER_RESOURCES
ステートメントを発行します。また、このリセット操作は
FLUSH PRIVILEGES
ステートメントや
mysqladmin reload
コマンドを使用して、権限テーブルのリロードを行なうことでもできます。
アカウント単位でカウントを別々にゼロにリセットするには、制限値を再セットします。これを行なうには、前述の方法のように、GRANT
USAGE
を使用して、その時点でアカウントにある値と同等の別の値を指定します。
カウントのリセットを行なっても、MAX_USER_CONNECTIONS
制限には影響しません。
すべてのカウントはサーバ起動時にゼロで始まりますが、再起動した場合に、そのカウントが持ち越しになることはありません。