我怎样才能从MySQL导出权限,然后导入到新的服务器?

我知道如何使用mysqldump导出/导入数据库,这很好,但我如何获得新的服务器的权限。

为了加分,现在已经有一些现有的数据库了,如何导入旧的服务器权限而不需要join已有的数据库。

旧服务器:5.0.67-社区

新服务器:5.0.51a-24 + lenny1

编辑:我已经从旧服务器的数据库'mysql'的转储,现在想知道正确的方式来合并新的服务器上的'MySQL'数据库。

我尝试了一个使用phpMyAdmin的直接“导入”,最后出现了一个关于重复的错误(我已经手动移植了一个错误)。

任何人都有一个合并两个“MySQL”数据库的优雅方式?

不要乱用MySQL数据库。 还有更多的不仅仅是用户表。 你最好的select是“ SHOW GRANTS FOR”命令。 在我的.bashrc中有很多CLI维护别名和函数(实际上是我在.bashrc中的.bash_aliases源代码)。 这个function:

mygrants() { mysql -B -N $@ -e "SELECT DISTINCT CONCAT( 'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';' ) AS query FROM mysql.user" | \ mysql $@ | \ sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}' } 

第一个mysql命令使用SQL来生成有效的SQL,并通过pipe道连接到第二个mysql命令。 然后输出通过sed来添加相当的评论。

命令中的$ @将允许您将其称为:mygrants –host = prod-db1 –user = admin –password = secret

你可以像这样使用你的完整unix工具包:

 mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret 

这是移动用户的正确方法。 你的MySQL ACL是用纯SQL修改的。

有两种从MySQL实例中提取SQL授权的方法

方法#1

您可以使用来自Percona Toolkit的pt-show-grants

 MYSQL_CONN="-uroot -ppassword" pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql 

方法#2

你可以用下面的模拟pt-show-grants

 MYSQL_CONN="-uroot -ppassword" mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql 

这两种方法都会产生MySQL授予的纯SQL转储。 剩下要做的就是在新服务器上执行脚本:

 mysql -uroot -p -A < MySQLUserGrants.sql 

试一试 !!!

Richard Bronosky的回答对我来说非常有用。 非常感谢!!!

这是一个小的变化,对我有用。 例如,在运行phpmyadmin的两个Ubuntu安装之间传输用户很有帮助。 只需要除root,phpmyadmin和debian-sys-maint之外的所有用户的权限转储。 那么代码是

 mygrants() { mysql -B -N $@ -e "SELECT DISTINCT CONCAT( 'SHOW GRANTS FOR ''', user, '''@''', host, ''';' ) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \ mysql $@ | \ sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}' } 

或者,使用percona-toolkit(以前的maatkit)并使用pt-show-grants (或mk-show-grants )来达到这个目的。 不需要繁琐的脚本和/或存储过程。

你可以mysqldump'mysql'数据库并导入到新的; flush_privileges或重启将是必需的,你一定要先备份现有的mysq数据库。

为了避免删除您现有的权限,请确保追加而不是replace权限表(db,columns_priv,host,func等)中的行。

你也可以做一个存储过程:

 CREATE PROCEDURE spShowGrants() READS SQL DATA COMMENT 'Show GRANT statements for users' BEGIN DECLARE v VARCHAR(64) CHARACTER SET utf8; DECLARE c CURSOR FOR SELECT DISTINCT CONCAT( 'SHOW GRANTS FOR ', user, '@', host, ';' ) AS query FROM mysql.user; DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END; OPEN c; WHILE TRUE DO FETCH c INTO v; SET @v = v; PREPARE stmt FROM @v; EXECUTE stmt; END WHILE; CLOSE c; END 

并用它来调用它

 $ mysql -p -e "CALL spShowGrants" mysql 

然后通过Richards sed命令通过pipe道输出获取特权的备份。

虽然看起来理查德·布罗诺斯基(Richard Bronosky)的回答是正确的,但是在尝试将一组数据库从一台服务器迁移到另一台服务器之后,我遇到了这个问题,解决scheme也简单得多:

 server1$ mysqldump -u root -p --all-databases > dbdump.sql server2$ mysql -u root -p < dbdump.sql 

在这一点上,我所有的数据都是可见的,如果我以root身份login, mysql.user表中包含了我所期望的所有内容,但是我无法login其他任何用户,并且发现这个问题,假设我想必须重新发放GRANT语句。

但是,事实certificate,mysql服务器只需要重新启动mysql.*表中的更新权限即可生效:

 server2$ sudo restart mysql 

希望能帮助别人实现这个简单的任务!

如何PHP脚本? 🙂

查看此脚本的源代码,您将拥有列出的所有权限:

 //connect mysql_select_db("mysql", mysql_connect("localhost","root","")); //create grants select statements $rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user"); //iterate through grants while ($row=mysql_fetch_array($rs)) { //run grant query $rs2 = mysql_query($row['query']); //iterate through results while($row2 = mysql_fetch_array($rs2)){ //print results echo $row2[0] . ";\n\n"; } } 

使用以下代码创build一个shell脚本文件:

############################################## 3

 echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", host, \"';\") AS query FROM mysql.user; " > script.sql echo "*** You will be asked to enter the root password twice ******" mysql -u root -p < script.sql > output.sql ; cat output.sql | grep show > output1.sql ; rm output.sql -f ; mysql -u root -p < output1.sql > output.sql ; clear echo "-----Exported Grants-----" cat output.sql ; rm output.sql output1.sql -f echo "-------------------------" rm script.sql -f 

****然后像这样在shell上运行它:你将被要求input两次root密码,然后GRANTS SQL将会显示在屏幕上。

一行内容与真棒pt-show-grants几乎一样:

 mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g' 

仅基于unix工具,不需要额外的软件。

从一个bash shell中执行,假设你有一个工作的.my.cnf ,你的mysql root用户的密码可以被读取。