データベース スキーマのバージョン管理はどのように行うのでしょうか?
-
05-07-2019 - |
質問
SQL デルタをどのように準備しますか?スキーマを変更する各 SQL をデルタ フォルダーに手動で保存しますか、それとも何らかの自動差分プロセスを使用していますか?
私はソース コードとともにデータベース スキーマのバージョン管理に関する規則に興味があります。おそらく、スキーマの差分を取得するプリコミットフックでしょうか?
また、デルタの差分には他にどのようなオプションがありますか DbDeploy?
編集: 回答を見て、デルタを使用してデータベース移行を実行するための標準的なスキームを理解していることを明確にしたいと思います。私の質問は、デルタ自体の作成、できれば自動的に作成することについてです。
また、バージョン管理が異なる場合は、PHP と MySQL のバージョン管理も行われます。(Ruby ソリューションは使用しないでください)。
解決
参照
データベース構造のバージョン管理システムはありますか変更しますか?
およびジェフの記事
私はあなたの痛みを感じ、より良い答えがあればいいのにと思います。これは、探していたものに近いかもしれません。
一般に、これに対する適切で受け入れられた解決策はないと感じており、私はこの分野で独自の展開をしています。
他のヒント
別の同様のスレッドをご覧ください: SVNでMS SQLデータベースをバージョン管理するにはどうすればよいですか。
まだオプションを探している場合:neXtepデザイナーをご覧ください。バージョン管理の概念に基づいた無料のGPLデータベース開発環境です。この環境では、常にバージョン管理されたエンティティを操作し、データモデルの開発に集中できます。リリースが完了すると、バージョン管理システムにプラグインされたSQL生成エンジンは2つのバージョン間で必要なデルタを生成でき、必要に応じて配信メカニズムを提供します。
とりわけ、開発中にデータベースを同期および逆同期したり、データモデル図を作成したり、統合SQLクライアントを使用してデータベースにクエリを実行したりできます。
詳細については、Wikiをご覧ください。 http://www.nextep-softwares.com/wiki
現在、Oracle、MySql、PostgreSqlをサポートしており、javaになっているため、製品はWindows、Linux、Macで実行されます。
スキーマの変更は常に追加されるようにします。そのため、列やテーブルを削除しません。データをザッピングし、後でロールバックできないためです。これにより、データベースを使用するコードを、データや機能を失うことなくロールバックできます。
テーブルと列がまだ存在しない場合にそれらを作成し、データを入力するステートメントを含む移行スクリプトがあります。
本番コードが更新されるたびに、および新規インストール後に移行スクリプトが実行されます。
何かを削除したい場合は、データベースインストールスクリプトと移行スクリプトからそれらを削除して、これらの古いスキーマ要素が新しいインストールで段階的に廃止されるようにします。新規インストールでは、インストール前に古いバージョンにダウングレードできないという欠点があります。
そしてもちろん、これらのスクリプトを介してDDLを実行しますが、データベース上で直接実行することはありません。
デルタを管理していません。マスターデータベースに変更を加え、マスターデータベースに基づいてXMLベースのビルドスクリプトを作成するツールを使用しています。
既存のデータベースをアップグレードするときが来たら、XMLベースのビルドスクリプトを使用して新しいデータベースとベアテーブルを作成するプログラムがあります。次に、INSERT INTO x SELECT FROM yを使用して古いデータベースからデータをコピーし、すべてのインデックス、制約、トリガーを適用します。
新しいテーブル、新しい列、削除された列はすべて自動的に処理され、コピールーチンを調整するいくつかの小さなトリックを使用して、列の名前変更、列の種類の変更、その他の基本的なリファクタリングを処理できます。
大量のデータがあるデータベースではこのソリューションを推奨しませんが、400テーブルで1GBを超えるデータベースを定期的に更新します。
使用しているRDBMSについては言及しませんでしたが、MS SQL Serverの場合、Red-Gateの SQL Compare は、オブジェクト作成スクリプト間にデルタを作成するために不可欠です。
http://bitbucket.org/idler/mmp -mysql用のスキーマバージョン管理ツールPHPで
(ツールチェーンを使用して)データを移植可能な形式にエクスポートしてから、新しいスキーマにインポートしています。デルタSQLは必要ありません。強くお勧めします。
ほとんどの開発に Firebird データベースを使用し、 FlameRobin 管理ツール。すべての変更を記録する素晴らしいオプションがあります。すべてを1つの大きなファイル、またはデータベースの変更ごとに1つのファイルに記録できます。この2番目のオプションを使用してから、各スクリプトをバージョン管理ソフトウェアに保存します。以前はSubversionを使用していましたが、現在はGitを使用しています。
FlameRobinがFirebirdに対して行うのと同じロギング機能を備えたMySQLツールを見つけることができると思います。
データベーステーブルの1つに、データベース構造のバージョン番号を格納しているため、任意のデータベースを簡単にアップグレードできます。また、ターゲットデータベースでこれらのSQLスクリプトを1つずつ実行する単純なPHPスクリプトを作成しました(データベースパスとユーザー名/パスワードはコマンドラインで提供されます)。
すべてのDML(挿入、更新、削除)ステートメントをログに記録するオプションもあり、各データベースに含まれるいくつかの「デフォルト」データを変更しながらこれをアクティブにします。
これをすべて詳細に行う方法について、素敵なホワイトペーパーを書きました。 こちらから、デモ用のPHPスクリプトとともに.pdf形式のペーパーをダウンロードできます。 a>。
開発者がdeltasqlスクリプトを中央リポジトリに送信できるPHPスクリプトのセットも開発しました。
データベーステーブルの1つ(TBSYNCHRONIZEと呼ばれる)に、実行された最新のスクリプトのバージョン番号を保存します。そのため、Eclipse用に開発されたWebインターフェイスまたはクライアントを使用して、任意のデータベースを簡単にアップグレードできます。
Webインターフェースでは、複数のプロジェクトを管理できます。また、データベース「ブランチ」もサポートしています。
http://www.gpu-grid.net/deltasqlでアプリケーションをテストできます(パスワードtestdbsyncでadminとしてログインした場合)。 このアプリケーションはオープンソースであり、ここからダウンロードできます。 http://sourceforge.net/projects/deltasql
deltasqlはスイスとインドで生産的に使用され、日本で人気があります。
数か月前、MySQLスキーマのバージョン管理ツールを検索しました。 Doctrineの移行、RoRの移行、JavaやPythonで書かれたいくつかのツールなど、多くの便利なツールを見つけました。
しかし、私の要件を満たすものは誰もいませんでした。
私の要件:
- 要件なし、PHPおよびMySQLを除外
- Doctrineのschema.ymlのようなスキーマ設定ファイルはありません
- 接続から現在のスキーマを読み取り、新しい移行スクリプトを作成できます。アプリケーションの他のインストールで同じスキーマを表します。
移行ツールの作成を開始し、今日はベータ版を使用しています。
このトピックに興味がある場合は、試してください。 今後のリクエストとバグレポートを送ってください。
ソースコード:bitbucket.org/idler/mmp/src 英語の概要:bitbucket.org/idler/mmp/wiki/Home ロシア語の概要:antonoff.info/development/mysql-migration-with-php-project
このトピックにも興味があります。
Django wikiでこのトピックに関するいくつかの議論があります。
興味深いことに、 CakePHPにはスキーマバージョン管理が組み込まれています。 cake schema generate
コマンドのみを使用して。
MySQLの場合
新しいデータベースにアクセスしたとき:
まず、構造を確認します:
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/4457531 & https://stackoverflow.com/a/26328331/4457531
2番目のステップでは、 mysqldiff
を使用してテーブルごとにデータをチェックします。少し古風ですが、 information_schema
データに基づくphpループが確実に仕事をします
バージョン管理についても、同じ方法を使用しますが、SQL更新スクリプトを(アップグレードまたはロールバックのために)diff結果でフォーマットし、バージョン番号規則を使用します(バージョン番号はIPアドレスのように見えます)。
initial version : 1.0.0
^ ^ ^
| | |
structure change: - | |
datas added: -------- |
datas updated: --------
データベーススキーマの厳密なバージョン管理を使用しています(別のテーブルで追跡)。スクリプトはバージョン管理に保存されますが、変更を加える前に現在のスキーマバージョンをすべて検証します。
SQL Serverの完全な実装を次に示します(必要に応じて、MySQL用に同じソリューションを開発できます): SQL Serverデータベーススキーマバージョンの管理方法
長い調査の結果、私を満足させないサードパーティのツールやVisual Studioプロジェクトの種類、または理論についてのブログだけで実装はないことがわかりました。そこで、1年近く使用される作業システムを実装し、ここで説明しました:
http://nalgorithm.com/2015/11/09 / database-versioning-part-1 /
関心に応じて、さらに書き続けます。