flush privilege 本意

官方文档 http://dev.mysql.com/doc/refman/5.7/en/privilege-changes.html

什么时候用flush privilege?它的作用是什么?为什么要用?
翻译了mysql 5.7的官方文档7.2.6节

从字面上看,flush privilege意为刷新权限,以前只是光用这个命令,没有去想这条命令的意义。

当启动mysqld之后,它将所有的权限表内容读进内存中。在那时候,在内存中的表就对控制访问生效了。

如果你用账户管理命令例如grant,revoke,set password, rename user等非直接的修改权限表,mysql服务端会注意到这些改变,并且立即再次的把权限表加载进内存。

如果你用命令例如insert,update,delete直接修改权限表,权限改表将不会生效直到重启服务或者告诉它重载权限表。如果你直接修改了权限表,但是忘记重载了,你的改表将不起作用直到重启服务。这可能导致你疑惑为什么你的改变看起来没有任何不同。

为了告诉服务端重载权限表,运行一个flush-privileges操作。这可以通过发出一个flush privileges声明或者执行一个mysqladmin flush-privileges或者mysqladmin reload命令来完成。

权限表被重载后将会对每一个存在的客户端连接生效,如下:

  • 表和列权限改变会对客户端的下一次请求生效
  • 数据库权限改变在下一次客户端执行use db_name声明后生效

    注意
    
    客户端应用可能缓存数据库名称;因此,在没有明确改变一个不同的数据库或者刷新权限情况下,这个影响可能不明显。
    
  • 对于已连接的客户端,全局的权限和密码不受影响。这些改变只对以后的连接有效。

如果服务端加了–skip-grant-tables选项启动,它将不会读取权限表和执行任何访问控制。任何人都可以连接并且做任何事,这是不安全的。因此为了服务端能开始读取表,使访问检查有效,flush privileges刷新权限吧。