我正在尝试将所有数据库从一个500 to的RDS实例中转储到一个较小的实例(100 To)中。我保存了很多用户权限,所以我需要转储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'我只需要使用一个数据库快照来完成这个任务,但是我的实例的大小要小一些。
作为正常检查,我尝试将数据转储到原始实例中,但得到了相同的错误。有人能告诉我我在这里应该做什么吗?谢谢!
发布于 2014-03-14 02:22:11
您可能需要单独执行数据库,或者至少从现有文件中删除mysql模式(可能需要使用grep查找USE database;语句的行数,然后使用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如果这仍然太过咄咄逼人,那么您将只需要从需要保留其内容的特定表("user“和其他授予表)中转储行。
下面没有保修,但这是我收藏的。它是一条一行,上面写着"old_dumpfile.sql“和”new_dumpfile.sql“.但是,当它看到带有USE或CREATE DATABASE语句的mysql语句位于同一行时,就会关闭输出,并在下次在没有mysql的情况下再次打开该语句。如果转储文件中也包含DROP DATABASE语句,或者您可以使用--skip-add-drop-database生成一个新的dumpfile,则需要对其进行修改。
通过运行现有的转储文件,从本质上应该只删除该文件中的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发布于 2014-03-14 07:04:10
我想你可以尝试使用工作台。这里有一个迁移函数,首先创建较小的实例(100 it ),然后使用该迁移特性从500 it迁移到100 it的实例,看看它是否有效。
发布于 2014-03-14 07:30:13
我有太多的访问被拒绝的问题与RDS MySQL。因此,在RDS上运行命令是我的出路:
GRANT ALL ON `%`.* to '<type_the_usernamne_here>'@'%';我不确定这对你的情况是否有帮助。但对我来说,它一直是我的救世主。
https://stackoverflow.com/questions/22394444
复制相似问题