経緯
サービスの移行を行うにあたってDBの移行をすることになったので。
方法と使ったもの
既存DBと新規DBをレプリケーションを使って同期をとることにした。
その際に、AWSのDMSを使って同期を取り続けることにした。
今回作ったもの
DMSで同期を取り続けた場合、定期的に既存のテーブルと、新規のテーブルの差分がなく、きちんとデータが移行されているかを確認するようにしたシェル。
ちなみにデータの中身は確認せず、各テーブル毎のcountを取得して比較するだけの簡単なシェル。
やっつけ的に作ったのであとは適宜直してください。
使い方
以下シェルスクリプトをコピペして、SOURCE_DB、SOURCE_OPTIONS、TARGET_DB、TARGET_OPTIONSを適宜変更して使ってください。
mysqlコマンドが使えることが大前提なのでご注意ください。
その他
ちなみにAWS的には移行ツールは提供してくれるけど、データの整合性チェックツールは提供してくれていないらしい。
今後してくれるかどうかは不明。ちぇっ・・・。
メイン
db_check.sh
SOURCE_DB="source_db"
SOURCE_OPTIONS="-u test -h source_host -D $SOURCE_DB -ppassword"
TARGET_DB="target_db"
TARGET_OPTIONS="-u test -h taget_host -D $TARGET_DB -ppassword"
# 指定したデーベースのテーブル名を全て取得
CMD="echo 'show tables;' | mysql $TARGET_OPTIONS -N"
TABLES=(`eval $CMD`)
# 各テーブルごとにcountの結果を比較
for table in "${TABLES[@]}"
do
SOURCE_SQL="select count(*) FROM $table"
SOURCE_CMD="echo '${SOURCE_SQL};' | mysql ${SOURCE_OPTIONS} | head -2 | tail -n 1"
SOURCE_TABLECOUNT=(`eval $SOURCE_CMD`)
TARGET_SQL="select count(*) FROM $table"
TARGET_CMD="echo '${TARGET_SQL};' | mysql ${TARGET_OPTIONS} | head -2 | tail -n 1"
TARGET_TABLECOUNT=(`eval $TARGET_CMD`)
if [ $SOURCE_TABLECOUNT = $TARGET_TABLECOUNT ]; then
echo "OK is $table"
else
echo "NOT EQUAL $table SOURCE_DB count $SOURCE_TABLECOUNT : TARGET_DB count $TARGET_TABLECOUNT"
fi
done