如何导出和导入现有用户(具有权限!)

Wit*_*eld 41 mysql mysqldump

我有一个现有的MySQL实例(测试),包含2个数据库和一些用户,每个用户对每个数据库具有不同的访问权限.

我现在需要复制其中一个数据库(进入生产)与之关联的用户.

复制数据库很简单:

出口:

mysqldump --no-data --tables -u root -p secondb >> secondb_schema.sql
Run Code Online (Sandbox Code Playgroud)

进口:

mysql -u root -p -h localhost secondb < secondb_schema.sql
Run Code Online (Sandbox Code Playgroud)

我没有找到,但是,导出和导入一个简单的方法的用户,在命令行(内部或外部的MySQL).

如何从命令行导出和导入用户


更新:到目前为止,我已经找到了完成此操作的手动(因此容易出错)的步骤:

-- lists all users
select user,host from mysql.user;
Run Code Online (Sandbox Code Playgroud)

然后找到它的补助金:

-- find privilege granted to a particular user
show grants for 'root'@'localhost'; 
Run Code Online (Sandbox Code Playgroud)

然后使用上面"show grants"命令的结果中列出的授权手动创建用户.

我更喜欢更安全,更自动化的方式.有吗?

小智 37

我发现导出用户的最简单方法之一是使用Percona的工具pt-show-grants.Percona工具套件免费,易于安装,易于使用,并提供大量文档.这是向所有用户或特定用户显示的简单方法.它以SQL格式列出了所有授权和输出.我将举例说明如何显示test_user的所有授权:

shell> pt-show-grants --only test_user
Run Code Online (Sandbox Code Playgroud)

该命令的输出示例:

GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASSWORD '*06406C868B12689643D7E55E8EB2FE82B4A6F5F4';
GRANT ALTER, INSERT, LOCK TABLES, SELECT, UPDATE ON `test`.* TO 'test_user'@'%';
Run Code Online (Sandbox Code Playgroud)

我通常将输出重新编译成文件,以便我可以编辑我需要的内容,或者将其加载到mysql中.

或者,如果您不想使用Percona工具并且想要转储所有用户,则可以以这种方式使用mysqldump:

shell> mysqldump mysql --tables user db > users.sql
Run Code Online (Sandbox Code Playgroud)

注意: - flush特权不适用于此,因为整个数据库未被转储.这意味着您需要手动运行它.

shell> mysql -e "FLUSH PRIVILEGES"
Run Code Online (Sandbox Code Playgroud)


Var*_*pta 21

mysql -u<user> -p<password> -h<host> -e"select concat('show grants for ','\'',user,'\'@\'',host,'\'') from mysql.user" > user_list_with_header.txt
sed '1d' user_list_with_header.txt > ./user.txt
while read user; do  mysql -u<user> -p<password> -h<host> -e"$user" > user_grant.txt; sed '1d' user_grant.txt >> user_privileges.txt; echo "flush privileges" >> user_privileges.txt; done < user.txt
awk '{print $0";"}'  user_privileges.txt >user_privileges_final.sql
rm user.txt user_list_with_header.txt user_grant.txt user_privileges.txt
Run Code Online (Sandbox Code Playgroud)

上面的脚本将在linux环境中运行,输出将是user_privileges_final.sql,您可以在要复制用户权限的新mysql服务器中导入.


Pab*_*una 20

在 mysql 5.7 及更高版本中你可以使用它。

mysqlpump -uroot -p${yourpasswd} --exclude-databases=% --users
Run Code Online (Sandbox Code Playgroud)

这将生成一个 sql 格式的输出,您可以将其重定向到 mysql_users.sql。

请注意,它是mysqlpump而不是 mysqldump。

  • 这是最好的解决方案。mysqlpump 是一个原生 mysql 工具,不需要额外的 shell 脚本,它会发出 CREATE USER 和 GRANT 语句,这是您在 mysql 8 中需要的。但是您可能需要添加 `--exclude-users=mysql.%,root` 。 (5认同)
  • 不是 mysqldump 而是 mysqlpump...泵不是转储 (2认同)

Ser*_*kin 7

另一个用于 Linux 的 bash one-liner,您可以使用它来代替 Percona 工具:

mysql -u<user> -p<password> -h<host> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), coalesce(password, authentication_string) from user where not user like 'mysql.%'" | while read usr pw ; do echo "GRANT USAGE ON *.* TO $usr IDENTIFIED BY PASSWORD '$pw';" ; mysql -u<user> -p<password> -h<host> -N -e "SHOW GRANTS FOR $usr" | grep -v 'GRANT USAGE' | sed 's/\(\S\)$/\1;/' ; done
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要把它强行写成一行?答案几乎难以辨认 (4认同)

shg*_*Inc 7

作为对 @Sergey-Podushkin 答案的补充,这个 shell 脚本代码对我有用:

mysql -u<user> -p<password> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), authentication_string from user where not user like 'root'" | while read usr pw ; do mysql -u<user> -p<password> -N -e "SHOW GRANTS FOR $usr" | sed 's/\(\S\)$/\1;/'; done 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对于 MySql 8 来说是完美的,Sergey 的在版本 8 中不起作用,因为 mysql.user 表中没有字段密码 (3认同)