2つの巨大なデータベースの完全なデータベース構造を比較できるかどうかを尋ねたかったのです。 2つのデータベースがあります。1つは開発データベースで、もう1つは本番データベースです。コードの一部をリリースする前に、本番データベースに変更を加えるのを忘れることがありました。その結果、本番データベースの構造が同じではなくなったため、何かをリリースするとエラーが発生しました。 2つを比較したり、同期したりする方法はありますか?
フリーウェアである http://www.mysqldiff.org/ はどうですか?
コマンドラインを使用できます。
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -d --no-data -u root -p dbName2>file2.sql
diff file1.sql file2.sql
MySQLデータベースの場合、次のクエリを使用してビューとテーブル(列名と列タイプ)を比較できます。
SET @firstDatabaseName = '[first database name]';
SET @secondDatabaseName = '[second database name]';
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
LEFT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t2.tableRowType IS NULL
UNION
SELECT * FROM
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @firstDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t1
RIGHT JOIN
(SELECT
CONCAT(cl.TABLE_NAME, ' [', cl.COLUMN_NAME, ', ', cl.COLUMN_TYPE, ']') tableRowType
FROM information_schema.columns cl, information_schema.TABLES ss
WHERE
cl.TABLE_NAME = ss.TABLE_NAME AND
cl.TABLE_SCHEMA = @secondDatabaseName AND
ss.TABLE_TYPE IN('BASE TABLE', 'VIEW')
ORDER BY
cl.table_name ) AS t2 ON t1.tableRowType = t2.tableRowType
WHERE
t1.tableRowType IS NULL;
UIでツールを使用したい場合は、このスクリプトを使用することもできます https://github.com/dlevsha/compalex テーブル、ビュー、キーなどを比較できます。
Compalexは、2つのデータベーススキーマを比較するための軽量スクリプトです。 MySQL、MS SQL Server、PostgreSQLをサポートしています。
Red-Gate SQL Compareは、これを行うための優れたツールです。私はこれを何年も使用して大成功を収めてきました。それは私に何千時間もの仕事を節約しました。
また、データを比較するツールもあります。上記の製品はスキーマを比較しています。
www-red-gate.com
--no-dataを使用してそれらをダンプし、ファイルを比較することができます。
大きな厄介なグローバルロックを回避するために、本番データベースで--lock-tables = 0オプションを使用することを忘れないでください。
同じmysqldumpバージョンを使用している場合(開発システムと本番システムには同じソフトウェアが必要ですよね?)、多かれ少なかれ同一のファイルが出力されることが期待されます。表はアルファ順であるため、単純な差分で簡単に不一致が表示されます。
現在、この種の質問に答えるために、information_schema
コンテンツを使用して列、データ型、およびテーブルを比較するスクリプトを作成しました。
SET @database_current = '<production>';
SET @database_dev = '<development>';
-- column and datatype comparison
SELECT a.TABLE_NAME, a.COLUMN_NAME, a.DATA_TYPE, a.CHARACTER_MAXIMUM_LENGTH,
b.COLUMN_NAME, b.DATA_TYPE, b.CHARACTER_MAXIMUM_LENGTH
FROM information_schema.COLUMNS a
LEFT JOIN information_schema.COLUMNS b ON b.COLUMN_NAME = a.COLUMN_NAME
AND b.TABLE_NAME = a.TABLE_NAME
AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
AND (
b.COLUMN_NAME IS NULL
OR b.COLUMN_NAME != a.COLUMN_NAME
OR b.DATA_TYPE != a.DATA_TYPE
OR b.CHARACTER_MAXIMUM_LENGTH != a.CHARACTER_MAXIMUM_LENGTH
);
-- table comparison
SELECT a.TABLE_SCHEMA, a.TABLE_NAME, b.TABLE_NAME
FROM information_schema.TABLES a
LEFT JOIN information_schema.TABLES b ON b.TABLE_NAME = a.TABLE_NAME
AND b.TABLE_SCHEMA = @database_current
WHERE a.TABLE_SCHEMA = @database_dev
AND (
b.TABLE_NAME IS NULL
OR b.TABLE_NAME != a.TABLE_NAME
);
このスクリプトが、アプリケーション以外のソリューションを探している人々にも役立つことを願っていますが、スクリプトの使用法です。乾杯
Linux上のmysqlの場合、phpmyadmin経由「data」なしで構造のみのデータベースをエクスポートすることができます。
データベース全体のエクスポートオプションをスクロールして、「データ」の選択を解除し、出力をテキストに設定します。比較する両方のデータベースをエクスポートします。
次に、お好みのプログラム/サイトのファイル比較で、データベースの2つのテキストファイル出力を比較します。このソリューションでは同期は引き続き手動ですが、これは構造の違いを比較して見つけるのに効果的です。
SchemaCrawler は、データベース構造を比較できる、プラットフォームに依存しない無料のツールです。 2つのデータベースが同時にオンラインである必要はありません。データベース構造を人間が読めるテキストファイルに保存できます。コマプリソンは、標準の差分ツールを使用して実行されます。
本番システムが古くなっていないことを確認するために、ビルドおよびデプロイプロセスの一部として比較を自動化することをお勧めします。
Mysqldiffを試しましたが成功しなかったので、mysqlworkbenchのcompare関数に注目して、将来の読者を豊かにしたいと思います。 http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c130
[モデル]タブを開いて[データベース]メニューを選択すると、[スキーマの比較]オプションが表示されます。このオプションを使用して、2つの異なるサーバー上の2つの異なるスキーマ、同じサーバー上の2つのスキーマ、またはスキーマとモデルを比較できます。私がまだ試したことがない他の多くのオプション。
おそらく、 データベース比較 のようなツールが必要になります。
Gemini Delta-SQL Difference Manager for.NETを確認してください。無料のベータ版をダウンロードできますが、完全版は公開からわずか数日です。
行レベルのデータの違いは比較しませんが、テーブル、関数、sprocなどを比較します...そしてそれは非常に高速です。 (新しいバージョンの1.4は、10秒以上かかった私がテストした他のツールと比較して、4秒未満で1kのSprocをロードして比較します。)
誰もが正しいですが、RedGateは素晴らしいツールを作ります。
データベースに応じて、使用可能なツールは異なります。
これにはEmbarcaderoのER/Studioを使用します。比較とマージ機能があります。
Toad for MySQLなど、他にも比較できるものはたくさんあります。 Red-Gateの提案にも同意しますが、MySQLには使用しませんでした。
私はついにこれを解決するために「mysql構造比較」と呼ばれる簡単なツールを使用しました。これはWindows専用ですが、無料で機能します。
MySQL
を使用している場合は、無料のツールがあります DB Matcher 2の構造をアップロードします.SQL
ファイルとそれはあなたに違いを与えます
MSSQLを使用している場合は、間違いなく AdeptSQL を使用します。これは見栄えが最も悪いですが、私が試したものの中で最も才能のあるデータベース比較ツールです。構造とデータの両方を比較できます。これは、一方のデータベースに存在するが他方には存在しないテーブルを示し、一般的なテーブルの構造とデータを比較し、2つを同期するスクリプトを生成できます。無料ではありませんが、30日間の試用版があります(私が覚えている限り)
SQL Examiner Suite 201 MySQLデータベース(スキーマとデータの両方)を比較します
SQLサーバーのdbForgeスキーマ比較 を試してください。任意のデータベーススキーマを比較および同期できます。迅速、簡単、常に正しい結果を提供します。それがデータベース上でどのように飛ぶかを見てください!