我有一个包含许多数据库和用户的 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
。