LoginSignup
2
3

More than 5 years have passed since last update.

シェル上でMySQLの複数テーブルの内容が全く同じかどうかさっくりチェック

Last updated at Posted at 2016-08-17

テーブルの移行するときの使用前使用後のチェックとか、本番環境とテスト環境等でデータが一緒かとか見たいときにさっくりできるとカッコイイ!

マスターテーブルのようなレコード数そんな多くなかったり固定データだったりするものは目視でなんとかなっても、掲示板の書き込みテーブルやログのようなもりもり増えていくテーブルだとそうもいかなくなるんですよね。

mysqldumpを利用

テスト環境と本番環境にある nullpo_table とを比較し、
さらにテスト環境にある nullpo_table_backup も比較したいとします。

# テストのnullpo
~$ mysqldump -u{USER} -p {TEST_DATABASE} nullpo_table --compact | md5sum
46092d34d89418259d00215ce55a15f1  -

# 本番のnullpo
~$ mysqldump -u{USER} -p {PROD_DATABASE} nullpo_table --compact | md5sum
46092d34d89418259d00215ce55a15f1  -

# テストのもう一つのnullpo
~$ mysqldump -u{USER} -p {TEST_DATABASE} nullpo_table_backup --compact | sed "s/nullpo_table_backup/nullpo_table/g" | md5sum
46092d34d89418259d00215ce55a15f1  -

md5の出力は例です。全く一緒になればおめでとうございます。ハッシュなので1ミリでも内容が違うと全然違う結果になるため違っていたら一目瞭然です。

--compact オプションでいろいろ付いてくる設定や日付のような実行するたびに変わりそうな文字列をなくしてdumpした結果をmd5取って比較します。
AUTO_INCREMENT がずれたりする場合は --no-create-info を付与してINSERT文のみにしても良いかと。

データベース違いの場合はそのままでOKですが、テーブル名が異なる場合はダンプされるCREATE文やINSERT文についてくるテーブル名の部分が違うため、sedコマンドをかまして置換します。 (テーブルレコードの内容にテーブル名と同一の文字列があると意図しない置換が発生してしまうのでその場合は諦めましょう)

SELECT文を利用

こちらのほうがテーブル名に左右されないかもしれないし、ユーザ権限もSELECTのみで済むから楽かもしれない。

~$ echo "SELECT * FROM nullpo_table;" | mysql -u{USER} -p {TEST_DATABASE} | md5sum
7f8298d8d60e705fc31d787ea131f8b1  -

~$ echo "SELECT * FROM nullpo_table;" | mysql -u{USER} -p {PROD_DATABASE} | md5sum
7f8298d8d60e705fc31d787ea131f8b1  -

~$ echo "SELECT * FROM nullpo_table_backup;" | mysql -u{USER} -p {TEST_DATABASE} | md5sum
7f8298d8d60e705fc31d787ea131f8b1  -

SELECT文をいじれば特定のカラムだけチェックしたり、もっと複雑なJOIN結果が同じかとかもチェックできそうですね。

つぶやき

なんか最近こういう泥臭い作業多いな・・?

こういう小細工レパートリーを普段から増やしていくことがシステム運用上の事故を未然に防ぐ力につながるんです。きっとたぶん。

2
3
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
2
3