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

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

我有一个包含许多数据库和用户的 MySQL 安装,需要将它们迁移到新的 MySQL 安装。我可以使用 phpMyAdmin 导出然后导入数据库/表,但我不知道如何移动用户和权限。我该如何轻松完成此操作?

答案1

此类脚本将使用 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

如果您要从 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")

答案2

这将为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

您也可以下载并使用这些工具来做同样的事情:

试一试 !!!

答案3

我相信您应该能够通过备份和恢复数据库来迁移这些数据mysql

相关内容