システム開発において、
・本番
・検品(ステージング)
・開発
と環境が別れている事は通常よくあることであり、それにともないDBの環境もそれぞれ存在することとなります。
開発体制が小規模であったり、管理ルールが整っていない時などに、それぞれのDB環境に差異が発生している事が多々あります。
その差異を視覚化し、容易に把握するための方法をご紹介します。
※今回使用した環境
・mysql : 5.6.40
https://dev.mysql.com/downloads/windows/installer/5.6.html
・ローカル環境:windows 10
・比較ツール:WinMerge 2.14.0
https://winmerge.org/downloads/?lang=ja
1.差分抽出SQL の用意
SELECT '### COLUMN情報 #########################' AS '';
SELECT TABLE_NAME
, COLUMN_NAME
-- , ORDINAL_POSITION
, COLUMN_TYPE
, COLUMN_DEFAULT
, IS_NULLABLE
, COLUMN_KEY
, IFNULL( COLLATION_NAME , '') COLLATION_NAME
, IFNULL( CHARACTER_SET_NAME , '') CHARACTER_SET_NAME
, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @DB_DATABASE
ORDER BY TABLE_NAME , COLUMN_NAME
;
SELECT '### INDEX情報 ##########################' AS '';
SELECT TABLE_NAME
, INDEX_NAME
, SEQ_IN_INDEX
, COLUMN_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = @DB_DATABASE
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX
;
mysql では、DBの情報を INFORMATION_SCHEMA 内に保持しており、その情報を出力しています。
※上記例では、カラムの順番を考慮せず、カラム名順で評価しています。
2.差分抽出SQL の実行
上記 SQL をファイルに保存して、コマンドで実行します。
※ここでは、「db-columns.sql」と命名します。
mysql -e "set @DB_DATABASE='DB名'; source db-columns.sql ;" > 環境.txt
※接続情報等は、省略させて頂いています。
こちらの実行した結果は以下の通りとなります。
※ mysql のバージョンに関わらず、全てのバージョンで稼働すると思います。
### COLUMN情報 #########################
TABLE_NAME COLUMN_NAME COLUMN_TYPE COLUMN_DEFAULT IS_NULLABLE COLUMN_KEY COLLATION_NAME CHARACTER_SET_NAME COLUMN_COMMENT
hoge birthday date NULL YES
hoge key int(11) NULL NO PRI
hoge name varchar(50) NULL YES MUL utf8_general_ci utf8
hoge sex char(1) 0 YES utf8_general_ci utf8
### INDEX情報 ##########################
TABLE_NAME INDEX_NAME SEQ_IN_INDEX COLUMN_NAME
hoge hoge_i1 1 name
hoge hoge_i1 2 birthday
hoge PRIMARY 1 key
3.SQL実行結果の比較
上記、環境毎に出力し、その結果を winmerge 等で比較する事が出来ます。
例えば、ローカルの環境と比較。
上記は、以下の テーブルを比較した結果なのですが、
-- 左のDDL
CREATE TABLE `hoge` (
`key` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
`sex` CHAR(1) NULL DEFAULT '0',
`birthday` DATE NULL DEFAULT NULL,
PRIMARY KEY (`key`),
INDEX `hoge_i1` (`name`, `birthday`)
)
-- 右のDDL
CREATE TABLE `hoge` (
`key` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
`sex` VARCHAR(1) NULL DEFAULT '0',
`birthday` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`key`),
INDEX `hoge_i1` (`name`)
)
WinMarge 上で、差分行が色分けされているのが判るかと思います。
・DATE型 と TIMESTAMP 型 の差異
・CHAR型 と VARCHAR型 の差異
・INDEX の差異
※Oracle ですと、「USER_TAB_COLUMNS」・「USER_IND_COLUMNS」テーブルを使用すると、同じ情報が取得できます。
author k.tomita