如何使用 MySQL 复制用户权限?

Nat*_*man 12 mysql permissions

我有一个包含许多数据库和用户的 MySQL 安装,我需要迁移到新的 MySQL 安装。我可以使用 phpMyAdmin 导出然后导入数据库/表,但我不知道有什么可以移动用户和权限。我怎样才能轻松做到这一点?

Zor*_*che 18

像这样的脚本将使用 mysql cli 客户端打印出一系列您需要用来重新创建用户帐户的授权语句。如果您将数据库凭据存储在 .my.cnf 中,则此命令将最有效

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done
Run Code Online (Sandbox Code Playgroud)

如果您从一个版本的 mysql 跳转到另一个版本,您可能希望使用它而不是简单地转储 mysql 数据库。mysql 数据库的架构偶尔会更新。

这也将允许您选择要重新创建的帐户,如果有一些您想消除的杂物。


我最近在一个在名称中包含空格的用户上使用它,这让我感到困惑read,因为 IFS 默认包含空格字符作为分隔符。我的新的和改进的命令,在系统奇怪的用户名上似乎更有效。

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
Run Code Online (Sandbox Code Playgroud)


Rol*_*DBA 5

SHOW GRANTS;这将为每个用户创建一个文件。

然后,回显每个用户的内容SHOW GRANTS;并在每一行添加一个分号。

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -AN < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql
Run Code Online (Sandbox Code Playgroud)

您还可以下载并使用这些工具来执行相同的操作:

试一试 !!!