fc2ブログ

無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

mysqldiff がない環境での MySQL データベース差分チェック方法

mysqldiff を使って継続的に MySQL のデータベーススキーマの差分をチェックする を読んで。

mysqldiff は知らなかったんだけど、こういう方法もある。

mydevdb が開発用DB、mydb が本番用DBとして、

$ diff -F "^CREATE" -c -I "Dump completed on" \
<(mysqldump mydevdb -no-data | sed 's/\(AUTO_INCREMENT=\)[0-9][0-9]*/\1/') \
<(mysqldump mydb --no-data | sed 's/\(AUTO_INCREMENT=\)[0-9][0-9]*/\1/')


mysqldump --no-data で、スキーマ定義だけを出力し、
diff コマンドで差分を取っている。

単純な diff だと、例えば 20個カラムを持つテーブルの
真ん中あたりのカラムで差分が出た場合、どのテーブルの
差分なのかわかりづらい。-F "^CREATE" は、差分があった場合、
前の行にさかのぼって、マッチする行を表示してくれる。

例えば下記の例だと、"CREATE TABLE `hoge_table` (" とあるので、
hoge_table テーブルの add_column カラムに差異あり、というのがわかる
(-F を指定しないと、どのテーブルなのか表示されない)。

*************** CREATE TABLE `hoge_table` (
*** 71,76 ****
--- 71,77 ----
`last_checked_datetime` datetime DEFAULT NULL,
`last_notified_datetime` datetime DEFAULT NULL,
`notified_last_days` int(11) DEFAULT NULL,
+ `add_column` int(11) DEFAULT NULL,
`insert_datetime` datetime NOT NULL,
`update_datetime` datetime NOT NULL,
PRIMARY KEY (`uid`,`domain_id`)

-F オプションは、context diff や unified diff でないと
効かないので、この例では -c で contxt diff にしてある。
"^CREATE" だけのパターンで大丈夫かはわからないが、もし
漏れがあったとしても、差分自体が出ないわけではないので
大事故にはならないでしょう。なお、diff -F は 1989年あたりから
あるっぽいので、Linux でも *BSD でも使えるはず。

さらに、ダンプ末尾の
 -- Dump completed on 2017-04-03 13:44:47
というのも毎回差分が出るので、grep -I で無視している。

AUTO_INCREMENT も差分が出てしまうが、
) ENGINE=InnoDB AUTO_INCREMENT=310458 DEFAULT CHARSET=utf8;
などと他に重要な情報が出ているので、
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;
というふうに AUTO_INCREMENT 部分だけつぶすようにしている。

コマンド <(サブコマンド1) <(サブコマンド2)
という書き方は、bash 専用。
詳しくは リダイレクト を。

ちなみに、5環境分まとめてチェックしたかったり、開発テーブルではこのカラムAが
5番目にあるけど、本番テーブルでは末尾にあるが、これは無視したいとか、細かな
要望がいろいろ出てきて、結局は自前でスクリプト組むことになる気もする。

あと、http://x68000.q-e-d.net/~68user/unix/pickup?mysql
という、MySQL に関することをひととおり盛り込んだ解説をちまちまと書いているので、
よかったら読んでください。

スポンサーサイト



PageTop