如果 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
选项,则它不会读取授权表或实现任何访问控制。任何用户都可以连接并执行任何操作,这很不安全。 要使以这种方式启动的服务器读取表并启用访问检查,请刷新权限。