LoginSignup
8
12

More than 5 years have passed since last update.

DB移行時に既存DBと新規DBのデータの差分をチェックする方法

Posted at

経緯

サービスの移行を行うにあたって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
8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12