質問
現在、MySQLデータベースを使用してアプリケーションを開発しています。
データベース構造は流動的であり、開発の進行中に変更されます(ローカルコピーを変更し、テストサーバー上にコピーを残します)。
データベースの2つのインスタンスを比較して、変更があったかどうかを確認する方法はありますか?
現在、以前のテストサーバーデータベースを単に破棄するだけで問題ありませんが、テストではテストデータの入力を開始するため、少し注意が必要です。
同じことは、生産の後半で再び発生します...
できればそれを変更するスクリプトを自動的に作成することにより、本番データベースに段階的に変更を加える簡単な方法はありますか?
回答に記載されているツール:
解決
小規模なデータベースを使用している場合、両方のデータベースで-skip-comments
および-skip-extended-insert
オプションを使用してmysqldumpを実行していることがわかりましたSQLスクリプトを生成するために、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
他のヒント
Toad for MySQL には、データとスキーマの比較機能があります。同期スクリプトも作成します。何より、フリーウェアです。
Navicat というソフトウェアを使用して:
- ライブデータベースをテストデータベースに同期します。
- 2つのデータベースの違いを表示します。
費用がかかります。WindowsとMacのみで、UIが奇抜ですが、気に入っています。
SQLyog (商用)には、2つのデータベースを同期するためのSQLを生成するスキーマ同期ツールがあります。
機能比較リストから... MySQL Workbench コミュニティエディションでSchema DiffとSchema Synchronizationを提供しています。
確かに多くの方法がありますが、私の場合はdumpコマンドとdiffコマンドを使用します。だから、ここにジャレッドのコメントに基づいたスクリプトがあります:
#!/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
フィードバックを歓迎します:)
dbSolo、有料ですが、この機能はあなたが探しているものかもしれません http://www.dbsolo.com/help/compare.html
Oracle、Microsoft SQL Server、Sybase、DB2、Solid、PostgreSQL、H2、MySQLで動作します
スキーマ(データではなく)のみを比較する必要があり、Perlにアクセスできる場合、mysqldiffが機能する可能性があります。ローカルデータベースとリモートデータベースを(SSH経由で)比較できるため、データをダンプする必要がないため、これを使用しました。
http://adamspiers.org/computing/mysqldiff/
2つのデータベースを同期するためにSQLクエリを生成しようとしますが、私はそれ(または実際にはツール)を信頼していません。私の知る限り、特に複数の変更が行われた場合、あるデータベーススキーマを別のデータベーススキーマに変換するために必要な変更をリバースエンジニアリングする100%信頼できる方法はありません。
たとえば、列のタイプのみを変更した場合、自動化ツールはそれを簡単に再作成する方法を推測できます。ただし、列を移動し、名前を変更し、他の列を追加または削除する場合、ソフトウェアパッケージでできることは、おそらく何が起こったのかを推測することです。また、データが失われる可能性があります。
開発サーバーに対して行ったスキーマの変更を追跡し、それらのステートメントをライブサーバー上で手動で実行する(またはアップグレードスクリプトまたは移行に展開する)ことをお勧めします。面倒ですが、データを安全に保ちます。そして、エンドユーザーがサイトにアクセスできるようにするまでに、データベースに頻繁に大きな変更を加えることになりますか?
チェック: http://schemasync.org/ schemasyncツールは私のために動作します。これはLinuxコマンドラインで簡単に動作するコマンドラインツールです
別のオープンソースのコマンドラインmysql-diffツールがあります:
Maatkit と呼ばれるperlを使用して記述された便利なツールがあります。とりわけ、いくつかのデータベース比較および同期ツールがあります。
RedGateによるSQL比較 http://www.red-gate.com/products/SQL_Compare/index。 htm
DBDeployは、自動化された方法でデータベース変更管理を支援します http://dbdeploy.com/
私にとっては、両方のデータベースをダンプし、ダンプを比較することから始めますが、自動生成されたマージスクリプトが必要な場合は、実際のツールを入手する必要があります。
簡単な Google検索により、次のツールが見つかりました。
- MySQL Workbench 、コミュニティ(OSS)および商用バリアントで利用可能。
- Nob Hillデータベース比較、MySQLで無料で利用できます。
- 他のSQL比較ツールのリスト。
dbForge Data Compare for MySQL をご覧ください。 30日間の無料試用期間のあるシェアウェアです。これは、データの比較と同期、データの違いの管理、カスタマイズ可能な同期のための高速MySQL GUIツールです。
ウェブ上で簡単なツールを数時間検索した後、Ubuntu Software Centerを見ていないことに気付きました。 ここに私が見つけた無料のソリューションがあります: http://torasql.com/ 彼らはWindows用のバージョンも持っていると主張しているが、私はそれをUbuntuでしか使っていない。
編集:2015-Feb-05 Windowsツールが必要な場合、TOADは完璧で無料です。 http://software.dell.com/products/toad-for-mysql/
apacheゼータコンポーネントライブラリは、PHP 5ベースのアプリケーション開発用の疎結合コンポーネントの汎用ライブラリです。
eZコンポーネント-DatabaseSchema を使用すると、次のことができます。
.Create/Save a database schema definition; .Compare database schemas; .Generate synchronization queries;
こちらでチュートリアルを確認できます。 http://incubator.apache.org/zetacomponents/documentation/trunk/DatabaseSchema /tutorial.html
非常に使いやすい比較および同期ツール:
データベース比較
http://www.clevercomponents.com/products/dbcomparer/index.asp
利点:
- 高速
- 使いやすい
- 適用する変更を選択しやすい
欠点:
- 長さを小さな整数に同期しません
- インデックス名を適切に同期しません
- コメントを同期しません
Navicat for MySQL がこの場合に役立つと思います。 MySQLのデータと構造の同期をサポートします。
質問の最初の部分では、両方をダンプして比較します。 mysqlについてはわかりませんが、postgres pg_dumpにはテーブルの内容なしでスキーマをダンプするコマンドがあるため、スキーマを変更したかどうかを確認できます。
Nob Hillのマーケティングチームと協力しています。ご質問、ご提案など、何でもお気軽にお問い合わせください。お気軽にお問い合わせください。
最初にツールをゼロから作成することにしました。市場には他にもこのような製品はありますが、どれも適切に機能しないからです。データベース間の違いを示すのは非常に簡単です。実際に1つのデータベースを他のデータベースと同様に作成することは、まったく別の方法です。スキーマとデータの両方のスムーズな移行は常に課題でした。さて、ここでそれを達成しました。
移行しない場合よりも、スムーズに移行できると確信しています。生成された移行スクリプトが十分に読めないか、動作しない場合、5営業日以内に修正することはできません–独自の無料コピーを入手できます!