AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 8860
Accepted
Gareth
Gareth
Asked: 2009-05-16 22:08:46 +0800 CST2009-05-16 22:08:46 +0800 CST 2009-05-16 22:08:46 +0800 CST

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

  • 772

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

额外的一点是,新数据库上已经有几个现有的数据库,我如何导入旧服务器权限而不破坏现有的几个数据库。

旧服务器:5.0.67-community

新服务器:5.0.51a-24+lenny1

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

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

任何人都有合并两个“mysql”数据库的优雅方法吗?

linux mysql debian mysql-replication database-administration
  • 11 11 个回答
  • 146160 Views

11 个回答

  • Voted
  1. Best Answer
    Bruno Bronosky
    2009-05-28T07:51:35+08:002009-05-28T07:51:35+08:00

    不要弄乱mysql db。除了 users 表之外,还有很多事情要做。您最好的选择是“ SHOW GRANTS FOR”命令。我的 .bashrc 中有很多 CLI 维护别名和函数(实际上是我在 .bashrc 中获取的 .bash_aliases)。这个功能:

    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,该 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 修改的。

    • 177
  2. RolandoMySQLDBA
    2012-06-19T10:24:02+08:002012-06-19T10:24:02+08:00

    从 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
    

    试试看 !!!

    • 58
  3. rmldj
    2011-09-03T12:27:55+08:002011-09-03T12:27:55+08:00

    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;}'
    }
    
    • 15
  4. MrkiMile
    2012-05-02T04:08:10+08:002012-05-02T04:08:10+08:00

    或者,利用 percona-toolkit(以前的 maatkit)并使用pt-show-grants(或mk-show-grants)来实现该目的。无需繁琐的脚本和/或存储过程。

    • 7
  5. nedm
    2009-05-16T22:24:48+08:002009-05-16T22:24:48+08:00

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

    为避免删除现有权限,请确保附加而不是替换权限表(db、columns_priv、host、func 等)中的行。

    • 6
  6. Lenny
    2011-05-10T14:05:39+08:002011-05-10T14:05:39+08:00

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

    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
    

    然后通过理查兹 sed 命令管道输出以获取权限的备份。

    • 5
  7. Ibrahim Lawal
    2012-05-04T10:11:10+08:002012-05-04T10:11:10+08:00

    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";
        }
    }
    
    • 5
  8. Tom
    2011-09-03T17:16:22+08:002011-09-03T17:16:22+08:00

    虽然看起来@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
  9. Rony
    2010-09-07T15:03:57+08:002010-09-07T15:03:57+08:00

    使用以下代码创建一个 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上运行它:系统会要求您输入两次root密码,然后屏幕上将显示GRANTS SQL。****

    • 2
  10. sjas
    2016-04-14T10:33:21+08:002016-04-14T10:33:21+08:00

    One-liner 与 awesome 几乎相同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

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve