新しいテーブルとそれに付随するユーザーを作成する場合、通常は以下のコマンドを実行します。
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY "mypassword";
前述の2つのコマンドを実行した後に、FLUSH PRIVILEGES
コマンドを使用する必要があったことは一度もありません。ユーザーはログインしてデータベースを使用することができ、データベースに接続するPHPスクリプトも問題なく実行できます。しかし、ほとんどのチュートリアルでこのコマンドが使われているのを見ます。
FLUSH PRIVILEGES`コマンドが本当に必要なのはどんなときで、不要なのはどんなときでしょうか?
GRANT オプションで割り当てられた特権は、FLUSH PRIVILEGES を必要とせず、MySQL サーバはこれらの変更に気づき、グラント テーブルを直ちに再読み込みします。
以下のようなステートメントを使用してグラントテーブルを直接変更した場合は、次のようになります。 INSERT、UPDATE、DELETE などのステートメントを使用してグラントテーブルを直接変更した場合、その変更は特権のチェックに影響しません。 テーブルを再読み込みするように指示するまで、権限チェックに影響を与えません。 テーブルを再読み込みするように指示します。グラントテーブルを直接変更したが、リロードを忘れてしまった場合は テーブルをリロードするのを忘れてしまった場合、サーバーを再起動するまで変更は反映されません。これは 疑問に思われるかもしれません。
サーバーにグラントテーブルの再読み込みを指示するには、以下のコマンドを実行してください。 flush-privilegesを実行してください。これはFLUSHコマンドを発行することで可能です。 PRIVILEGES ステートメントを発行するか、mysqladmin flush-privileges または次のコマンドを実行します。 mysqladmin reload コマンド。
のようなステートメントを使用して間接的にグラントテーブルを変更する場合は、アカウント管理の GRANT、REVOKE、SET PASSWORD、RENAME USER などのステートメントを使用して間接的にグラントテーブルを変更した場合、サーバはこれらの変更に気付きます。 サーバーはこれらの変更に気付き、グラントテーブルをすぐにメモリにロードします。 再度すぐにロードします。
TL;DR。
FLUSH PRIVILEGES;は、
INSERT,
UPDATE,
DELETE` などのステートメントを使用してグラントテーブルを直接変更する場合にのみ使用する必要があります。
いくつか例を挙げてみましょう。例えば、'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;"を使用する必要はありません。 GRANT、REVOKE、SET PASSWORD、RENAME USERなどのアカウント管理文を使って間接的にグラントテーブルを変更した場合、サーバーはその変更に気付き、グラントテーブルをすぐにメモリにロードし直します。