MySQL データ モデルのバージョン管理と同期はどのように行うのでしょうか?

StackOverflow https://stackoverflow.com/questions/4236600

質問

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ファイルにステートメントの作成の束)を保存する方法です。
  2. このような変更をデータベースに適用するにはどうすればよいですか?

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

役に立ちましたか?

解決

仕事で、私達は私達のデータベースのバージョンを管理するための小さなスクリプトを開発しました。任意のテーブルまたはデータセットへのすべての変更は、それ自身のSQLファイルを取得します。

ファイルが順次番号が付けられます。私たちは、アップデートファイルがデータベースにその情報を格納することによって実行されているのを追跡します。スクリプトファイルが実行されようとしているファイル名を持つ行を挿入し、終了のタイムスタンプ実行が終了して行を更新します。これは、トランザクション内にラップされます。 (これは、MySQLでのDDLコマンドがトランザクション内で発生することができないという価値思い出します。トランザクション内でDDLを実行しようとする試みは、暗黙的なコミットが発生します。)

SQLファイルは、当社のソースコードリポジトリの一部であるため、

、我々は通常のロールアウトプロセスの更新スクリプトの一部を実行することができます。これはパイとして簡単に同期して、データベースとのコードを維持することができます。正直なところ、最も難しい部分は、必ず別のDEVが保留中の次の数はコミットつかんでいません行っています。

私たちは、毎晩昨夜のライブシステムバックアップと内容を置き換え、当社のdevのデータベースのワイプ(別売)で、この更新システムを兼ね備えています。バックアップが復元された後、更新が保留中の更新ファイルはプロセスで実行を取得し、実行します。

復元が稼働中のデータベースにあったテーブルのみが上書きされるように発生します。したがって、テーブルを追加し、任意のアップデートでは、それが存在しない場合にのみ、それを追加するための責任を負うことがあります。 DROP TABLE IF EXISTSは便利です。更新システムはまた、選択した私たちの言語で書かれたスクリプトを実行することができますので、残念ながら、すべてのデータベースには、これをサポートしていませだけではなく、SQLます。

のコードの150行については、この中のすべて。これは、ディレクトリを読んで、テーブルに内容を比較し、すでに決定したために、実行されていない何かを実行するように簡単ようです。

他のヒント

このための標準的なツールは、多くのフレームワークであります。Railsは移行、簡単にPHPまたは任意の同様の言語で複製何かます。

scroll top