我有一个现有的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。
另一个用于 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)
作为对 @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)