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


12

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

Answers:


17

这样的脚本将使用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")

3

这将为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} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

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

试试看 !!!


2

我相信您应该能够通过备份和还原mysql数据库来迁移此数据。


特别是mysql.user表
Coops 2010年

2
您需要确保两个MySQL实例都运行相同的主版本,否则,您将需要运行与目标MySQL服务器捆绑在一起的升级脚本。
Maxwell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.