
Liquibaseは、データベース移行管理システムです。 これはLiquibaseの2番目の記事で、今回はシステムの「戦闘」使用のヒントが含まれています。 基本的な情報については、最初の翻訳記事「Manquiing Database Migration with Liquibase」(
リンク )が適しています。
ソフトウェア開発者の作業を容易にする多くのツールと同様に、Liquibaseには遅かれ早かれ直面しなければならない「フリップサイド」があります。
Liquibaseでの作業の1つの時点で私に啓示だった10の事柄があります。
1.アプリケーションのバージョン管理は、移行のフォルダー構造に反映される必要があります
このルールに従わない場合、変更ログファイルは、番号と通常でない名前で移行フォルダーをすばやく装飾します。
現時点では、私自身のために、ファイルとフォルダーに名前を付けるための最適な戦略を開発しました。 ここにあります:
/db-migrations /v-1.0 /2013-03-02--01-initial-schema-import.xml /2013-03-02--02-core-data.xml /2013-03-04--01-notifications.xml /changelog-v.1.0-cumulative.xml /v-2.0 ... /changelog-v.2.0-cumulative.xml /changelog.xml
詳細:
1.1。 データベースの変更の変更ログは、個別のフォルダーに保存し、アプリケーションのバージョンに対応させる必要があります。
長所:
- バージョンからアプリケーションバージョンへの移行中に発生したデータスキームの変更をいつでも簡単に確認できます。
- フォルダの精度は維持されますが、リラックスすることはできません。
1.2。 各バージョンの累積変更ログファイルがある
メインの移行ファイルは/db-migrations/changelog.xmlです。 各バージョンの累積変更ログファイルのみが含まれます( "include"タグ)。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"> <include file="v-1.0/changelog-v.1.0-cumulative.xml" relativeToChangelogFile="true"/> <include file="v-2.0/changelog-v.2.0-cumulative.xml" relativeToChangelogFile="true"/> </databaseChangeLog>
同様に、アプリケーションバージョンの累積変更ログには、チェンジャーセットを持つ特定のファイルが含まれます。
したがって、変更ログのメインファイルを散らかさないようにすることができます。
1.3。 ファイルの命名ガイドラインに従う
ファイル命名規則を使用すると、累積的なファイルチェンジャーを表示せずに、従った内容を理解できます。
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
-<DATE_INCR>-.xml
DATE –
DATE_INCR – ( .)
DESCR – .
:
2013-03-02--01-initial-schema-import.xml
2. ,
( rollback ) .
, . , .
, PROD-, , , , .
3. ,
— . , , .
, , rollback. .
4. , ,
, Oracle MySQL DDL- .
, , DDL-, .
( ):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
インデックスの追加中にエラーが発生した場合、HOUSESテーブルは削除されません!
痛みを避ける方法は? データベーススキーマの各変更は、独自の変更ログに存在する必要があります。
例(とても正しい):
<changeSet id="2013-03-02-initial-schema-import-1" author="eg"> <createTable tableName="HOUSES"> <column name="ID" type="BIGINT" /> </createTable> </changeSet> <changeSet id="2013-03-02-initial-schema-import-2" author="eg"> <addPrimaryKey tableName="HOUSES" columnNames="ID" /> </changeSet>
5.移行スクリプトを実行するパスが重要です
2つのコマンドを見て、データベーススキーマ移行スクリプトを実行します
cd c:/mychangelogs/ liquibase --url=jdbc:mysql://localhost:3306/liquiblog --driver=com.mysql.jdbc.Driver --username=root --password="" --changeLogFile=db.changelog-0.1.0.xml update
liquibase --url=jdbc:mysql://localhost:3306/liquiblog --driver=com.mysql.jdbc.Driver --username=root --password="" --changeLogFile=c:/mychangelogs/db.changelog-0.1.0.xml update
2番目のチームは変更をロールアウトすべきではないようです。 しかし、そうではありません。Liquibaseは、変更ログファイルへのパスをDATABASECHANGELOGテーブルのFILENAME列に保存します。
この事実に関連して、Liquibaseは2回目の起動時にすべてのチェンジャーセットが新しいと見なします。 データスキームが壊れる可能性があります!
痛みを避ける方法は? 常に同じディレクトリからの相対パスを使用して変更ログを実行します。
6.前提条件は、変更ログのチェックサムに影響しません
これは、エラーの愛好家(つまり、遅かれ早かれ私たち全員)にとって朗報です。 これにより、チェントの使用条件を変更して、「過去を修正する」ことができる場合があります。
7. Liquibaseは、頻繁に変更されるデータにはあまり適していません。
同じタイプのデータの多くを移行しようとしたが、変更ログを介して構成データのバージョンからバージョンに変更した。 非常に悲しいことが判明しました-常にチームの誰かが間違っていて、エラーがテスト環境に残っていたので、完全に手動でロールバックする必要がありました(チップセットのチェックサムを覚えていますか?)。
暗い画像は、特定の状況に対する冷静なアプローチによって修正する必要がありました。 Liquibaseはデータスキームを変更するために残され、各バージョンの構成データには、プロパティファイルをソースとして持つGroovyスクリプトが注がれました。
8. changetosetsの自動生成用のスクリプトを信じない
Liquibaseは生成できます
- 既存のデータベーススキーマに応じたチェンジャー、
- 既存のチェンジャーセットと比較したデータベースで発生した差異(Grailsに適用可能)。
これらの施設の取り扱いには注意が必要です。 これはほんの少しのルーチンを取り除くだけで、それ以上はありません。 すべてのチェンジャーセットを表示、理解、および検証する必要があります。 PRODに送られた論理的なエラー(愚かなユーティリティによって引き起こされた)を修正したくありませんよね?
9. DSLではなくXMLを使用する
場合によっては、「生活を楽にし」、短いDSL(groovy、yaml、json)の使用を開始してXMLを放棄したいことがあります。
これはすべて、次の機能が必要になるまで非常に優れています。
- IDEでの自動補完
- データスキームに応じたドキュメントの正式な忠実性の自動検証
さて、簡潔さを優先してこのような有用なものを放棄するのはなぜですか? どうやら、コードの読みやすさを向上させるために、オートコンプリートを拒否するプログラマーはあまり得意ではないようです。
10.他の人の経験を学ぶ
この記事のほとんどのポイントは私自身の経験から学びましたが、公式のLiquibaseベストプラクティスガイドはツールの認識を改善します(
リンク )
移行が成功しました!