web-dev-qa-db-ja.com

2つのMySQLデータベースを比較する

私は現在MySQLデータベースを使用してアプリケーションを開発しています。

データベースの構造はまだ流動的で、開発の進行中に変更されます(私は自分のローカルコピーを変更し、テストサーバーだけに残します)。

データベースの2つのインスタンスを比較して、変更があったかどうかを確認する方法はありますか?

テストはテストデータの入力を開始するので、現在は以前のテストサーバーデータベースを単に破棄するだけで問題ありませんが、少し面倒なことがあります。
同じことがもっともっとそうではなく生産の後半で再び起こるでしょう...

できれば自動的にスクリプトを作成して変更することで、運用データベースを徐々に変更する簡単な方法はありますか?


回答に記載されているツール:

368

小規模なデータベースを使用している場合は、両方のデータベースでSQLスクリプトを生成するために--skip-commentsおよび--skip-extended-insertオプションを指定してmysqldumpを実行すると、SQLスクリプトに対してdiffを実行しても問題なく動作します。

コメントをスキップすることで、mysqldumpコマンドを実行した時間のような無意味な違いを避けることができます。 --skip-extended-insertコマンドを使用することで、各行がそれぞれ独自のinsertステートメントで挿入されるようにします。これにより、単一の新規または変更されたレコードが将来のすべてのinsertステートメントで連鎖反応を引き起こす可能性があるという状況が解消されます。これらのオプションを指定して実行すると、コメントなしでより大きなダンプが生成されるため、これはおそらく本番環境では実行したいことではありませんが、開発には問題ありません。使用したコマンドの例を以下に示します。

mysqldump --skip-comments --skip-extended-insert -u root -p dbName1>file1.sql
mysqldump --skip-comments --skip-extended-insert -u root -p dbName2>file2.sql
diff file1.sql file2.sql
210
Jared

Toad for MySQL にはデータとスキーマの比較機能があり、同期スクリプトも作成されると思います。何よりも、それはフリーウェアです。

99
Anson Smith

私は Navicat と呼ばれるソフトウェアを使います。

  • Liveデータベースをテストデータベースに同期します。
  • 2つのデータベース間の違いを示してください。

それはお金がかかり、それはwindowsとmacだけです、そしてそれは気の利いたUIを持っています、しかし私はそれが好きです。

20
seanyboy

2つのデータベースを同期するためのSQLを生成する SQLyog (市販)には、スキーマ同期ツールがあります。

enter image description here

17
Yury Litvinov

機能比較リストから... MySQL Workbench は、コミュニティエディションでSchema DiffとSchema Synchronizationを提供しています。

13
andyhky

確かに多くの方法があります、しかし私の場合私はdumpとdiffコマンドを好みます。それで、これはJaredのコメントに基づくスクリプトです:

#!/bin/sh

echo "Usage: dbdiff [user1:pass1@dbname1] [user2:pass2@dbname2] [ignore_table1:ignore_table2...]"

dump () {
  up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
  mysqldump --opt --compact --skip-extended-insert -u $user -p$pass $dbname $table > $2
}

rm -f /tmp/db.diff

# Compare
up=${1%%@*}; user=${up%%:*}; pass=${up##*:}; dbname=${1##*@};
for table in `mysql -u $user -p$pass $dbname -N -e "show tables" --batch`; do
  if [ "`echo $3 | grep $table`" = "" ]; then
    echo "Comparing '$table'..."
    dump $1 /tmp/file1.sql
    dump $2 /tmp/file2.sql
    diff -up /tmp/file1.sql /tmp/file2.sql >> /tmp/db.diff
  else
    echo "Ignored '$table'..."
  fi
done
less /tmp/db.diff
rm -f /tmp/file1.sql /tmp/file2.sql

フィードバックは大歓迎です:)

13
develCuy

dbSolo、有料ですが、この機能はあなたが探しているものかもしれません http://www.dbsolo.com/help/compare.html

Oracle、Microsoft SQL Server、Sybase、DB2、Solid、PostgreSQL、H2、MySQLで動作します。 alt text

12
jmpeace

スキーマ(データではなく)を比較するだけでPerlにアクセスできる場合は、mysqldiffが機能する可能性があります。ローカルデータベースとリモートデータベースを(SSH経由で)比較できるため、これを使用しました。したがって、データをダンプする必要はありません。

http://adamspiers.org/computing/mysqldiff/

2つのデータベースを同期させるためにSQLクエリを生成しようとしますが、私はそれを信頼しません(あるいは実際にはどのツールも)。私の知る限りでは、特に複数の変更が行われた場合、あるデータベーススキーマを別のデータベーススキーマに変換するために必要な変更をリバースエンジニアリングするための100%信頼できる方法はありません。

たとえば、列の型のみを変更した場合、自動化されたツールでそれを再作成する方法を簡単に推測できます。しかし、列を移動したり、名前を変更したり、他の列を追加または削除したりする場合は、ソフトウェアパッケージでできることが最も可能なことは、おそらく何が起こったのかを推測することです。そして、あなたはデータを失うことになるかもしれません。

開発サーバーに加えたスキーマの変更を追跡してから、ライブサーバー上でそれらのステートメントを手動で実行する(またはそれらをアップグレードスクリプトまたは移行スクリプトにまとめる)ことをお勧めします。面倒ですが、データを安全に保ちます。そして、エンドユーザーがあなたのサイトにアクセスするのを許可し始める頃には、あなたは本当に大規模なデータベース変更を絶えず行っているのでしょうか?

11
Zac
7
anders.norgaard

check: http://schemasync.org/ schemasyncツールは私のために動作します。コマンドラインツールはLinuxコマンドラインで簡単に動作します

6
likeuclinux

別のオープンソースのコマンドラインmysql-diffツールがあります。

http://bitbucket.org/stepancheg/mysql-diff/

4
stepancheg

RedGateによるSQL比較 http://www.red-gate.com/products/SQL_Compare/index.htm

自動化された方法でデータベース変更管理を支援するDBDeploy http://dbdeploy.com/

3
George

私自身は、両方のデータベースをダンプしてダンプを比較することから始めますが、自動的にマージスクリプトを生成したいのであれば、実際のツールを入手したいと思うでしょう。

簡単な Google検索 では、次のツールが見つかりました。

3
Craig Trader

MySQL用dbForgeデータ比較 をご覧ください。 30日間の無料試用期間があるシェアウェアです。データの比較と同期、データの違いの管理、およびカスタマイズ可能な同期のための高速なMySQL GUIツールです。

dbForge Data Compare for MySQL

3
Devart

何時間もかけて簡単なツールをWebで検索したところ、Ubuntu Software Centerには目が行きませんでした。これは私が見つけた無料のソリューションです: http://torasql.com/ 彼らはまた、Windows用のバージョンを持っていると主張しますが、私は使用していますUbuntuの下で。

編集:2015年2月5日あなたがWindowsツールを必要とするなら、TOADは完璧で無料です: http://software.Dell.com/products/toad-for-mysql/

3
Nikolay Ivanov

Maatkit と呼ばれるPerlを使って書かれた便利なツールがあります。それはとりわけいくつかのデータベース比較と同期ツールを持っています。

3
Jarod Elliott

Apache zetaコンポーネントライブラリはPHP 5に基づくアプリケーション開発のための疎結合コンポーネントの汎用ライブラリです。

eZコンポーネント - DatabaseSchema あなたがすることができます:

。データベーススキーマ定義の作成/保存; 
データベーススキーマの比較; 
。同期クエリの生成; 

ここでチュートリアルを確認することができます。 http://incubator.Apache.org/zetacomponents/documentation/trunk/DatabaseSchema/tutorial.html

2
Naim Zard

非常に使いやすい比較と同期ツール:
データベース比較ツール http://www.clevercomponents.com/products/dbcomparer/index.asp

利点:

  • 速い
  • 使いやすい
  • 適用する変更を簡単に選択

デメリット:

  • 長さを小さい整数に同期しません
  • インデックス名を正しく同期しません
  • コメントを同期しません
2
Artem Goutsoul

私は Navicat for MySQL がこの場合に役立つと思います。それはMySQLのデータと構造の同期をサポートしています。 enter image description here

1
Jason Yau

私はNob Hillのマーケティングチームと仕事をしています。あなたの質問、提案、その他何でも聞いて喜んでくれるでしょう、私に連絡してください。

他にそのような製品が市場に出回っている一方で、それらのどれもが正しい仕事をしていないので、私たちはもともと私たちのツールを最初から作成することを決めました。データベース間の違いを簡単に見せることができます。一方のデータベースを他方のデータベースに実際に作成するのはまったく別のことです。スキーマとデータの両方を円滑に移行することは、常に課題でした。さて、私たちはここでそれを達成しました。
私たちは、そうでない場合よりもスムーズなマイグレーションを提供できると確信しています - それが生成するマイグレーションスクリプトが十分に読めないか、またはあなたのために働かないなら、そして我々はそれを修正できません5営業日で - あなたはあなた自身の無料コピーを手に入れるでしょう!

http://www.nobhillsoft.com/NHDBCompare.aspx

0
Itamar

質問の最初の部分では、両方をダンプしてそれらを比較するだけです。 mysqlについてはわかりませんが、postgres pg_dumpにはテーブルの内容なしでスキーマをダンプするコマンドがあります。そのため、スキーマを変更したかどうかを確認できます。

0
Paul Tomblin