如果 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
注意客户端应用程序可能会缓存数据库名称;因此,如果不实际更改到其他数据库,它们可能看不到此效果。
静态全局权限和密码对已连接的客户端没有影响。这些更改仅在后续连接的会话中生效。动态全局权限的更改将立即应用。(有关静态权限和动态权限之间区别的信息,请参阅静态权限与动态权限。)
会话中活动角色集的更改将立即生效,但仅限于该会话。SET ROLE
语句执行会话角色激活和停用(请参阅第 15.7.1.11 节,“SET ROLE 语句”)。
如果服务器在启动时指定了 --skip-grant-tables
选项,则它不会读取授权表或实现任何访问控制。任何用户都可以连接并执行任何操作,这是不安全的。要使以此方式启动的服务器读取表并启用访问检查,请刷新权限。