当mysqld启动时,它会将所有授权表内容读入内存。内存中的表在此时对访问控制有效。
如果你修改授权表间接使用账户管理语句,如GRANT
, REVOKE
,SET PASSWORD
,或RENAME USER
,服务器注意到这些变化,并立即再次加载授权表到内存中。
如果你修改授权表直接使用的语句,例如 INSERT
, UPDATE
或者 DELETE
,你的变化对特权的效果检查,直到你重新启动服务器或告诉它重新加载表。如果您直接更改授权表,但忘记重新加载,那么在您重新启动服务器之前,您的更改将无效。这可能会让你想知道为什么你的改变似乎没有什么区别!
要告诉服务器重新载入授权表,请执行flush-privileges操作。这可以通过发出 FLUSH PRIVILEGES
语句或执行mysqladmin flush-privileges或mysqladmin reload 命令来完成。
授权表重新加载会影响每个现有客户端连接的权限,如下所示:
-
表和列权限更改将随客户端的下一个请求生效。
-
数据库特权更改将在下次客户机执行语句时生效。
USE
db_name
注意客户端应用程序可以缓存数据库名称 因此,在没有实际改变到不同的数据库的情况下,这种效果可能不可见。
-
连接的客户端不会影响全局权限和密码。这些更改仅对后续连接生效。
如果服务器启动该 --skip-grant-tables
选项,它不会读取授权表或实现任何访问控制。任何人都可以连接和做任何事情,这是不安全的。为了使服务器因此开始读取表并启用访问检查,请刷新权限