When mysqld starts, it reads all grant table contents into memory. The in-memory tables become effective for access control at that point.
If you modify the grant tables indirectly using an
account-management statement, the server notices these changes and
loads the grant tables into memory again immediately.
Account-management statements are described in
Account Management Statements. Examples include
If you modify the grant tables directly using statements such as
DELETE (which is not recommended),
your changes have no effect on privilege checking until you either
restart the server or tell it to reload the tables. If you change
the grant tables directly but forget to reload them, your changes
have no effect until you restart the server.
This may leave you wondering why your changes seem to make no
To tell the server to reload the grant tables, perform a
flush-privileges operation. This can be done by issuing a
FLUSH PRIVILEGES statement or by
executing a mysqladmin flush-privileges or
mysqladmin reload command.
A grant table reload affects privileges for each existing client connection as follows:
Table and column privilege changes take effect with the client's next request.
Database privilege changes take effect the next time the client executes a
Client applications may cache the database name; thus, this effect may not be visible to them without actually changing to a different database.
Global privileges and passwords are unaffected for a connected client. These changes take effect only for subsequent connections.
If the server is started with the
--skip-grant-tables option, it does
not read the grant tables or implement any access control. Anyone
can connect and do anything, which is
insecure. To cause a server thus started to read the
tables and enable access checking, flush the privileges.