大規模なMySQLデータベースをRDSに移行するにはどうすればよいですか?


8

私はすでにこれを少し調べました。Stack Overflowにも同様の質問があることに気づき、Amazon自身もここに助言を提供する有用なドキュメントを持っています。

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

私の懸念は次のとおりです。

Amazonではmysqldump、「1 GB未満」と定義されている「少量のデータ」のみに使用することを推奨しています。移行しようとしているデータベースが20GBを超えています。

mysqldumpただし、の良い点の1つは、--single-transactionフラグがあることです。これにより、特定の時点と一貫したDB状態を確保できます。

大量のデータの場合、Amazonの推奨は、データベースをフラット(CSVなど)ファイルにエクスポートし、それを使用mysqlimportしてそれらをRDSにインポートすることです。ただし、これを行う方法を知る最良の方法は、SELECT ... INTO OUTFILE一度に1つのテーブルのみを操作するコマンドを使用することです。もちろん、これの欠点は、の一貫性が保証されないことです--single-transaction

DB全体を一時的に停止することで一貫性を確保できると思います。でも、なるべく避けたいです。

  1. 大容量(> 20GB)データベースをフラットファイルにして使用できるようにする最良の方法は何mysqlimportですか?
  2. それが実際にSELECT ... INTO OUTFILEコマンドである場合、データベース内のすべてのテーブルをエクスポートするにはどうすればよいですか(一度に1つずつ実行する必要がないことが望ましい)。
  3. このすべてを通して一貫性を確保するための良い方法はありますか?

1
これはおそらくServerFaultに適しています。移行に投票

1
試したことがありますか?私は先日、mysqldumpを使用して40Gデータベースを処理しました-少し時間がかかります。しかし--opt、これがデフォルトです。強力なサーバーにリロードするのに6時間かかったと思いますが、トランジションはトランジションです... :)
gahooa

@gahooa:いい質問ですね。私はしていない、推奨されていなかったことをAmazonの文書から見えた主な理由は、まだそれを試してみました。しかし、私は先に進んでそれを行うかもしれません。

回答:


5

私は最近、RDSへの15GBの移行を理解するために多くの時間を費やしました。アマゾンフォーラムの1つで自分の用途に合わせて変更したスクリプトが見つかり、うまく機能しているように見えました。単一のトランザクションを実行できるかどうかはわかりませんが、ダンプ自体は実際の転送に比べて非常に高速です。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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.