MySQL 5.6 及更早版本

最简单的方法是自动生成查询并将它们传递回 MySQL:

$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names

这将创建每个用户所需的 GRANT 语句,但是最后不会有分号作为分隔符。
要添加分号,我们可以使用 sed 命令(如果存在)或者在 Windows 上使用 FOR 构造:

使用 sed:

$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names | sed -e 's/$/;/'

使用 FOR:

FOR /F "usebackq delims=" %G IN (`mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names`) DO echo %G;

解决方法

我们可以使用的方法取决于我们使用的 MySQL 版本。

用于导出到 MySQL 5.7 及更高版本

在 MySQL 5.7 中,使用 GRANT 语句创建用户已被弃用,而在 MySQL 8.0 中根本不再支持它。
而是使用 CREATE USER 语句创建用户。

我们可以使用以下查询生成 CREATE USER 语句:

$ mysql --silent --skip-column-names --execute "SELECT CONCAT('CREATE USER ', QUOTE(user), '@', QUOTE(host),  IF(LENGTH(plugin) > 0, CONCAT(' IDENTIFIED WITH ', plugin, IF(LENGTH(password) > 0, CONCAT(' AS ', QUOTE(password)), '')), IF(LENGTH(password) > 0, CONCAT(' IDENTIFIED BY PASSWORD ', QUOTE(password)), '')), ';') FROM mysql.user"

GRANT 语句可以如上导出,但我们需要删除设置密码的部分。
例如,在 Linux 上,我们可以使用 sed 执行此操作,例如:

$ mysql --skip-column-names --execute "SELECT CONCAT('SHOW GRANTS FOR ', QUOTE(user), '@', QUOTE(host), ';') FROM mysql.user" | mysql --skip-column-names | sed -e "s/ IDENTIFIED BY PASSWORD '.*'//"

重要提示:该示例仅用于备份要导入 MySQL 5.7 或者更高版本的用户。
在 MySQL 5.6 及更早版本中,这将创建密码为空的用户!

问题

如何以 CREATE USER 和/或者 GRANT 的语句备份用户及其权限?

MySQL - 以CREATE USER 和/或者 GRANT 语句的形式备份 用户的权限
www. On IT Road .com

MySQL 5.7 及更高版本

在 MySQL 5.7 及更高版本中,推荐的用户备份方式是使用 mysqlpump。
这具有通过 -users 选项备份用户及其权限的内置支持:

$ mysqlpump --exclude-databases=% --users
日期:2020-09-17 00:11:11 来源:oir作者:oir