8.2.13 权限更改生效
如果 mysqld 服务器在不使用 --skip-grant-tables
选项的情况下启动,它将在启动序列中读取所有授权表的内容。这些内存表在该点上将生效,以供访问控制。
如果您使用账户管理语句间接修改授权表,服务器将立即注意这些变化并将授权表加载到内存中。账户管理语句在 第15.7.1节,“账户管理语句” 中有描述。示例包括 GRANT
、REVOKE
、SET PASSWORD
和RENAME USER
。
如果您使用语句,如 INSERT
、UPDATE
或DELETE
(这不推荐),这些变化将对权限检查无效,直到您告诉服务器重新加载表或重新启动它。因此,如果您直接修改授权表,但忘记重新加载它们,变化将在重新启动服务器时生效。这可能会使您感到这些变化无效!
要告诉服务器重新加载授权表,执行一个 FLUSH PRIVILEGES
语句或执行一个 mysqladmin flush-privileges 或 mysqladmin reload 命令。
授权表重新加载对每个现有客户端会话的影响如下:
-
表和列权限变化将在客户端的下一个请求中生效。
-
数据库权限变化将在客户端执行下一个
USE
语句时生效。db_name
Note客户端应用程序可能会缓存数据库名称;因此,这个影响可能不会立即对它们可见,除非实际地切换到不同的数据库。
-
静态全局权限和密码将对已连接的客户端无效。这些变化将在后续连接的会话中生效。关于静态和动态权限的区别,请参阅 静态 versus 动态权限。)
会话中活动角色的更改立即生效,但仅限于该会话。SET ROLE
语句执行会话角色的激活和停用(请参见第15.7.1.11节,“SET ROLE 语句”)。
如果服务器使用--skip-grant-tables
选项启动,它将不读取授权表或实施访问控制。任何用户都可以连接并执行任何操作,这非常不安全。要使服务器启动时读取表并启用访问检查,请刷新权限。