it-swarm.cn

如何从MySQL导出特权,然后导入到新服务器?

我知道如何使用mysqldump导出/导入数据库,这很好,但是如何将特权获取到新服务器中。

值得一提的是,新数据库上已经有几个现有数据库,我该如何导入旧服务器特权而又不破坏已有的两个数据库。

旧服务器:5.0.67-社区

新服务器:5.0.51a-24 + lenny1

编辑:我从旧服务器上获得了数据库'mysql'的转储,现在想知道与新服务器上的'mysql'数据库合并的正确方法。

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

有人有一种优雅的方式来合并两个“ mysql”数据库吗?

90
Gareth

不要搞乱mysql db。除了users表外,还有更多的事情要做。最好的选择是“ SHOW GRANTS FOR”命令。我的.bashrc(实际上是我的.bashrc中的.bash_aliases)中有很多CLI维护别名和功能。该功能:

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

第一个mysql命令使用SQL生成有效的SQL,该管道通过管道传递给第二个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进行了修改。

171
Bruno Bronosky

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

方法1

您可以使用Percona工具包中的 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

试试看 !!!

48
RolandoMySQLDBA

理查德·布罗诺斯基(Richard Bronosky)的回答对我非常有用。非常感谢!!!

这是一个对我有用的小变化。这对于转移用户很有帮助,例如运行phpmyadmin的两个Ubuntu安装之间。只需为除root,phpmyadmin和debian-sys-maint之外的所有用户转储特权即可。然后是代码

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

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

7
MrkiMile

您可以mysqldump'mysql'数据库并导入到新数据库;将需要flush_privileges或重新启动,并且您肯定要首先备份现有的mysq数据库。

为了避免删除现有的特权,请确保在特权表(db,columns_priv,Host,func等)中添加而不是替换行。

5
nedm

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";
    }
}
4
Ibrahim Lawal

您也可以将其作为存储过程来执行:

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命令通过管道输出以获取特权的备份。

4
Lenny

@Richard Bronosky的答案似乎是正确的答案,但在尝试将一组数据库从一台服务器迁移到另一台服务器后,我遇到了这个问题,解决方案要简单得多:

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

server2$ mysql -u root -p < dbdump.sql

此时,如果我以root登录,则mysql.user表中包含了我期望的所有内容,那么我的所有数据都是可见的,但是我无法以其他任何用户身份登录,并且假设我必须重新发出GRANT语句,发现了这个问题。

但是,事实证明,只需重新启动mysql服务器,即可使mysql.*表中的更新特权生效:

server2$ Sudo restart mysql

希望这可以帮助其他人完成应该是一个简单的任务!

3
Tom

使用以下代码创建Shell脚本文件:

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上运行它:将要求您输入两次根密码,然后在屏幕上显示GRANTS SQL。

2
Rony

单行代码的效果与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用户的密码。

0
sjas