2017-09-18 4 views
0

私たちはアプリケーションの基礎となるリレーショナルデータベースの構造の変更を管理するためにliquibaseを使用しています。データベースのバックエンドとしてPostgreSQLを使用しています。長時間実行されているliquibaseデータベースの更新を非同期に実行

今や、数百万のエントリを持つテーブルがあり、これらの大きなテーブルのいくつかにインデックスを追加する必要があります。テーブルのサイズのため、インデックスの作成にかなりの時間がかかります。これにより、アプリケーションの起動がブロックされます。これは、アプリケーションの起動段階でliquibaseチェンジセットが実行され、アプリケーションが実際に実行される前に適切な永続性バックエンドが使用可能になるようにします。

明示的な理由からアプリケーションを開始する前に構造の変更を行う必要がありますが、アプリケーションが既に実行されている間にインデックスを追加することができます。したがって、私の質問:

liquibaseと非同期にインデックスを作成する方法はありますか?

すでにCONCURRENT option provided by PostgreSQLを使用しようとしました。これは、アプリケーションの実行時にインデックスを作成するときに役立ちます。これは、それぞれのテーブルがインデックスの作成によってロックされないためです。しかし、それぞれのliquibaseチェンジセットは、次のチェンジセットが実行される前にインデックスの作成が終了するのを待ちます。

+0

私はそれがliquibaseのメカニズムはないと思います。何かを非同期に実行すると、後で何らかの形で(インデックスの作成が完了したときにコールバックを持つように)同期させることになります。 DBに正常に適用された場合、Liquibaseはすべての変更とログを追跡しています。また、結果を使用して、「チェンジセットxが成功しなかった場合に更新全体を停止する」ようなさらなる実行を制御することができます。これは、何かが非同期で実行されている場合は不可能です。私はそれが可能ではないということを言っているわけではない、私はこれが現在liquibaseで実装されていないと思う... – Jens

答えて

0

これは、直接ことはできませんが、回避策ことができます問題:

あなたは手動でLiquiBaseを実行前に、インデックス作成を実行する必要があります。 (これにより、「同時に」オプションを使用することができます)。

変更を記録するために、インデックス作成スクリプト(「同時」オプションなし)とonFail = "MARK_RAN"の前提条件を追加してliquibaseすることができます。

次回にliquibaseを実行すると、チェンジセットは実行済みとしてマークされます。

関連する問題