開発サーバー、テスト サーバー、および運用サーバーの間でデータベース スキーマとデータを管理する方法の良い例を見つけるのに苦労しました。
これが私たちのセットアップです。各開発者は、アプリと MySQL データベースを実行する仮想マシンを持っています。彼らがやりたいことを何でもするための個人的なサンドボックスです。現在、開発者は SQL スキーマを変更し、SVN にコミットするテキスト ファイルにデータベースをダンプします。
コミットされた最新のコードを常に実行する継続的インテグレーション開発サーバーをデプロイしたいと考えています。ここでこれを行うと、ビルドごとに SVN からデータベースがリロードされます。
「リリース候補」を実行するテスト (仮想) サーバーがあります。現在、テスト サーバーへのデプロイは非常に手作業のプロセスであり、通常は SVN から最新の SQL を読み込んで微調整する必要があります。また、テスト サーバー上のデータには一貫性がありません。最終的には、最後にコミットした開発者がサンドボックス サーバーに持っていたテスト データがそのまま残ります。
すべてが崩壊するのは、本番環境へのデプロイです。ライブ データをテスト データで上書きすることはできないため、すべてのスキーマ変更を手動で再作成する必要があります。データを操作するために多数のスキーマ変更または変換スクリプトがあった場合、これは非常に複雑になる可能性があります。
問題が単なるスキーマである場合は、より簡単な問題になりますが、データベースには、セキュリティやアクセス許可テーブルのメタデータなど、開発中にも更新される「ベース」データがあります。
これが、継続的インテグレーションとワンステップ ビルドに移行する際の最大の障壁です。どのように解決しますか?
フォローアップの質問: データベースのバージョンを追跡して、特定のデータベース インスタンスをアップグレードするために実行するスクリプトを知るにはどうすればよいですか? Lance のようなバージョン テーブルは、標準的な手順の下に記載されていますか?
タランティーノを参考にしていただきありがとうございます。私は .NET 環境ではありませんが、DataBaseChangeMangement wiki ページが非常に役立つことがわかりました。特にこのPowerpoint プレゼンテーション (.ppt)
*.sql
特定のディレクトリ内のスクリプトの名前をデータベース内のテーブルと照合してチェックし、ファイル名の最初の部分を形成する整数に基づいて、そこにないスクリプトを順番に実行する Python スクリプトを作成します。それが非常に単純な解決策であると思われる場合は、ここに投稿します。
このための作業スクリプトがあります。DB が存在しない場合は DB の初期化を処理し、必要に応じてアップグレード スクリプトを実行します。既存のデータベースを消去し、ファイルからテスト データをインポートするためのスイッチもあります。200行くらいなので載せません(興味があればペーストビンに載せるかもしれませんが)。