2つのMySQLデータベースを比較する[終了]


368

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

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

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

現在、以前のテストサーバーデータベースを単に破棄するだけで問題ありませんが、テストがテストデータの入力を開始するときに、少し注意が必要になる場合があります。
同じですが、生産の後半で再び発生します...

できればそれを変更するスクリプトを自動的に作成することにより、本番データベースを段階的に変更する簡単な方法はありますか?


回答で言及されているツール:


4
RedGateのツールはSQL Server専用だと思います。
Dave R.

4
:それは、拡張早期アクセスでありますようレッドゲートは、今だけでなく、現在は無料のMySQLバージョンを持っているred-gate.com/products/MySQL_Compare/index.htm
デヴィッド・アトキンソン

2
それは本当の問題です。私はdevから本番マシンにデプロイしますが、常に何かを壊します。この有益な投稿をありがとう
Herr

1
RedgateのMySQLツールはユーザーあたり70ドルになりました。その価格でさえ、ここでコメントを評価して投稿します。
ジェレミー・マギー

これも今すぐ必要で、フィールドのサイズを大きくする必要がありました。単にそれを増やしたくはなく、すべてが大丈夫だったのではないかと疑いました。@Jaredは私が使用したものを正確に提案しました。
Tass

回答:


210

小さなデータベースで作業している場合、SQLスクリプトを生成するオプション--skip-comments--skip-extended-insertオプションを使用して両方のデータベースでmysqldumpを実行していることがわかりました。SQLスクリプトでdiffを実行すると、かなりうまくいきます。

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

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

12
コマンドラインリテラシーのためのダブルプラス賛​​成!!!
dogenpunk 2012年

5
データを比較するには、代わりにこれを使用します。まだいくつかのMySQL4 +文字セット、などについてのコメントもmysqldump --opt --compact --skip-extended-insert -u user -p db table > file.sql
zanlok

41
-d--no-data生産使用を必要とするものに興味があるが、スキーマを気にのみ可能
ルイ

7
使用するより良いツールは、Windows、Linux、またはMacで使用できるMySQL自体が開発したmysqldbcompareユーティリティです。これは、データとスキーマの両方の変更についてSQLステートメントを出力し、単純なコマンドラインdiffよりも多くのテストを実行できます。決定。
Jasdeep Khalsa、2014

4
色付きの素敵なデフのためにしてみてくださいvimdiff
gitaarik

99

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


2
言及されているすべてのツールは見栄えがします。いくつかの研究を行うことができるまで、今のところ任意にToadを選択しています。
ヴィンセントRamdhanie

64
このツールがLinuxではなくWindowsで実行されることに気づくまで、私はこのツールに興奮していました。検索に戻る...
jdias

2
私にとっては素晴らしい仕事でした。必要なすべてのこと、および変更されたレコードの強調表示されたセルにより、何が変更されたかを簡単に確認できました。
テムズ、2012年

4
mysqldbcompare with --run-all-tests --difftype sql --disable-binary-loggingoptionsはほぼ同じジョブを実行できます(ただし、出力がコメントと混合され、文字列内の特殊文字がエスケープされない点が異なります)。
schemacs 2012年

4
@Anson Smith Linuxの代替手段を教えてください。
Visruth 2013

20

私はNavicatと呼ばれるソフトウェアを使用して次のことを行います。

  • ライブデータベースをテストデータベースに同期します。
  • 2つのデータベースの違いを表示します。

それはお金がかかり、それはWindowsとMacだけであり、奇抜なUIを持っているが、私はそれが好きだ。


Linuxで動作します。現在、別のデスクトップで開いています。スキーマの変更をdev-> test-> liveからプッシュする構造同期機能は、ライセンス料だけの価値があります。
Sponsz大佐

2
ナイスキャッチ、これらの機能があることさえ知りませんでした。これまでのところ、Macで最高のものです。
ヘンドラウジア2011

ネイティブSQLファイルではなく、サーバー上に存在するデータベースのみを比較しているようです
AlxVallejo

@seanyboy、なぜあなたは奇抜なUIが好きですか?
Pacerier 2015

17

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

ここに画像の説明を入力してください


1
うん、これはどこでも..今のところ私にとってこれに対する最善の解決策は、あるあなたはいつでもそれを更新することができるように細かいのSQL同期クエリを提供
アヌパム

コストがかかり、重く、
事後の

1
非常に遅く、何らかの理由で、不要な場合でも多くの外部キーを削除して再作成します。進行状況を追跡する方法はありません。
Artem Goutsoul 2012年

13

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


7
よく働く!そして、それは無料です、ありがとう。それを見つけることができなかった人のために(私のように)。ここにあります:データベース->リバースエンジニア-> MySQLモデルまたはEERダイアグラム->データベース->任意のソースと同期
ベンジー

それはうまくいきます。ただし、同じ名前のデータベースしか比較できません。同じホスト上の「マスター」バージョンから同期する複数の(マルチテナントクライアント)データベースがあります。そのため、同期する前に、各クライアントデータベースと一致するようにマスターの名前を変更する必要があります。そうでなければいいです!
scipilot 2015

これに関する追加情報は、このリンク
Steven Ryssaert

13

確かに多くの方法がありますが、私の場合は、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

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



11

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

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

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

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

開発サーバーに加えたスキーマの変更を追跡し、それらのステートメントをライブサーバーで手動で実行する(またはそれらをアップグレードスクリプトまたは移行にロールインする)ことをお勧めします。これは退屈な作業ですが、データを安全に保ちます。そして、エンドユーザーにサイトへのアクセスを許可するまでに、データベースに頻繁に大きな変更を加えますか?


両方を提供することを忘れてはいけない--hostN--userNか、それは静かに失敗します。
Znarkus、2014年

Oracleのmysqldbcompareツールでインデックスにバグを生成したり、同等のフィールドを変更したりする際に問題が発生しました。mysqldiffツールは問題なく動作し、かなりの時間を節約しました。
ロバートK


6

チェック:http : //schemasync.org/ schemasyncツールは私のために動作します、それはLinuxコマンドラインで簡単に動作するコマンドラインツールです


1
これをMacにインストールするのに問題がある場合、私はmysqlとpythonをhomebrewを使用してインストールすることでしかできませんでした。
Bijou Trouvaille 2012


3

Maatkitと呼ばれるperlを使用して書かれた便利なツールがあります。特に、データベースの比較と同期ツールがいくつかあります。


私はこのプロジェクトについて知りませんでした!おかげで、とても便利なツールがたくさんあるようです。
Vincent Ramdhanie、2008年

2
Maatkitにはスキーマ比較ツールがありません。
stepancheg

私もどちらも-ツールのどこでこれを見つけることができますか?
Shabbyrobe

そこにスキーマの比較があるとは思いません。mk-table-checksumとmk-table-syncを使用したデータの比較と同期について言及していました
Jarod Elliott



3

私自身は、両方のデータベースをダンプし、ダンプを比較することから始めますが、自動的に生成されたマージスクリプトが必要な場合は、実際のツールを入手する必要があります。

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



3

何時間もウェブ上でシンプルなツールを探していたところ、Ubuntu Software Centerを見ていないことに気付きました。ここに私が見つけた無料のソリューションがあります:http : //torasql.com/ 彼らはWindows用のバージョンも持っていると主張していますが、私はそれをUbuntuでのみ使用しています。

編集:2015-Feb-05 Windowsツールが必要な場合、TOADは完璧で無料です。http://software.dell.com/products/toad-for-mysql/


2
このツールの開発は中止され、Perconaに含まれるようになりました:percona.com/software/percona-toolkit
mrmuggles 14

2

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

eZコンポーネント-DatabaseSchemaにより、次のことが可能になります。

   データベーススキーマ定義を作成/保存します。
   データベーススキーマを比較します。
   。同期クエリを生成します。

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


2

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

利点:

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

短所:

  • 長さを小さな整数に同期しません
  • インデックス名を適切に同期しない
  • コメントを同期しません

確かに、彼らは5年間でいくつかの小さな変更を加えた表面的な更新を行いました。しかし、それは積極的に開発されていません。
Artem Goutsoul 2013年

1

Navicat for MySQLがこのケースに役立つと思います。MySQLのデータと構造の同期をサポートしています。 ここに画像の説明を入力してください


0

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


MySQLにも同様のコマンドmysql_dumpがあります。展開プロセスに統合できれば、これが解決策になるかもしれません。ありがとう。
ヴィンセントRamdhanie

また、よりユーザーフレンドリーなエクスペリエンスを実現するために、phpMyAdminを使用して同じことを行うことができます。これは、MySQLユーザーにとって真のキラーです!
schonarth

同一のスキーマは、異なるスキーマダンプを簡単に引き起こす可能性があります。mysqlクライアントのバージョンが異なると、わずかに異なるダンプ(2つの異なるマシンのスキーマを比較する場合の問題)が生成され、外部キーや制約などが異なる順序でダンプされる場合があります。
Mark E. Haase

0

私はノブヒルのマーケティングチームと協力しています。質問や提案などがありましたら、お気軽にお知らせください。お気軽にご連絡ください。

当初は、ツールを一から作成することにしました。市場にはそのような製品は他にもありますが、どれも正しく機能しないためです。データベース間の違いを示すのは非常に簡単です。実際に一方のデータベースをもう一方のデータベースにするのはまったく別のことです。スキーマとデータの両方のスムーズな移行は、常に課題でした。さて、私たちはここでそれを達成しました。
スムーズに移行できない場合よりも、スムーズに移行できると確信しています。生成された移行スクリプトが十分に読めない、または機能しない場合、および5営業日で修正できない場合–あなたはあなた自身の無料のコピーを手に入れます!

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


それは約束ですか?私はそれを試してみましたが、かなりの数のエラーで倒れました。特に、関数を移行するとき、元のデータベースと同じ所有者を使用しようとします
Cruachan

はい、それは約束です。ほとんどの人にとって、ツールは問題なく機能しています。私たちはあなたが見つけたバグに対しては一生のライセンスを約束し、5営業日以内に修正することはできません。サポートチームにお問い合わせください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.