テーブルの移行するときの使用前使用後のチェックとか、本番環境とテスト環境等でデータが一緒かとか見たいときにさっくりできるとカッコイイ!
マスターテーブルのようなレコード数そんな多くなかったり固定データだったりするものは目視でなんとかなっても、掲示板の書き込みテーブルやログのようなもりもり増えていくテーブルだとそうもいかなくなるんですよね。
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結果が同じかとかもチェックできそうですね。
つぶやき
なんか最近こういう泥臭い作業多いな・・?
こういう小細工レパートリーを普段から増やしていくことがシステム運用上の事故を未然に防ぐ力につながるんです。きっとたぶん。