19

2 つの MySQL データベース スキーマを同期できる移植可能なスクリプトまたはコマンド ライン プログラムを探していました。GUI ベースのソリューションを探しているわけではありません。これは、buid/deployment ツールで自動化または実行できないためです。

基本的に、データベース 1 とデータベース 2 をスキャンする必要があります。スキーマの違い (テーブルとインデックス) を確認し、1 つの SQL ステートメントを実行することを提案して、他の SQL ステートメントと同様の構造を取得し、データの損傷を可能な限り最小限に抑えます。

このタイプのソリューションが実装されている PHP、Python、または Ruby パッケージを誰かが示すことができれば、そこからコードをコピーすることを試みることができます。

おそらく多くの MySQL GUI ツールでこれを行うことができますが、スクリプト可能なソリューションを探しています。

編集:より明確でなくて申し訳ありません:私が探しているのは、データを可能な限りそのままに保ちながら、テーブル構造で同期することです。データ複製ではありません。

より詳しい情報:

複製が機能しない理由。

  1. 設置拠点は州中に広がっています。
  2. エンド ユーザーが使用している古いバージョンに関係なく、最新バージョンで行われた変更に基づいて、インストーラーが DB で動的な修正を実行するようにします。
  3. 変更とは、ほとんどの場合、テーブルに新しい列を追加する、新しいインデックスを作成する、またはインデックスを削除する、システムが内部的に使用するテーブルを追加する、またはテーブルを削除するようなものです (ユーザー データ テーブルは削除しません)。

GUI の場合: いいえ、使用できません。DB diff のためだけにインストーラーに 20MB のアプリをバンドルしたくありません。特に、元のインストーラーが 1 MB 未満の場合。

4

6 に答える 6

6

MySQL レプリケーションの使用を検討しましたか?

于 2009-01-19T08:43:06.897 に答える
5

SQLyogはそれを行い、素晴らしいです。生産でよく使用します。

于 2010-04-09T11:28:18.277 に答える
2

私はそれが古い質問であることを知っていますが、それは私が探していたものに対するグーグルでの最初の結果でした(最初の質問とまったく同じです)

私はまだここに答えを見つけましたが、それが開始されたスクリプトであるURLを覚えていません:

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

そして、このようになりました

#!/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
于 2013-01-16T07:48:31.640 に答える
1

これがcodeigniterデータベース差分スクリプトジェネレーターであることを確認してくださいここに画像の説明を入力

https://github.com/vaimeo/ci-database-diff-generator

于 2016-11-20T06:12:57.663 に答える
1

長期的で専門的なソリューションについては、Schemamatic ( http://versabanq.com/products/schemamatic.php ) に注意を払う必要があります。このリンクは GUI アプリを示していますが、コマンドライン ソフトウェアを操作するだけです。このページには、Schemamatic の C# .Net バージョンがある Google コード サイトへのリンクがあります。あなたの完璧な解決策は、MySQL のサポートを Schemamatic に追加することです。SQL Serverの場合、それは完璧で、あなたが言及したことを正確に行います.

ここで、短期的な解決策として、次のような MySQL のコマンドライン ツールを使用して必要なデータをダンプすることをお勧めします: mysqldump -A -c -uroot -ppassword >bkpmysql.sql

あなたが望むものを達成するにはかなりの時間がかかるはずですが、それで遊んでください. Schemamatic が最良の選択のように思えます。Schemamatic を試すとき、または試す場合に説明が必要な場合はお知らせください。

于 2009-02-04T00:00:44.947 に答える
1

dbdeploy (これは Java または .net バージョンです) やLiquidbaseなどのツールを確認することをお勧めします

これらのほとんどは、制御された方法で一連の変更を DB に適用すると思います。既存のスキーマからリバース エンジニアリングして比較できるかどうかわからない。

E.

于 2009-02-04T00:20:14.920 に答える