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


8

我已经研究了一下。我意识到在Stack Overflow上也有类似的问题,Amazon本身也提供了一个有用的文档,在此提供了建议:

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. 有什么好的方法可以确保所有这些方面的一致性?

1
这可能更适合ServerFault。投票决定要迁移

1
您是否尝试过-只是想知道?前几天,我刚刚使用mysqldump处理了一个40G数据库-花费一些时间。但是--opt是默认设置,它可以加快处理速度。我认为我们花了6个小时将其重新加载到强大的服务器上,但是转换是转换... :)
gahooa 2012年

@gahooa:好问题。我还没有尝试过,主要是因为从Amazon文档中似乎不建议这样做。但我可能会继续这样做。

Answers:


5

我最近花了很多时间试图找出向RDS过渡15GB的时间。最终在我修改为自己的用途的一个亚马逊论坛上找到了一个脚本,并且看起来运行良好。我不确定是否可以进行单笔交易,但转储本身与实际转移相比非常快。我认为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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.