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

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

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

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

旧服务器:5.0.67-社区

新服务器:5.0.51a-24+lenny1

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

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

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

答案1

不要弄乱 mysql db。除了用户表之外,还有很多事情要做。最好的办法是“显示赠款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,然后将其通过管道传输到第二个 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 进行修改。

答案2

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

方法 1

您可以使用pt-show-赠款来自 Percona Toolkit

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

试一试 !!!

答案3

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;}'
}

答案4

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

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

相关内容