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