リキベースロールバックの紹介

Liquibaseロールバックの概要

1. 概要

previous articleで、データベーススキーマとデータを管理するためのツールとしてLiquibaseを示しました。

この記事では、ロールバック機能と、Liquibase操作を元に戻す方法について詳しく説明します。

当然のことながら、これは実稼働グレードのシステムの重要な機能です。

2. Liquibase移行のカテゴリ

Liquibase操作には2つのカテゴリがあり、ロールバックステートメントの生成が異なります。

  • automatic、ここで移行はロールバックに必要なステップを決定論的に生成できます

  • manual、移行命令を使用してステートメントを決定論的に識別することができないため、ロールバックコマンドを発行する必要があります

たとえば、the rollback of a “create table” statement would be to “drop” the created tableです。 これは疑いなく決定できるため、ロールバックステートメントを自動生成できます。

一方、the rollback statement for a “drop table” command is not possible to be determined。 テーブルの最後の状態を判別することはできないため、ロールバックステートメントを自動生成することはできません。 These types of migration statements require a manual rollback instructions.

3. 簡単なロールバックステートメントの記述

実行時にテーブルを作成し、変更セットにロールバックステートメントを追加する簡単な変更セットを作成しましょう。


    
        
        
        
    
    
        
    

上記の例は、上記の最初のカテゴリに該当します。 ロールバックステートメントを追加しない場合、ロールバックステートメントが自動的に作成されます。 ただし、rollbackステートメントを作成することにより、デフォルトの動作をオーバーライドできます。

次のコマンドを使用して移行を実行できます。

mvn liquibase:update

実行後、次を使用してアクションをロールバックできます。

mvn liquibase:rollback

これにより、変更セットのロールバックセグメントが実行され、更新段階で完了したタスクが元に戻されます。 ただし、このコマンドを単独で発行すると、ビルドは失敗します。

その理由は-ロールバックの制限を指定していないためです。初期段階にロールバックすることにより、データベースは完全に消去されます。 したがって、条件が満たされたときにロールバック操作を制限するには、以下の3つの制約のいずれかを定義する必要があります。

  • rollbackTag

  • rollbackCount

  • rollbackDate

3.1. タグへのロールバック

データベースの特定の状態をタグとして定義できます。 したがって、その状態に戻ることができます。 タグ名「1.0」にロールバックすると次のようになります。

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

これにより、タグ「1.0」の後に実行されるすべての変更セットのロールバックステートメントが実行されます。

3.2. カウントによるロールバック

ここで、ロールバックする必要がある変更セットの数を定義します。 1つに定義すると、最後の変更セットの実行がロールバックされます。

mvn liquibase:rollback -Dliquibase.rollbackCount=1

3.3. 日付へのロールバック

ロールバックターゲットを日付として設定できるため、その日以降に実行された変更セットはすべてロールバックされます。

mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"

日付形式はISOデータ形式であるか、実行プラットフォームのDateFormat.getDateInstance()の値と一致する必要があります。

4. ロールバックチェンジセットオプション

チェンジセットでのロールバックステートメントの可能な使用法を調べてみましょう。

4.1. マルチステートメントのロールバック

1つのロールバックタグで、実行する複数の命令を囲むことができます。


    
        
        
    
    
        
        
    
    
        
        
    

ここでは、同じロールバックタグに2つのテーブルをドロップします。 タスクを複数のステートメントに分割することもできます。

4.2. 複数のロールバックタグ

チェンジセットでは、複数のロールバックタグを使用できます。 それらは、チェンジセットでの出現順に実行されます。


    
        
        
    
    
        
        
    
    
        
    
    
        
    

4.3. ロールバックについては別のチェンジセットを参照してください

データベースの詳細を変更する場合は、別の変更セット、おそらく元の変更セットを参照できます。 これにより、コードの重複が減少し、行われた変更を正しく元に戻すことができます。


    
    
    

4.4. 空のロールバックタグ

デフォルトでは、Liquibaseは、指定されていない場合、ロールバックスクリプトを生成しようとします。 この機能を解除する必要がある場合は、空のロールバックタグを使用して、ロールバック操作が元に戻されないようにすることができます。


    
        
        
        
    
    

5. ロールバックコマンドオプション

データベースを以前の状態にロールバックする以外に、Liquibaseはさまざまな方法で使用できます。 これらは、ロールバックSQLを生成し、将来のロールバックスクリプトを作成します。最後に、移行とロールバックの両方を1ステップでテストできます。

5.1. ロールバックスクリプトを生成する

ロールバックと同様に、ロールバックSQLを生成するための3つのオプションが用意されています。 それらは:

  • rollbackSQL<tag> –データベースを上記のタグにロールバックするためのスクリプト

  • rollbackToDateSQL<date/time> –データベースを上記の日時の状態にロールバックするSQLスクリプト

  • rollbackCountSQL<value> –データベースを前のステップ数で指定された状態にロールバックするSQLスクリプト

実際の例の1つを見てみましょう。

mvn liquibase:rollbackCountSQL 2

5.2. 将来のロールバックスクリプトを生成する

このコマンドは、必要なロールバックSQLコマンドを生成し、その時点で実行に適したチェンジセットが完了した状態からデータベースを現在の状態にします。 これは、実行しようとしている変更に対してロールバックスクリプトを提供する必要がある場合に非常に役立ちます。

これは、実行しようとしている変更に対してロールバックスクリプトを提供する必要がある場合に非常に役立ちます。

mvn liquibase:futureRollbackSQL

5.3. 更新テストのロールバックを実行する

このコマンドは、データベースの更新を実行し、変更セットをロールバックしてデータベースを現在の状態にします。 将来のロールバックと更新テストのロールバックは、実行の終了後に現在のデータベースを変更しません。 ただし、更新テストロールバックは実際の移行を実行してからロールバックします。

これは、データベースを永続的に変更せずに、更新の変更の実行をテストするために使用できます。

mvn liquibase:updateTestingRollback

6. 結論

このクイックチュートリアルでは、Liquibaseのロールバック機能のコマンドラインと変更セットの機能について説明しました。

いつものように、ソースコードはover on GitHubで見つけることができます。