如何将现有 MySQL 数据库导入 Amazon RDS?
9 回答
我在 AWS 文档上找到了这个页面,它解释了如何使用 mysqldump 并将其通过管道传输到 RDS 实例中。
这是他们的示例代码(在命令行/shell/ssh 中使用):
mysqldump acme | mysql --host=hostname --user=username --password acme
acme
您要迁移的数据库在哪里, hostname
/username
是您的 RDS 实例中的数据库。
您可以像连接常规 mysql 服务器一样连接到 RDS,只需确保按照此论坛发布的内容将您的 EC2 IP 添加到您的安全组。
我必须包含本地 mysqldump 的密码,所以我的命令最终看起来更像这样:
mysqldump --password=local_mysql_pass acme | mysql --host=hostname --user=username --password acme
FWIW,我刚刚完成了数据库的迁移。我将此参考用于创建用户和授予权限等mysql 命令。
希望这可以帮助!
导入数据有两种方式:
mysqldump
:如果你的数据小于1GB,你可以直接使用mysqldump命令将你的数据导入RDS。mysqlimport
: 如果您的数据大小超过 1GB 或任何其他格式,您可以将数据压缩成平面文件并使用 sqlimport 命令上传数据。
GoSquared Engineering 帖子的快速摘要:
配置+引导
- 选择实例处于最低负载时的维护时段和备份时段
- 是否选择多可用区(强烈推荐用于自动故障转移和维护)
- 启动您的 RDS 实例
- 配置安全组,以便您的应用等可以访问新实例
数据迁移+准备
- 如果您还没有启用 binlogging
- 在旧实例上运行
mysqldump --single-transaction --master-data=2 -C -q dbname -u username -p > backup.sql
以转储当前数据 - 运行
mysql -u username -p -h RDS_endpoint DB_name < backup.sql
以将数据导入您的 RDS 实例(这可能需要一段时间,具体取决于您的数据库大小) - 同时,您当前的生产实例仍在服务查询 - 这就是
master-data=2
binlogging的用武之地 - 在您的 backup.sql 文件中,您将在顶部有一行看起来像
CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000003′, MASTER_LOG_POS=350789121;
backup.sql
以 SQL 文件的形式获取差异mysqlbinlog /var/log/mysql/mysql-bin.000003 --start-position=350789121 --base64-output=NEVER > output.sql
- 在您的 RDS 实例上运行这些查询以更新它
cat output.sql | mysql -h RDS_endpoint -u username -p DB_name
- 通过在最新文件
end_log_pos
的末尾查找来获取新的日志位置。output.sql
- 获取自上次以来的差异
output.sql
(如步骤 6)并重复步骤 7 + 8。
实际迁移
- 准备好使用新 RDS 实例快速部署所有应用程序
- 获取最新
end_log_pos
信息output.sql
- 在旧实例上运行
FLUSH TABLES WITH READ LOCK;
以停止所有写入 - 开始使用新的 RDS 实例部署您的应用程序
- 从上面运行步骤 6-8 以使用对旧服务器的最后查询更新 RDS 实例
结论
使用此方法,您将有少量时间(取决于部署应用程序所需的时间 + MySQL 实例服务的写入次数 - 可能只有一两分钟),而旧服务器拒绝写入,但是您将有一个一致的迁移,没有读取停机时间。
完整而详细的帖子解释了我们(GoSquared)如何以最少的停机时间(包括错误调试)迁移到 RDS:https ://engineering.gosquared.com/migrating-mysql-to-amazon-rds 。
我完全同意@SanketDangi。
有两种方法可以做到这一点,一种方法是建议使用mysqldump
or 或mysqlimport
。
我已经看到在云上恢复数据损坏时会产生问题的情况。
然而,如今在云上导入应用程序变得更加容易。您尝试通过 ravello 将您的数据库服务器上传到公共云。
您可以使用 ravello 在 Amazon 上导入数据库服务器本身。
披露:我为 ravello 工作。
最简单的例子:
# export local db to sql file:
mysqldump -uroot -p —-databases qwe_db > qwe_db.sql
# Now you can edit qwe_db.sql file and change db name at top if you want
# import sql file to AWS RDS:
mysql --host=proddb.cfrnxxxxxxx.eu-central-1.rds.amazonaws.com --port=3306 --user=someuser -p qwe_db < qwe_db.sql
适用于 Mysql 的 AWS RDS 客户数据导入指南可在此处获得: http: //aws.amazon.com/articles/2933
- 创建包含要加载的数据的平面文件
- 停止访问目标数据库实例的任何应用程序
- 创建数据库快照
- 禁用 Amazon RDS 自动备份
- 使用 mysqlimport 加载数据
- 再次启用自动备份
如果您使用的是终端,这对我有用:
mysqldump -u local_username -plocal_password local_db_name | mysql -h myRDS-at-amazon.rds.amazonaws.com -u rds-username -prds_password_xxxxx remote_db_name
然后我使用 MYSQL WorkBench(免费下载)来检查它是否正常工作,因为在按下提交后命令行是静态的,我可能将 -v 放在末尾以查看它的输出
注意:-p后面没有空格
这是我已经完成并成功的步骤。
获取所需数据库的 MySQLdump。
mysqldump -u 用户名 -p 数据库名 --single-transaction --quick --lock-tables=false >databasename-backup-$(date +%F).sql
(不要忘记将用户名替换为 root - 大多数情况下,以及 databasename -> 您要迁移到 RDS 的数据库的 Db 名称)
出现提示后,输入您的密码。
完成后,从您的 MySQL 服务器登录到 RDS 实例(确保将安全组配置为允许从 Ec2 连接到 RDS)
mysql -h 主机地址 -P 3306 -u rdsusername -p
(不要忘记将 hostaddress 替换为您的 RDS 实例的地址,并将 rdsusernmae 替换为您的 RDS 实例的用户名,当提示输入密码时)
您可以在 – Connectivity & security -> Endpoint & port 下的 RDS Database From AWS Console 下找到该主机地址。
登录后,使用 MySQL 命令创建数据库:
创建数据库数据库名称;\q
在 RDS 中创建数据库后,导入在步骤 1 中创建的 SQL 文件:
mysql -h 主机地址 -u rdsusername -p 数据库名 < 备份文件.sql
这应该将 SQL 文件导入 RDS 并将内容恢复到新数据库中。