停止这种毫无意义的冲水! 停止这种毫无意义的冲水!

停止这种毫无意义的冲水!

MySQL Dolphin

如果你在谷歌上搜索十个随机的关于设置数据库的 MySQL/MariaDB 教程,十个里有九个都会是这样的:

创建数据库 somedb;
创建用户“someone”@“localhost”,用户名为“secret”;
GRANT ALL on somedb.* to 'someone'@'localhost';
冲洗特权;

你猜怎么着?最后那条命令完全没必要。

无数 MySQL 用户(从专业 DBA 到只需要在表中存储一些杂物的开发人员)都认为,授予权限后必须刷新权限。但事实并非如此。

让我们回到遥远的MySQL 3.26 时代。那大约是 2001 年。当时地球地壳刚刚开始冷却。我们在手册中读到:

当直接修改授权表时,必须告诉服务器重新加载它们(使用 FLUSH PRIVILEGES),以便权限更改生效。

MySQL 4中,有一个名为“权限更改何时生效”的章节对此进行了说明:

如果使用 GRANT、REVOKE 或 SET PASSWORD 等语句间接修改授权表,服务器会注意到这些更改,并立即将授权表重新加载到内存中。

如果您直接使用 INSERT、UPDATE 或 DELETE 等语句修改授权表,则在重启服务器或指示服务器重新加载表之前,您的更改不会对权限检查产生任何影响。要手动重新加载授权表,请执行 FLUSH PRIVILEGES 语句或 mysqladmin flush-privileges 或 mysqladmin reload 命令。

如果您直接修改授权表但忘记重新加载,则在重启服务器之前,您的更改不会生效。这可能会让您疑惑为什么您的更改似乎没有任何效果!

本手册中继续介绍了这种语言(可惜没有最后的妙语)。

所以规则很简单:

  • 如果您使用 GRANT 命令授予权限,GRANT 会自动处理任何必要的刷新操作。您无需手动刷新权限。这是通常的做法。
  • 如果您对授权表使用 INSERT、UPDATE 或 DELETE 操作(当前手册称“不建议这样做”),则必须手动执行 FLUSH TABLES 操作。

换句话说,如果你做了非常规的事情——说明书上明确指出不要这样做!——那么你就需要手动冲洗。否则,你无需担心。

我实在想不出有什么理由需要直接修改表格,不过我相信肯定存在一些特殊情况,会有人在评论中告诉我们。