2014-03-14 166 views
4

我试图从500Gb RDS实例中将所有数据库转储到较小的实例(100Gb)中。我保存了很多用户权限,因此我需要转储mysql表。导入时出现MySQL/Amazon RDS错误

mysqldump -h hostname -u username -ppassword --all-databases > dump.sql 

现在,当我尝试将数据上传到我的新实例,我得到以下错误:

mysql -h hostname -u username -ppassword < dump.sql` 
ERROR 1044 (42000) at line 2245: Access denied for user 'staging'@'%' to database 'mysql' 

我只想用一个数据库快照来做到这一点,但我的情况是在尺寸更小。

作为一个完整性检查,我试图将数据转储到原始实例,但得到了相同的错误。有人能告诉我应该在这里做什么吗?谢谢!

回答

2

您可能需要单独做数据库,或至少(可能使用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的USECREATE 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 
+0

感谢您的回复!我仍然无法动摇这个错误。我想我会手动进行导入。 –

+0

还有一个常见的原因是RDS恢复过程中与'DEFINER'声明有关的恢复(当然,低估的Perl是当天的英雄,再次,哈哈)http://serverfault.com/questions/555953/first-尝试迁移ec2-mysql-to-amazon-rds-no-going-well-super-privilege/555983#555983 –

+1

嘿@ Michael-sqlbot感谢你发布'perl'命令,它为我节省了很多的工作:) – Moe

1

我想你可以尝试使用workbench。这里有一个迁移功能,首先创建一个较小的实例(100GB),然后使用该迁移功能从500GB迁移到100GB,看看它是否有效。

1

我有太多访问被拒绝的RDS MySQL问题。所以在RDS下运行命令是我的出路:

GRANT ALL ON `%`.* to '<type_the_usernamne_here>'@'%'; 

我不确定这是否会对您的情况有所帮助。但对我来说,它一直是一个救世主。

+0

谢谢,但似乎在这种情况下工作。 –