増分移行が腐敗することに私は本当に同意しません。私の意見では、自家製のスクリプトのセットを用意することは、そのような仕事のための実際のツールを用意するよりも悪いアプローチであり、それらの変更の追跡が容易になります。以前は自分で同じような状況に対処しなければならなかったので、いくつかの洞察を共有できることを願っています。
私の経験では、RDBMS-スキーマとブランチはあまりうまく混ざっていません。分岐に応じて、スキーマはおそらく少なくともある程度類似しているはずです。その場合、移行はそれほど異ならないはずです。または、問題の全容を誤解している可能性があります。たとえば、顧客固有のコードをブランチに保持しようとしている場合は、代わりにモジュール化する方法を検討する必要があります。私たちはこのようなことを行い、顧客固有のスキーマが変更され、コードは共通のコードベースにのみ依存することができ、その逆はできないというルールがありました。また、モジュールと日付に基づいてモジュール変更セット間の優先順位を設定したため、ほとんどの部分で、変更が適用される順序がわかっていました。もちろんYMMVですが、現在の設定を知らずに詳細を説明するのは困難です。
私の古い会社では、Liquibaseというツールを使用することに成功しました。これは、使用しているものと似ています。基本的には、DBスキーマ、およびある既知の状態から別の既知の状態へのすべてのデータを取得するためのツールです。liquibaseはチェックサム付きの変更ログを維持するため、同じ変更セットは1回だけ適用されます。変更ログは特定のXML形式で書き込まれます。別の方法が必要な場合は、試してみることを強くお勧めします。
とにかく、顧客コードとブランチを処理する方法は、特定のブランチに特定のDB/スキーマを用意することでした。このようにして、分岐点からスキーマとデータを取得し、差分を現在の状況にのみ移行することができます。理論的にはliquibaseがこれをサポートできたとしても、変更を元に戻すことはしませんでした。これは、非常に面倒でエラーが発生しやすいと感じたためです。liquibaseが独自の状態を維持していることを考えると、移行は常に、特定のブランチで現在の状態を取得し、すべてを適用するのと同じくらい簡単でした。新しいチェンジセットのみが適用され、スキーマは良好な状態のままになりました。
gitのように配布されているmercurialを使用したので、セットアップは非常に似ていました。また、開発用ラップトップには開発者固有のローカルDBがあり、さまざまな顧客とフェーズ(開発、統合、本番)の両方に対応する多数の環境があったため、モデルは実際にテストされ、驚くほどうまく機能しました。チェンジセットでいくつかの競合が発生しましたが、問題が発生した直後にほとんど解決できました。開発中にいくつかのスキーマ変更が導入された可能性があるため、ローカル開発環境は実際に最も困難な部分でした。これは、後の変更セットと常に互換性があるとは限りませんが、変更の構造化された性質と、元に戻してごくわずかになる既知の状態があります。本当の問題。
このアプローチにはいくつかの注意点があります。
- スキーマへのすべての変更は、チェンジセットに実装する必要があります。混乱の最大の原因は、いつも誰かが少しいじっているだけでした。
- 最初のポイントは、スキーマを変更するツール( HibernateなどのORMツールなど)を使用している場合にも当てはまります。このツールが行う変更と必要な変更を理解するには、このツールにかなり精通している必要があります。
- すべてのユーザーはこれに同意し、ルールに従うように教育を受ける必要があります。チェック1。
- 多くのチェンジセットの移行に時間がかかりすぎる時期が来ています。この時点で、新しいベースラインを作成する必要があります。これは、特に多くのブランチがある場合は、少し注意が必要です。これについても事前に計画し、少なくとも既存のすべてのDBブランチについて知っておくとよいでしょう。
- ある時点でブランチがマスターに戻るかどうかを知るために、ブランチについて少し前もって計画する必要があります。単純なマージは、スキーマの変更ではうまく機能しない可能性があります。
- 非常に長寿命のブランチと分離されたデータセットの場合、このモデルは十分に強力ではない可能性があります
ただし、重要なのは、データベースに対する構造と制御が多ければ多いほど、移行が容易になるということです。したがって、Liquibaseのようなツールは、これらの変更を追跡するのに役立つ非常に貴重な資産になる可能性があります。これは、単純なモデルよりもさらに複雑なモデルにも当てはまるため、少なくとも、すでに配置されているすべてのツールをダンプすることを検討しないでください。そして、他の代替ツールを探索するために少し時間がかかります。
いくつかの構造と制御は、何もないよりも優れているか、さらに悪いことに、大量の手動スクリプトで制御していると考えています。