您可能需要单独做数据库,或至少(可能使用grep
以找到USE database;
语句行计数删除现有文件mysql的架构,然后sed
修剪出麻烦的部分,或见下文),然后生成一个与MySQL架构中的表结构或专有RDS触发器无关的转储文件。
我还没有尝试将完整的mysql模式恢复到RDS实例上,但是我当然可以看到它会在RDS中进行自定义并且缺少SUPER
特权,但它看起来像这些选项至少,mysqldump应该让你关闭。
mysqldump --no-create-info # don't try to drop and recreate the mysql schema tables
--skip-triggers # RDS has proprietary triggers in the mysql schema
--insert-ignore # write INSERT IGNORE statements to ignore duplicates
--databases mysql # only one database, "mysql"
--skip-lock-tables # don't generate statements to LOCK TABLES/UNLOCK TABLES during restore
--single-transaction # to avoid locking up the source instance during the dump
如果这仍然过于激进,那么你就需要诉诸反倾销只能从特定的表,其内容则需要保留(“用户”和其他授权表)中的行。
以下没有任何担保,但是它是我收藏的一件。它是一个读取“old_dumpfile.sql”并写入“new_dumpfile.sql”的单线程,但是当它在同一行上看到带有mysql的USE
或CREATE DATABASE
语句并将其切换回来时,将输出关闭下一次这样的声明在没有`mysql`的情况下发生。如果您的转储文件中还包含DROP DATABASE
语句,或者您可以使用--skip-add-drop-database
生成新的转储文件,则需要修改该文件。
通过这种方式运行现有的转储文件本质上应该只从该文件中删除mysql模式,允许您先手动轻松恢复它,然后让数据库数据的其余部分更流畅地恢复。
perl -pe 'if (/(^USE\s|^CREATE\sDATABASE.*\s)`mysql`/) { $x = 1; } elsif (/^USE\s`/ || /^CREATE\sDATABASE/) { $x = 0; }; $_ = "" if $x;' old_dumpfile.sql > new_dumpfile.sql
感谢您的回复!我仍然无法动摇这个错误。我想我会手动进行导入。 –
还有一个常见的原因是RDS恢复过程中与'DEFINER'声明有关的恢复(当然,低估的Perl是当天的英雄,再次,哈哈)http://serverfault.com/questions/555953/first-尝试迁移ec2-mysql-to-amazon-rds-no-going-well-super-privilege/555983#555983 –
嘿@ Michael-sqlbot感谢你发布'perl'命令,它为我节省了很多的工作:) – Moe