13.5 权限变更的影响
当mysqld启动时,将读取所有权限表的内容到内存中。后续所有用户对MySQL服务器的访问权限都是基于内存中保存的这些值进行授予的。
● 如果在MySQL服务器运行期间使用账户管理语句(如GRANT、REVOKE、SET PASSWORD或RENAME USER)间接修改了权限表,则服务器会立即将权限表中的内容重新加载到内存中。
● 如果在MySQL服务器运行期间使用INSERT、UPDATE或DELETE等语句直接修改了权限表,那么对权限表的更改不会立即生效,除非重新启动服务器或者使用FLUSH PRIVILEGES语句或mysqladmin flush-privileges|reload等命令来重新加载权限表。
对于权限表的重新加载,需要注意如下事项。
● 对于表级别和字段级别权限,修改并重新加载权限表之后,对于已经建立的客户端连接,会在对表、字段的下一个请求中生效。对于新建连接,第一个请求即生效。
● 对于库级别权限,修改并重新加载权限表之后,对于已经建立的客户端连接,会在下一次使用USE DB_NAME语句时生效。对于新建连接,第一个请求即生效。
提示:如果回收了某用户对某库的权限,但客户端已经建立连接且当前默认库正好是已回收权限的库,那么若客户端不使用USE DB_NAME语句切换默认库,则可能无法感知到库级别权限发生了变化。
● 对于全局性权限和密码的修改,不影响已建立连接的客户端,只对重新连接或新建连接的客户端生效。
如果服务器启动时使用了--skip-grant-tables选项,则服务器不会读取权限表,也不会进行任何访问权限控制,这个时候任何人都可以免密码登录数据库并做任何事情。所以,除非维护时间窗口,否则禁止启用--skip-grant-tables选项。如果要重新加载权限表,则无须重新启动服务器,只需要执行FLUSH PRIVILEGES语句即可。