0

MySQL データ モデルを保存し、変更が行われたときに (または少なくとも毎晩) 開発データベース サーバーに変更を自動的に適用する最良の方法は何ですか?

たとえば、今日、私は自分のプロジェクトに取り組んでおり、データベースにこのテーブルを作成し、ステートメントを SQL ファイルに保存して、後で本番環境にデプロイします。

create table dog (
  uid int,
  name varchar(50)
);

そして明日、各犬の品種も記録したいと思います。そこで、SQL ファイルを次のように変更します。

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

このスクリプトは、最初のリリースでは本番環境で機能しますが、開発データベースの更新には役立ちませんERROR 1050 (42S01): Table 'dog' already exists。. さらに、この変更が最初のリリース後に行われた場合、本番環境では機能しません。だから私は今、本当にALTERテーブルに着く必要があります。

だから今、私は2つの懸念があります:

  1. これは、データ モデル (SQL ファイル内の一連の create ステートメント) を保存する方法ですか?
  2. このような変更をデータベースに適用するにはどうすればよいですか?

私の目標は、変更を正確にリリースし、継続的な統合を可能にすることです。私は DDLSYNC というツールを使用して、Oracle データベースの違いを見つけて適用しますが、MySQL に類似したツールが存在するかどうかはわかりません。

4

2 に答える 2

1

職場では、データベースのバージョン管理を管理するための小さなスクリプトを開発しました。テーブルまたはデータセットに変更を加えるたびに、独自のSQLファイルが取得されます。

ファイルには順番に番号が付けられます。その情報をデータベースに保存することにより、実行された更新ファイルを追跡します。スクリプトは、ファイルが実行されようとしているときにファイル名の行を挿入し、実行が終了すると行を完了タイムスタンプで更新します。これはトランザクション内にラップされます。(MySQLのDDLコマンドはトランザクション内では発生しないことを覚えておく価値があります。トランザクションでDDLを実行しようとすると、暗黙のコミットが発生します。)

SQLファイルはソースコードリポジトリの一部であるため、更新スクリプトの実行を通常のロールアウトプロセスの一部にすることができます。これにより、データベースとコードの同期を簡単に維持できます。正直なところ、最も難しいのは、保留中のコミットで別の開発者が次の番号を取得していないことを確認することです。

この更新システムを、開発データベースの(オプションの)夜間ワイプと組み合わせて、コンテンツを昨夜のライブシステムバックアップに置き換えます。バックアップが復元された後、更新が実行され、保留中の更新ファイルがプロセスで実行されます。

復元は、ライブデータベースにあったテーブルのみが上書きされるように行われます。したがって、テーブルを追加する更新は、テーブルが存在しない場合にのみテーブルを追加する責任を負う必要があります。 DROP TABLE IF EXISTS便利です。残念ながら、すべてのデータベースがこれをサポートしているわけではないため、更新システムでは、SQLだけでなく、選択した言語で記述されたスクリプトも実行できます。

これらすべてを約150行のコードで実行できます。ディレクトリを読み取り、内容をテーブルと比較し、まだ実行されていないものを決められた順序で実行するのと同じくらい簡単です。

于 2010-11-21T05:49:14.143 に答える
0

多くのフレームワークには、このための標準ツールがあります。Railsには、移行と呼ばれるものがあります。これは、PHPまたは同様の言語で簡単に複製できます。

于 2010-11-21T19:38:52.340 に答える