如何将大型 MySQL 数据库迁移到 RDS?

Dan*_*Tao 8 mysql mysqldump

我已经研究了一点。我意识到 Stack Overflow 上也有类似的问题,亚马逊自己也有一份有用的文档,在这里提供建议:

http://aws.amazon.com/articles/2933

我的担忧如下:

亚马逊建议mysqldump仅用于“少量数据”,他们将其定义为小于 1GB。我打算迁移的数据库超过 20GB。

mysqldump然而,关于 的--single-transaction一个好处是它具有标志,这使我能够确保与单个时间点一致的数据库状态。

对于大量数据,Amazon 的建议是将数据库导出为平面(例如 CSV)文件,然后用于mysqlimport将这些文件导入 RDS。然而,我知道如何做到这一点的最好方法是通过SELECT ... INTO OUTFILE命令,它一次只操作一张表。当然,这样做的缺点是它不提供--single-transaction.

我想我可以通过暂时关闭整个数据库来确保一致性;但如果可能的话,我想避免这种情况。

  1. 将我的大型(> 20GB)数据库放入平面文件以便我可以使用的最佳方法是什么mysqlimport
  2. 如果确实是SELECT ... INTO OUTFILE命令,我如何导出数据库中的所有表(最好不必一次执行一个)?
  3. 有什么好的方法可以确保所有这些的一致性吗?

小智 5

我最近花了很多时间试图找出 15GB 到 RDS 的过渡。最终在我根据自己的用途修改的亚马逊论坛之一上找到了一个脚本,并且似乎运行良好。我不确定您是否可以进行单笔交易,但与实际传输相比,转储本身非常快。我认为 15GB 只花了我 12 分钟的时间来转储,所以即使它没有单个事务选项,我认为你不会有很长的时间来发生不一致。我不确定这对你来说是否足够好,但我发现这个解决方案比平面文件方法更优雅。

#!/bin/bash

declare -a dbs=(dbname1 dbname2 dbname3 dbname4);

j=0
while [ $j -lt 4 ];
#4 is the number of dbs
do

echo "Dumping ${dbs[$j]} DB"
time mysqldump --order-by-primary --host=sourcehost --user=sourceuser --password=sourcepass `echo ${dbs[$j]}` > /tmp/`echo ${dbs[$j]}`.sql
echo "Adding optimizations to ${dbs[$j]}"
awk 'NR==1{$0="SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;\n"$0}1' /tmp/`echo ${dbs[$j]}`.sql >> /tmp/`echo ${dbs[$j]}`X.sql
mv /tmp/`echo ${dbs[$j]}`X.sql /tmp/`echo ${dbs[$j]}`.sql
echo "SET unique_checks=1; SET foreign_key_checks=1; COMMIT;" >> /tmp/`echo ${dbs[$j]}`.sql
echo "Copy ${dbs[$j]} into RDS"
time mysql --host=yourrds.rds.amazonaws.com --user=rdsuser --password=rdspassword `echo ${dbs[$j]}` < /tmp/`echo ${dbs[$j]}`.sql &

j=$(($j+1))
done 
Run Code Online (Sandbox Code Playgroud)