MySQL/Amazon RDS导入时出错

MySQL/Amazon RDS导入时出错,mysql,amazon-web-services,amazon-rds,Mysql,Amazon Web Services,Amazon Rds,我正在尝试将500Gb RDS实例中的所有数据库转储到较小的实例(100Gb)中。我保存了很多用户权限,因此需要转储mysql表 mysqldump -h hostname -u username -ppassword --all-databases > dump.sql 现在,当我尝试将数据上载到新实例时,出现以下错误: mysql -h hostname -u username -ppassword < dump.sql` ERROR 1044 (42000) at line

我正在尝试将500Gb RDS实例中的所有数据库转储到较小的实例(100Gb)中。我保存了很多用户权限,因此需要转储
mysql

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'
mysql-h hostname-u username-ppassword
我只想使用数据库快照来实现这一点,但我的实例较小


作为一种合理性检查,我尝试将数据转储到原始实例中,但得到了相同的错误。有人能告诉我在这里该做什么吗?谢谢

您可能需要单独处理数据库,或者至少从现有文件中删除mysql模式(可能使用
grep
查找
USE数据库的行数;
语句,然后使用
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”。。。但是,当它看到
USE
CREATE DATABASE
语句在同一行上有'mysql',则关闭输出,下次出现这种语句时,如果语句中没有'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

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

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

GRANT ALL ON `%`.* to '<type_the_usernamne_here>'@'%';
将“%”.*上的所有内容授予“@%”;

我不确定这对你是否有帮助。但它一直是我的救星。

谢谢你的回复!我仍然不能;不要动摇这个错误。我想我只需要手动导入。在RDS上还原时拒绝访问的另一个常见原因与
DEFINER
声明有关(当然,被低估的Perl是当今的英雄,再次,lol)嘿@Michael sqlbot感谢您发布
Perl
命令,它为我节省了很多工作:)