1. ホーム
  2. mysql

[解決済み] 開発、テスト、本番のデータベースをどのように管理するか?

2022-04-22 01:10:19

質問内容

開発サーバー、テストサーバー、本番サーバーの間でデータベーススキーマとデータを管理する方法について、良い例を見つけるのに苦労しています。

これが私たちの設定です。各開発者は、私たちのアプリとMySQLデータベースを実行する仮想マシンを持っています。それは、彼らがやりたいことを何でもできる個人的なサンドボックスです。現在、開発者はSQLスキーマに変更を加え、データベースをテキストファイルにダンプし、SVNにコミットしています。

私たちは、常に最新のコミットされたコードを実行する継続的インテグレーション開発サーバーをデプロイしたいと考えています。今それをやると、ビルドのたびにSVNからデータベースをリロードすることになります。

テストサーバーには、リリース候補を実行するテスト(仮想)サーバーがあります。テストサーバーへのデプロイは、現在非常に手作業で行っており、通常は私がSVNから最新のSQLをロードして微調整しています。また、テストサーバーのデータには一貫性がありません。最後にコミットした開発者がサンドボックスサーバに持っていたテストデータをそのまま使うことになります。

すべてが崩れるのは、本番環境へのデプロイメントです。本番データをテストデータで上書きすることはできないので、スキーマの変更をすべて手作業で再作成することになります。スキーマの変更やデータ操作のための変換スクリプトが大量にある場合、これは本当に大変なことになります。

スキーマだけの問題なら簡単なのですが、データベースには、セキュリティや権限テーブルのメタデータなど、開発中に更新されるベースデータもあるんです。

これが、継続的インテグレーションやワンステップビルドに移行する際の最大の障壁だと思います。どのように あなた 解けたの?


続いての質問ですが、あるデータベースインスタンスをアップグレードするために実行するスクリプトを知るために、データベースのバージョンをどのように追跡しているのでしょうか?ランスの言うようなバージョンテーブルが標準的な手順なのでしょうか?


タランティーノへの言及ありがとうございます。私は.NET環境ではありませんが、彼らの DataBaseChangeMangementのwikiページ がとても参考になりました。特にこの パワーポイント資料 (.ppt)

の名前をチェックするPythonスクリプトを書こうと思います。 *.sql スクリプトをデータベース内のテーブルと照合し、ファイル名の最初の部分を形成する整数に基づき、そこにないものを順番に実行します。もし、それがとても簡単な解決法であれば、ここに投稿します。


このためのスクリプトが動いているんだ。DBが存在しない場合は初期化し、必要に応じてアップグレードスクリプトを実行する処理をしています。また、既存のデータベースをワイプしたり、ファイルからテストデータをインポートするスイッチもあります。200行くらいなので、投稿はしません(興味があればpastebinに載せるかもしれませんが)。

どのように解決するのですか?

良い選択肢がいくつかあります。 私なら、quot;バックアップを復元する方法は使いません。

  1. スキーマの変更をすべてスクリプト化し、CIサーバーでデータベース上でそのスクリプトを実行させます。 バージョンテーブルを用意して、現在のデータベースのバージョンを追跡し、新しいバージョンのスクリプトのみを実行するようにします。

  2. 移行ソリューションを使用する。 これらのソリューションは言語によって異なりますが、.NETの場合はMigrator.NETを使用しています。 これを使えば、データベースのバージョンアップやバージョン間の移動が可能です。 スキーマはC#のコードで指定します。