368

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

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

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

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

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


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

4

21 に答える 21

210

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

コメントをスキップすることで、mysqldump コマンドを実行した時間などの無意味な違いを回避できます。コマンドを使用--skip-extended-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
于 2012-01-03T21:03:01.917 に答える
98

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

于 2008-10-22T13:48:09.290 に答える
20

Navicatというソフトウェアを使用して、次のことを行います。

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

お金はかかるし、windows と mac だけだし、奇抜な UI もあるけど、私は気に入っている。

于 2008-10-22T13:52:46.563 に答える
17

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

ここに画像の説明を入力

于 2011-04-01T16:32:54.907 に答える
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

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

于 2012-04-23T18:02:11.077 に答える
13

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

于 2008-10-22T13:50:30.360 に答える
12

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

Oracle、Microsoft SQL Server、Sybase、DB2、Solid、PostgreSQL、H2、MySQL で動作します 代替テキスト

于 2010-10-04T22:17:08.640 に答える
11

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

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

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

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

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

于 2008-10-22T14:29:18.240 に答える
7

http://www.liquibase.org/をご覧ください。

于 2008-10-22T13:46:46.077 に答える
6

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

于 2011-04-12T18:08:37.923 に答える
4

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

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

于 2009-02-07T21:22:49.130 に答える
3

perl を使って書かれたMaatkitという便利なツールがあります。とりわけ、いくつかのデータベース比較および同期ツールがあります。

于 2008-10-22T13:44:39.810 に答える
3

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

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

于 2008-10-22T13:53:29.387 に答える
3

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

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

于 2008-10-22T13:54:14.127 に答える
3

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

MySQL の dbForge データ比較

于 2010-09-24T11:21:45.463 に答える
3

ウェブで簡単なツールを何時間も検索した後、Ubuntu Software Center を見ていないことに気付きました。ここに私が見つけた無料の解決策があります: http://torasql.com/ 彼らはWindows用のバージョンもあると主張していますが、私はUbuntuでのみ使用しています。

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

于 2011-08-16T18:13:22.533 に答える
2

apache zeta コンポーネント ライブラリは、PHP 5 ベースのアプリケーションを開発するための疎結合コンポーネントの汎用ライブラリです。

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

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

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

于 2010-11-24T09:01:31.053 に答える
2

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

利点:

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

短所:

  • 長さを小さな整数に同期しません
  • インデックス名を正しく同期しない
  • コメントを同期しません
于 2012-03-08T13:00:18.107 に答える
1

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

于 2011-01-25T08:05:27.337 に答える
0

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

于 2008-10-22T13:43:12.200 に答える
0

私は Nob Hill のマーケティング チームと仕事をしています。ご質問、ご提案、その他何でも喜んで承りますので、お気軽にご連絡ください。

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

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

于 2009-01-22T19:09:57.223 に答える