データベースをバージョン管理下に置きたいのですが、どうすればいいですか? どなたかアドバイスやお勧めの記事をお持ちの方はいらっしゃいますか?
私は常にそこに少なくともいくつかのデータ(alumbが言及するように:ユーザの種類と管理者)を持っていたいと思っています。 また、パフォーマンス測定のために、生成されたテストデータの大規模なコレクションが必要なこともよくあります。
Martin Fowlerは、このテーマについて私のお気に入りの記事を書いています。http://martinfowler.com/articles/evodb.html。 私は、本番用データベースを簡単にアップグレードしたいので、_alumb_や他の人が言うように、バージョン管理下にスキーマダンプを置かないことにしています。
Webアプリケーションで、本番用データベースインスタンスを1つだけ持つ場合、私は2つのテクニックを使います。
スキーマをバージョンNからN+1に移行するために必要なDDLを含む一連のデータベースアップグレードスクリプトです。 (これらはバージョン管理システムに格納されます。) _versionhistory テーブルは、以下のようなものです。
create table VersionHistory (
Version int primary key,
UpgradeStart datetime not null,
UpgradeEnd datetime
);
は、新しいバージョンに対応するアップグレードスクリプトが実行されるたびに、新しいエントリを取得します。
これにより、どのバージョンのデータベーススキーマが存在するかを簡単に確認でき、データベースのアップグレードスクリプトが一度だけ実行されることを保証します。 繰り返しますが、これらは not データベースダンプです。 むしろ、各スクリプトは、あるバージョンから次のバージョンに移行するために必要な 変更点 を表しています。 これらのスクリプトは、本番データベースに適用してアップグレードするためのスクリプトです。
1.本番用データベースのバックアップ、サニタイズ、シュリンクを行うスクリプトです。 本番用DBをアップグレードするたびに実行する。 2.2. 開発者のワークステーションでバックアップを復元する(必要であれば調整する)スクリプト。 各開発者は、本番用DBをアップグレードするたびに、このスクリプトを実行します。
このような場合、「このような場合、このような場合、このような場合、このような場合、このような場合、このような場合、このような場合、このような場合、このような場合、このような場合、このような場合」 となります。
これは、開発を取り巻く「難しい問題」のひとつです。私の知る限り、完璧な解決策はありません。
データではなく、データベースの構造だけを保存する必要がある場合は、データベースをSQLクエリとしてエクスポートすることができます。(EnterpriseManagerで。データベース上で右クリック -> SQLスクリプトを生成します。オプションタブの「オブジェクトごとに1つのファイルを作成する」を設定することをお勧めします)その後、これらのテキストファイルをsvnにコミットして、svnのdiffとlogging機能を利用することができます。
私はこれを、いくつかのパラメータを受け取ってデータベースをセットアップするバッチスクリプトに結びつけました。また、ユーザータイプや管理者ユーザーなどのデフォルトデータを入力するクエリもいくつか追加しました。(これに関する詳細な情報が必要な場合は、何か投稿していただければ、スクリプトをアクセス可能な場所に置くことができます)
もし、すべてのデータも残しておく必要があるなら、データベースのバックアップをとっておき、Redgate(http://www.red-gate.com/)製品を使って比較することをお勧めします。このような場合には、Redgateの製品を使用することをお勧めします。
しかし、もしあなたが進化するDBスキーマを効率的に追跡する方法を探していて、Rubyを使うことに抵抗がなければ、ActiveRecord#39のマイグレーションはあなたの好みに合うと思います。
マイグレーションは、Ruby DSL を使用してデータベース変換をプログラム的に定義します。各変換は適用または(通常は)ロールバックすることができ、任意の時点で DB スキーマの異なるバージョンにジャンプすることができます。これらの変換を定義したファイルは、他のソースコードと同様にバージョン管理でチェックすることができます。
マイグレーションはActiveRecordの一部なので、通常はフルスタックのRailsアプリで使用されます。しかし、最小限の努力でRailsとは無関係にActiveRecordを使用することもできます。Rails以外でAR'のmigrationsを使う場合の詳しい説明は、こちらを参照してください。