web-dev-qa-db-ja.com

データベーススキーマをどのようにバージョン管理しますか?

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

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

また、 DbDeploy 以外に差分を差分するためのオプションは何ですか?

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

また、バージョン管理はPHPおよびMySQLが違いを生じさせる場合)です(いいえRubyソリューションをご覧ください)。

123
Eran Galperin

見る

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

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

そしてジェフの記事

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

私はあなたの痛みを感じ、より良い答えがあればいいのにと思う。これはあなたが探していたものに近いかもしれません。

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

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

59
harpo

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

特に、開発中にデータベースを同期および逆同期したり、データモデル図を作成したり、統合SQLクライアントを使用してデータベースにクエリを実行したりできます。

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

現在、Oracle、MySql、PostgreSqlをサポートしており、Javaにあるため、製品はWindows、Linux、およびMacで実行されます。

4
4
Jason Jackson

スキーマの変更が常に追加されるようにします。そのため、列やテーブルを削除しません。データをザッピングし、後でロールバックできないためです。これにより、データベースを使用するコードを、データや機能を失うことなくロールバックできます。

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

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

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

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

3
Calmarius

http://bitbucket.org/idler/mmp -PHPで記述されたmysqlのスキーマバージョン管理ツール

2
user381751

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

このツールは ブラジル と呼ばれ、MITライセンスの下でオープンソースになりました。ブラジルはRuby/Ruby on Rails=ベースであり、 Ruby DBI がサポートするデータベースへの変更デプロイメントをサポートします(MySQL、ODBC、Oracle、Postgres、SQLite)。

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

2
Joakim Bodin

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

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

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

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

2
Darrel Miller

使用しているRDBMSについては言及しませんでしたが、MS SQL Serverの場合、Red-Gateの SQL Compare は、オブジェクト作成スクリプト間のデルタの作成に不可欠です。

2
jalbert

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

FirebirdでFlameRobinが行うのと同じログ機能を備えたMySQLツールを見つけることができると思います。

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

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

私はこれをどのように詳細に行うかについての素敵なホワイトペーパーを書きました。デモPHPスクリプトは here からダウンロードできます。

1
Milan Babuškov

数ヶ月前、MySQLスキーマのバージョン管理ツールを検索しました。 Doctrine移行、RoR移行、JavaおよびPython。

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

私の要件:

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

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

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

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

1
Maxim Antonov

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

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

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

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

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

1

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

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

おもしろいことに、それは CakePHPにはスキーマのバージョン管理が組み込まれています ちょうどcake schema generateコマンドを使用するように見えます。

1
Swaroop C H

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

1
Shachar

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を使用してテーブルごとにデータをチェックします。少し古風ですが、information_schemaデータに基づくphpループが確実に仕事をします

バージョン管理にも同じ方法を使用しますが、SQL更新スクリプトを(アップグレードまたはロールバックのために)diffの結果でフォーマットし、バージョン番号の規則を使用します(バージョン番号はipアドレス)

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

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

SQL Serverの完全な実装を次に示します(必要に応じて、MySQL用に同じソリューションを開発できます)。 SQL Serverデータベーススキーマバージョンの保守方法

0
Zoran Horvat

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

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

興味に応じて、さらに書き続けます。

0
Yuksel Daskin