データベーススキーマをどのようにバージョン管理しますか?[閉まっている]


128

SQLデルタをどのように準備しますか?スキーマを変更する各SQLを手動でデルタフォルダーに保存しますか、それとも何らかの自動化された差分プロセスを使用しますか?

データベーススキーマとソースコードをバージョン管理するための規則に興味があります。おそらく、スキーマを比較するpre-commitフックですか?

また、どのようなデルタを差分のためのオプションが別に存在しDbDeploy

編集:回答を見て、デルタを使用してデータベースの移行を実行するための標準的なスキームに精通していることを明確にしたいと思います。私の質問は、デルタ自体を、できれば自動的に作成することです。

また、違いがある場合、バージョン管理はPHPとMySQL向けです。(Rubyソリューションはありません)。


schemasyncを使用してパッチ(およびロールバックスクリプト)を生成します。これらはSVNリポジトリに追加されます。完璧ではありませんが、私にとってはうまくいきます。さらに、schemasyncを使用すると、スキーマの変更を非常に簡単にデプロイできます
Jay Sidri 2010

このリンクは空のようです-これはまだ存在しますか?
jocull

移動したようです:github.com/mmatuson/SchemaSync
Jay Sidri

回答:


61

見る

データベース構造を変更するためのバージョン管理システムはありますか?

MS SQLデータベースをSVNでバージョン管理するにはどうすればよいですか?

そしてジェフの記事

データベースをバージョン管理下に置く

あなたの痛みを感じます。これはあなたが探していたものに近いかもしれません。

DBスキーマの変更を追跡するメカニズム

一般に、これに対する適切な受け入れられた解決策はないと感じており、私はこの領域で自分自身をロールバックします。


私の質問からわかるように、私はデルタの概念を知っています。私の質問は、できれば自動的にそれらを作成するための規則についてです。
エランガルペリン

私はそれから自分自身を転がしていると思います...;)
エラン・ガルペリン

DBDiff:github.com/DBDiff/DBDiffを試しましたか?SQLのスキーマとデータの両方の自動移行を行うので、@ EranGalperinを探しているものに適しています。開示私はその背後にいる開発者です!
Jasdeep Khalsa 2017


4

それでもオプションを探しているなら、neXtepデザイナーを見てください。バージョン管理の概念に基づく無料のGPLデータベース開発環境です。この環境では、常にバージョン付きエンティティを操作し、データモデルの開発に集中できます。リリースが完了すると、バージョンコントロールシステムにプラグインされたSQL生成エンジンは、2つのバージョン間で必要なデルタを生成でき、必要に応じて配信メカニズムを提供します。

特に、開発中のデータベースの同期とリバース同期、データモデル図の作成、統合SQLクライアントを使用したデータベースのクエリなどが可能です。

詳細については、wikiをご覧ください。http//www.nextep-softwares.com/wiki

現在、Oracle、MySql、PostgreSqlをサポートしており、Javaで提供されているため、Windows、Linux、Macで動作します。


3

スキーマの変更が常に追加的であることを確認します。したがって、列とテーブルは削除しません。これは、データを消去し、後でロールバックできないためです。このように、データベースを使用するコードは、データや機能を失うことなくロールバックできます。

テーブルと列がまだ存在しない場合にそれらを作成してデータで埋めるステートメントを含む移行スクリプトがあります。

移行スクリプトは、製品コードが更新されたとき、および新規インストール後に実行されます。

何かを削除したい場合は、データベースインストールスクリプトと移行スクリプトから削除して、これらの古いスキーマ要素が新しいインストールで段階的に廃止されるようにします。新しいインストールでは、インストール前に古いバージョンにダウングレードできないという欠点があります。

そしてもちろん、私はこれらのスクリプトを介してDDLを実行しますが、同期を保つためにデータベースで直接実行することはありません。


2

デルタは管理していません。マスターデータベースに変更を加え、マスターデータベースに基づいてXMLベースのビルドスクリプトを作成するツールがあります。

既存のデータベースをアップグレードするときに、XMLベースのビルドスクリプトを使用して新しいデータベースとベアテーブルを作成するプログラムがあります。次に、INSERT INTO x SELECT FROM yを使用して古いデータベースからデータをコピーし、すべてのインデックス、制約、およびトリガーを適用します。

新しいテーブル、新しい列、削除された列はすべて自動的に処理され、コピールーチンを調整するためのいくつかの小さなトリックを使用して、列の名前の変更、列の種類の変更、その他の基本的なリファクタリングを処理できます。

大量のデータがあるデータベースでこのソリューションをお勧めしませんが、400テーブルで1GBを超えるデータベースを定期的に更新します。


これは、特に複数の開発者を扱う場合、やや面倒に聞こえます。また、ビルドプロセスは厳しいように聞こえるので、できるだけシンプルにしたいと思います。
エランガルペリン

正しくなるまで少し時間がかかったことは認めますが、アップグレードを準備するのにほとんど手間がかかりません。また、私が気に入っている点の1つは、暫定的な修正プログラムの変更を行うことができ、アップグレード手順に影響を与えないことです。各アップグレードは新しいDBです。
Darrel Miller、


2

私は自分でホーンを鳴らすのではありませんが、データベーススキーマへの変更を追跡し、バージョン付きの更新スクリプトを作成するための内部Webアプリを開発しました。

このツールはブラジルと呼ばれ、現在MITライセンスの下でオープンソースになっています。ブラジルはruby / ruby​​ on railsベースで、Ruby DBIがサポートするすべてのデータベース(MySQL、ODBC、Oracle、Postgres、SQLite)への変更配備をサポートしています。

更新スクリプトをバージョン管理に入れるためのサポートが計画されています。


ブラジルはかなり良さそうですが、私は主にPHPを使用しています。システムの移植を検討したことがありますか?
エランガルペリン


1

(ツールチェーンを使用して)データを移植可能な形式にエクスポートしてから、新しいスキーマにインポートします。デルタSQLは必要ありません。強くお勧めします。


3
このポータブル形式とは何ですか?以前のバージョンとの違いのみを適用して、それを新しいスキーマにどのようにインポートしますか?
エラン

1

私はほとんどの開発にFirebirdデータベースを使用しており、FlameRobin管理ツールを使用しています。すべての変更をログに記録するための素晴らしいオプションがあります。すべてを1つの大きなファイル、またはデータベースの変更ごとに1つのファイルに記録できます。この2番目のオプションを使用し、各スクリプトをバージョン管理ソフトウェアに保存します。以前はSubversionを使用していましたが、今はGitを使用しています。

FlameRobinがFirebirdに対して行うのと同じロギング機能を持つMySQLツールを見つけることができると思います。

データベーステーブルの1つにデータベース構造のバージョン番号を格納しているため、どのデータベースでも簡単にアップグレードできます。また、任意のターゲットデータベースでSQLスクリプトを1つずつ実行する単純なPHPスクリプトも作成しました(データベースパスとユーザー名/パスワードはコマンドラインで指定します)。

すべてのDML(挿入、更新、削除)ステートメントをログに記録するオプションもあります。これをアクティブにして、各データベースに含まれる「デフォルト」データを変更します。

私はこれをすべて詳細に行う方法についての素敵な白書を書きました。このペーパーは、デモのPHPスクリプトとともに.pdf形式でここからダウンロードできます。


1

また、開発者がdeltasqlスクリプトを中央リポジトリに送信できる一連のPHPスクリプトも開発しました。

データベーステーブルの1つ(TBSYNCHRONIZEと呼ばれます)に、最後に実行されたスクリプトのバージョン番号を格納します。これにより、Eclipse用に開発されたWebインターフェイスまたはクライアントを使用して、任意のデータベースを簡単にアップグレードできます。

Webインターフェースでは、いくつかのプロジェクトを管理できます。また、データベース「ブランチ」もサポートしています。

http://www.gpu-grid.net/deltasqlでアプリケーションをテストできます(パスワードtestdbsyncを使用してadminとしてログインした場合)。アプリケーションはオープンソースであり、ここからダウンロードできます:http : //sourceforge.net/projects/deltasql

deltasqlはスイスとインドで生産的に使用されており、日本で人気があります。


1

数か月前、MySQLスキーマのバージョン管理ツールを検索しました。Doctrineの移行、RoRの移行、JavaやPythonで書かれたツールなど、多くの便利なツールを見つけました。

しかし、誰も私の要件を満たしていませんでした。

私の要件:

  1. 要件なし、PHPとMySQLを除外
  2. Doctrineのschema.ymlのようなスキーマ設定ファイルはありません
  3. 接続から現在のスキーマを読み取り、新しい移行スクリプトを作成できます。他のアプリケーションのインストールで同一のスキーマを表すことができます。

移行ツールを書き始め、今日はベータ版を持っています。

このトピックに興味がある場合は、ぜひお試しください。今後のリクエストとバグレポートを送ってください。

ソースコード:bitbucket.org/idler/mmp/src英語の概要:bitbucket.org/idler/mmp/wiki/ロシア語のホームの概要:antonoff.info/development/mysql-migration-with-php-project


新しいツールもあります:DBV:stackoverflow.com/a/13837473/6309
VonC


1

私もこのトピックに興味があります。

Django wikiでこのトピックに関するいくつかの議論があります

興味深いことに、CakePHPには、cake schema generateコマンドのみ使用してスキーマのバージョン管理が組み込まれているようです。


私がケーキのソリューションについて読んだことから-それは非常に基本的な意味でのバージョン管理ですが、差分機能がないので私には役に立ちません。
エランガルペリン

1

MySQLの場合

新しいDBにアクセスしたとき:

まず、構造を確認します。

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

stackoverflowユーザーのおかげで、この簡単なスクリプトを記述して構造の違いを見つけることができました。

SRC:https://stackoverflow.com/a/8718572/4457531https://stackoverflow.com/a/26328331/4457531

2番目のステップでは、でテーブルごとにデータをチェックしますmysqldiff。それは少し古風ですが、データに基づくphpループはinformation_schema確実に仕事をします

バージョニングについても同じ方法を使用しますが、SQL更新スクリプトを(アップグレードまたはロールバックするために)差分結果でフォーマットし、バージョン番号の規則を使用します(いくつかの変更により、バージョン番号はIPアドレスのように見えます)

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

データベーススキーマの厳密なバージョン管理を使用しています(別のテーブルで追跡)。スクリプトはバージョン管理に保存されますが、変更を加える前に、すべて現在のスキーマバージョンを確認します。

SQL Serverの完全な実装は次のとおりです(必要に応じて、MySQL用に同じソリューションを開発できます):SQL Serverデータベーススキーマのバージョンを維持する方法


私はあなたの記事を読んだところです。これをまだ使用していますか、それともDBUpやReadyRollなどの既成のソリューションを採用してからですか?
David Atkinson

現在、すべてのプロジェクトはEntity Framework Code-Firstに依存しており、その移行を使用してデータベースのバージョン管理を行っています。私はいくつかのレガシープロジェクトの記事からの解決策を持っていますが、それを置き換えることはありません。他のプロジェクトでは、Redgateツールを使用してスキーマと移行を管理しました。
Zoran Horvat

あなたがRedgateユーザーであることは素晴らしいことです!RedgateツールをEFと組み合わせて使用​​する場合は、次のことが可能です。red
David Atkinson

次の機会にぜひお試しください。うまくいきましたが、それまでの間、チームを変更しました。現在は、ネイティブEFサポートを試す前に実験しています。
Zoran Horvat

0

長い調査の結果、サードパーティのツールやVisual Studioのプロジェクトの種類によっては満足できないものがあるか、理論についてブログだけで実装されていないことがわかりました。だから私はほぼ1年使用される実用的なシステムを実装し、ここで説明しました:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

興味次第で、さらに書き続けていきます。


2
こんにちは、SOへようこそ。この回答は完全ではありません。基本的にはリンクのみを提供します。リンクのみの回答は最良の回答ではありません。リンクが無効になると、回答が役に立たなくなります。ですので、それを編集して、少なくともそこにあるものの要約を追加してください。そうすれば、あなたの答えはリンクとは無関係に値を持ちます。ありがとうございました!
ファビオはモニカを復活させる2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.