web-dev-qa-db-ja.com

2つのデータベースの構造を比較しますか?

2つの巨大なデータベースの完全なデータベース構造を比較できるかどうかを尋ねたかったのです。 2つのデータベースがあります。1つは開発データベースで、もう1つは本番データベースです。コードの一部をリリースする前に、本番データベースに変更を加えるのを忘れることがありました。その結果、本番データベースの構造が同じではなくなったため、何かをリリースするとエラーが発生しました。 2つを比較したり、同期したりする方法はありますか?

23
streetparade

フリーウェアである http://www.mysqldiff.org/ はどうですか?

5
Anders Abel

コマンドラインを使用できます。

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
17
Gere

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をサポートしています。

スクリーンショット(表を比較) Compare tables

16
Dmitry

Red-Gate SQL Compareは、これを行うための優れたツールです。私はこれを何年も使用して大成功を収めてきました。それは私に何千時間もの仕事を節約しました。

また、データを比較するツールもあります。上記の製品はスキーマを比較しています。

www-red-gate.com

5
Randy Minder

--no-dataを使用してそれらをダンプし、ファイルを比較することができます。

大きな厄介なグローバルロックを回避するために、本番データベースで--lock-tables = 0オプションを使用することを忘れないでください。

同じmysqldumpバージョンを使用している場合(開発システムと本番システムには同じソフトウェアが必要ですよね?)、多かれ少なかれ同一のファイルが出力されることが期待されます。表はアルファ順であるため、単純な差分で簡単に不一致が表示されます。

4
MarkR

現在、この種の質問に答えるために、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
    );

このスクリプトが、アプリケーション以外のソリューションを探している人々にも役立つことを願っていますが、スクリプトの使用法です。乾杯

3
Avidos

Linux上のmysqlの場合、phpmyadmin経由「data」なしで構造のみのデータベースをエクスポートすることができます。

データベース全体のエクスポートオプションをスクロールして、「データ」の選択を解除し、出力をテキストに設定します。比較する両方のデータベースをエクスポートします。

次に、お好みのプログラム/サイトのファイル比較で、データベースの2つのテキストファイル出力を比較します。このソリューションでは同期は引き続き手動ですが、これは構造の違いを比較して見つけるのに効果的です。

2
user945389

SchemaCrawler は、データベース構造を比較できる、プラットフォームに依存しない無料のツールです。 2つのデータベースが同時にオンラインである必要はありません。データベース構造を人間が読めるテキストファイルに保存できます。コマプリソンは、標準の差分ツールを使用して実行されます。

本番システムが古くなっていないことを確認するために、ビルドおよびデプロイプロセスの一部として比較を自動化することをお勧めします。

1
Sualeh Fatehi

Mysqldiffを試しましたが成功しなかったので、mysqlworkbenchのcompare関数に注目して、将来の読者を豊かにしたいと思います。 http://dev.mysql.com/doc/workbench/en/wb-database-diff-report.html#c130

[モデル]タブを開いて[データベース]メニューを選択すると、[スキーマの比較]オプションが表示されます。このオプションを使用して、2つの異なるサーバー上の2つの異なるスキーマ、同じサーバー上の2つのスキーマ、またはスキーマとモデルを比較できます。私がまだ試したことがない他の多くのオプション。

1
JoSSte

おそらく、 データベース比較 のようなツールが必要になります。

1
davek

Gemini Delta-SQL Difference Manager for.NETを確認してください。無料のベータ版をダウンロードできますが、完全版は公開からわずか数日です。

行レベルのデータの違いは比較しませんが、テーブル、関数、sprocなどを比較します...そしてそれは非常に高速です。 (新しいバージョンの1.4は、10秒以上かかった私がテストした他のツールと比較して、4秒未満で1kのSprocをロードして比較します。)

誰もが正しいですが、RedGateは素晴らしいツールを作ります。

1
Shaun

データベースに応じて、使用可能なツールは異なります。

これにはEmbarcaderoのER/Studioを使用します。比較とマージ機能があります。

Toad for MySQLなど、他にも比較できるものはたくさんあります。 Red-Gateの提案にも同意しますが、MySQLには使用しませんでした。

1
codenheim

私はついにこれを解決するために「mysql構造比較」と呼ばれる簡単なツールを使用しました。これはWindows専用ですが、無料で機能します。

0
Walty Yeung

MySQLを使用している場合は、無料のツールがあります DB Matcher 2の構造をアップロードします.SQLファイルとそれはあなたに違いを与えます

https://dbmatcher.com

0
Moses Schwartz

MSSQLを使用している場合は、間違いなく AdeptSQL を使用します。これは見栄えが最も悪いですが、私が試したものの中で最も才能のあるデータベース比較ツールです。構造とデータの両方を比較できます。これは、一方のデータベースに存在するが他方には存在しないテーブルを示し、一般的なテーブルの構造とデータを比較し、2つを同期するスクリプトを生成できます。無料ではありませんが、30日間の試用版があります(私が覚えている限り)

0
aslisabanci

SQL Examiner Suite 201 MySQLデータベース(スキーマとデータの両方)を比較します

0
SQLDev

SQLサーバーのdbForgeスキーマ比較 を試してください。任意のデータベーススキーマを比較および同期できます。迅速、簡単、常に正しい結果を提供します。それがデータベース上でどのように飛ぶかを見てください!

0
Devart