MySQL の Flush Privileges が本当に必要なときは?

新しいテーブルとそれに付随するユーザーを作成する場合、通常は以下のコマンドを実行します。

CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY "mypassword";

前述の2つのコマンドを実行した後に、FLUSH PRIVILEGESコマンドを使用する必要があったことは一度もありません。ユーザーはログインしてデータベースを使用することができ、データベースに接続するPHPスクリプトも問題なく実行できます。しかし、ほとんどのチュートリアルでこのコマンドが使われているのを見ます。

FLUSH PRIVILEGES`コマンドが本当に必要なのはどんなときで、不要なのはどんなときでしょうか?

ソリューション

GRANT オプションで割り当てられた特権は、FLUSH PRIVILEGES を必要とせず、MySQL サーバはこれらの変更に気づき、グラント テーブルを直ちに再読み込みします。

MySQLドキュメントより

以下のようなステートメントを使用してグラントテーブルを直接変更した場合は、次のようになります。 INSERT、UPDATE、DELETE などのステートメントを使用してグラントテーブルを直接変更した場合、その変更は特権のチェックに影響しません。 テーブルを再読み込みするように指示するまで、権限チェックに影響を与えません。 テーブルを再読み込みするように指示します。グラントテーブルを直接変更したが、リロードを忘れてしまった場合は テーブルをリロードするのを忘れてしまった場合、サーバーを再起動するまで変更は反映されません。これは 疑問に思われるかもしれません。

サーバーにグラントテーブルの再読み込みを指示するには、以下のコマンドを実行してください。 flush-privilegesを実行してください。これはFLUSHコマンドを発行することで可能です。 PRIVILEGES ステートメントを発行するか、mysqladmin flush-privileges または次のコマンドを実行します。 mysqladmin reload コマンド。

のようなステートメントを使用して間接的にグラントテーブルを変更する場合は、アカウント管理の GRANT、REVOKE、SET PASSWORD、RENAME USER などのステートメントを使用して間接的にグラントテーブルを変更した場合、サーバはこれらの変更に気付きます。 サーバーはこれらの変更に気付き、グラントテーブルをすぐにメモリにロードします。 再度すぐにロードします。

解説 (3)

TL;DR

FLUSH PRIVILEGES;は、INSERT,UPDATE,DELETE` などのステートメントを使用してグラントテーブルを直接変更する場合にのみ使用する必要があります。

解説 (1)

いくつか例を挙げてみましょう。例えば、'alex'というユーザーのパスワードを変更するとします。このパスワードはいくつかの方法で変更できます。例えば、以下のようになります。

mysql> update* user set password=PASSWORD('test!23') where user='alex'; 
mysql> flush privileges;

ここではUPDATEを使用しています。グラントテーブルに直接INSERT、UPDATE、DELETEを使用した場合、グラントテーブルを再読み込みするためにFLUSH PRIVILEGESを使用する必要があります。

または、次のようにパスワードを変更することもできます。

mysql> set password for 'alex'@'localhost'= password('test!24');

ここでは、"FLUSH PRIVILEGES;&quotを使用する必要はありません。 GRANT、REVOKE、SET PASSWORD、RENAME USERなどのアカウント管理文を使って間接的にグラントテーブルを変更した場合、サーバーはその変更に気付き、グラントテーブルをすぐにメモリにロードし直します。

解説 (1)