[解決済み] 開発、テスト、本番のデータベースをどのように管理するか?
質問内容
開発サーバー、テストサーバー、本番サーバーの間でデータベーススキーマとデータを管理する方法について、良い例を見つけるのに苦労しています。
これが私たちの設定です。各開発者は、私たちのアプリとMySQLデータベースを実行する仮想マシンを持っています。それは、彼らがやりたいことを何でもできる個人的なサンドボックスです。現在、開発者はSQLスキーマに変更を加え、データベースをテキストファイルにダンプし、SVNにコミットしています。
私たちは、常に最新のコミットされたコードを実行する継続的インテグレーション開発サーバーをデプロイしたいと考えています。今それをやると、ビルドのたびにSVNからデータベースをリロードすることになります。
テストサーバーには、リリース候補を実行するテスト(仮想)サーバーがあります。テストサーバーへのデプロイは、現在非常に手作業で行っており、通常は私がSVNから最新のSQLをロードして微調整しています。また、テストサーバーのデータには一貫性がありません。最後にコミットした開発者がサンドボックスサーバに持っていたテストデータをそのまま使うことになります。
すべてが崩れるのは、本番環境へのデプロイメントです。本番データをテストデータで上書きすることはできないので、スキーマの変更をすべて手作業で再作成することになります。スキーマの変更やデータ操作のための変換スクリプトが大量にある場合、これは本当に大変なことになります。
スキーマだけの問題なら簡単なのですが、データベースには、セキュリティや権限テーブルのメタデータなど、開発中に更新されるベースデータもあるんです。
これが、継続的インテグレーションやワンステップビルドに移行する際の最大の障壁だと思います。どのように あなた 解けたの?
続いての質問ですが、あるデータベースインスタンスをアップグレードするために実行するスクリプトを知るために、データベースのバージョンをどのように追跡しているのでしょうか?ランスの言うようなバージョンテーブルが標準的な手順なのでしょうか?
タランティーノへの言及ありがとうございます。私は.NET環境ではありませんが、彼らの DataBaseChangeMangementのwikiページ がとても参考になりました。特にこの パワーポイント資料 (.ppt)
の名前をチェックするPythonスクリプトを書こうと思います。
*.sql
スクリプトをデータベース内のテーブルと照合し、ファイル名の最初の部分を形成する整数に基づき、そこにないものを順番に実行します。もし、それがとても簡単な解決法であれば、ここに投稿します。
このためのスクリプトが動いているんだ。DBが存在しない場合は初期化し、必要に応じてアップグレードスクリプトを実行する処理をしています。また、既存のデータベースをワイプしたり、ファイルからテストデータをインポートするスイッチもあります。200行くらいなので、投稿はしません(興味があればpastebinに載せるかもしれませんが)。
どのように解決するのですか?
良い選択肢がいくつかあります。 私なら、quot;バックアップを復元する方法は使いません。
-
スキーマの変更をすべてスクリプト化し、CIサーバーでデータベース上でそのスクリプトを実行させます。 バージョンテーブルを用意して、現在のデータベースのバージョンを追跡し、新しいバージョンのスクリプトのみを実行するようにします。
-
移行ソリューションを使用する。 これらのソリューションは言語によって異なりますが、.NETの場合はMigrator.NETを使用しています。 これを使えば、データベースのバージョンアップやバージョン間の移動が可能です。 スキーマはC#のコードで指定します。
関連
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
MySQLのWhereの使用方法について説明します。
-
SQL集計、グループ化、ソート
-
MySQL サービスとデータベース管理
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
-
[解決済み] Mysqlでidを使用してテーブルから多くの行を削除する
-
[解決済み] MySQLにおけるスキーマとデータベースの違い
-
[解決済み】MySQLのDatetimeカラムにデフォルト値を設定する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
MySQLのLike演算子に関する詳細
-
MySQLのselect、distinct、limitの使い方
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
MySQLで正規表現を使う 詳細
-
面接では選択式で聞かれましたが......。.for updateはテーブルをロックするか、行をロックするか?
-
mysqlインデックスが長すぎる特殊なキーが長すぎる解決策
-
[解決済み] ユニークなテーブル/エイリアスではない
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。