6.2.9 特权更改生效时

如果mysqld服务器在没有--skip-grant-tables选项的情况下启动,则它将在其启动 Sequences 中将所有授权 table 内容读入内存。内存 table 此时对访问控制有效。

如果使用帐户 Management 语句间接修改授权 table,则服务器会注意到这些更改并立即将授权 table 再次加载到内存中。 第 13.7.1 节“帐户 Management 对帐单”中描述了帐户 Management 对帐单。示例包括GRANTREVOKESET PASSWORDRENAME USER

如果直接使用诸如INSERTUPDATEDELETE之类的语句(不建议使用)来修改授权 table,则更改不会影响特权检查,直到您告诉服务器重新加载 table 或重新启动 table 为止。因此,如果您直接更改授权 table 但忘记重新加载它们,则这些更改“无效”,直到重新启动服务器。这可能会让您想知道为什么更改似乎没有效果!

要告诉服务器重新加载授权 table,请执行 flush-privileges 操作。这可以通过发出FLUSH PRIVILEGES语句或执行mysqladmin flush-privilegesmysqladmin reload命令来完成。

授予 table 的重新加载会影响每个现有 Client 端会话的特权,如下所示:

  • table 和列特权更改将在 Client 端的下一个请求中生效。

  • 数据库特权更改将在 Client 端下次执行USE db_name语句时生效。

Note

Client 端应用程序可以缓存数据库名称;因此,如果不实际更改为其他数据库,则可能看不到这种效果。

  • 全局特权和密码对于连接的 Client 端不受影响。这些更改仅在后续连接的会话中生效。

如果服务器使用--skip-grant-tables选项启动,则它不会读取授权 table 或实现任何访问控制。任何用户都可以连接并执行任何操作,这是不安全的。要使服务器由此开始读取 table 并启用访问检查,请清除特权。