我已经研究了一点。我意识到 Stack Overflow 上也有类似的问题,亚马逊自己也有一份有用的文档,在这里提供建议:
http://aws.amazon.com/articles/2933
我的担忧如下:
亚马逊建议mysqldump
仅用于“少量数据”,他们将其定义为小于 1GB。我打算迁移的数据库超过 20GB。
mysqldump
然而,关于 的--single-transaction
一个好处是它具有标志,这使我能够确保与单个时间点一致的数据库状态。
对于大量数据,Amazon 的建议是将数据库导出为平面(例如 CSV)文件,然后用于mysqlimport
将这些文件导入 RDS。然而,我知道如何做到这一点的最好方法是通过SELECT ... INTO OUTFILE
命令,它一次只操作一张表。当然,这样做的缺点是它不提供--single-transaction
.
我想我可以通过暂时关闭整个数据库来确保一致性;但如果可能的话,我想避免这种情况。
mysqlimport
?SELECT ... INTO OUTFILE
命令,我如何导出数据库中的所有表(最好不必一次执行一个)?小智 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)
归档时间: |
|
查看次数: |
6168 次 |
最近记录: |