我知道如何使用 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 等) 中的行。