我正在尝试将所有数据库从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架构(可能使用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
如果这仍然过于激进,那么您将需要仅转储特定表中需要保留其内容的行(“user”和其他授权表).
以下内容没有任何担保,但这是我的收藏中的一个.它是一个单行读取“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