Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Databaseのスキーマバージョン管理

Oracle Databaseのスキーマバージョン管理

Oracle Databaseではスキーマをバージョン管理することで、アプリケーションからデータベースの変更を容易にしたり、無停止でのアプリケーション・バージョンアップを実現することが可能です。この資料ではスキーマバージョン管理を実現する2つの手法を紹介しています。

oracle4engineer

May 28, 2021
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. SQL Developerファミリー Time Tested Launched in 2005 An Industry Standard

    5M+ Oracle DBAs & Developers Always Improving Quarterly Releases 4 Copyright © 2021 Oracle and/or its affiliates. 3
  2. • SQL Developerのコマンドラインツール版 • 12.2以降で標準搭載。OCI YUM, OTNからもダウンロード(25MB)可 • SQL*Plusコマンドをサポートし追加機能あり •

    11.2以降をサポート SQLcl: Oracle Databaseの次世代コマンドラインツール Copyright © 2021 Oracle and/or its affiliates. 4
  3. v3..vN Upgrade v2 Deploy v1 Back to v2 ??? Rollback!

    実現したいことのイメージ Copyright © 2021 Oracle and/or its affiliates. 6
  4. Liquibaseとは 「DBのリファクタリング・ツール」 • オープン・ソース・プロジェクト • データベースのスキーマ/ユーザーのバージョンを配布 • Oracleを含む主要なDBMSをサポート • インストール、アップグレード、ロールバックが可能

    Liquibaseによる変更ログ管理のメリット • コーディングを少なく • フレンドリーなインターフェース • データベースのオブジェクトの依存関係の順序を認識可能 • 更新すると自動的にロールバック・シナリオが生成 ソリューション: Liquibaseを活用して容易に Copyright © 2021 Oracle and/or its affiliates. 7
  5. コマンドラインで実行可能 Apache Ant, Apache Maven, servlet container, Spring Framework. Liquibase

    – どのように動作するか 有効ではあるが…開発・運用者が変更ログを使ったアップグレードとロールバックのコーディングをする必要あり このコーディングの際に 変更ログの適用順序を意識する必要あり Copyright © 2021 Oracle and/or its affiliates. 8
  6. • LiquibaseのOracleライブラリをリプレース • SQLclの中に’lb’ コマンドを実装 • SQLcl 19.2以降 どのように動作するか? •

    DBMS_METADATAパッケージを活用しXMLの変更ログを生成 • 接続されたユーザーで動作し $SQL_PATH に書き込み • XMLをパースし、オブジェクト作成順序を決定 SQLcl + Liquibase SQLcl: a modern CLI for your Oracle Database Copyright © 2021 Oracle and/or its affiliates. 9
  7. SQLclのLiquibase機能を使用すると、次のことが可能 • 単一オブジェクトの変更ログを生成して実行する • オブジェクトの依存性を持つスキーマ変更セットを生成して実行する • 作成中に、オブジェクトの依存性に基づいて変更セットを自動的にソートする • 変更セットまたは変更ログの実行に関するすべてのSQL文を、生成時に記録する •

    変更セットおよび変更ログの完全なロールバック・サポートを自動的に提供する SQLclと LB コマンド ドキュメントはこちら https://docs.oracle.com/cd/F40600_01/sqcug/using-liquibase-sqlcl.html#GUID-4CA25386-E442-4D9D-B119-C1ACE6B79539 Copyright © 2021 Oracle and/or its affiliates. 10
  8. スキーマに接続 オブジェクトの取得 別のスキーマへ接続 別のスキーマへオブジェクト作成 オブジェクトの取得とデプロイ Copyright © 2021, Oracle and/or

    its affiliates 11 SQL> connect hr/hr Connected. SQL> lb genobject -type table -name employees Action successfully completed please review created file employees_table1.xml SQL> connect hr2/hr2 Connected. SQL> lb update -changelog employees_table.xml false ScriptRunnerExecuted:/Users/jdoe/Documents/lbtest/v2/employees_table.xml::648 6f968-93fe-4e1c-ac59-17ef392e1423::Generated
  9. GENOBJECT : オブジェクトの変更ログの作成 GENSCHEMA:接続しているスキーマの変更ログの作成 UPDATE : 指定した変更ログの適用 UPDATESQL : 指定したログに更新するSQLを生成

    ROLLBACK:変更を要求した状態にロールバック ROLLBACKSQL : 要求した状態にロールバックするためのSQLを生成 DIFF : 2つのデータベース間の差違を出力 など サポートされるlbコマンド Copyright © 2021, Oracle and/or its affiliates 12
  10. エディションベースの再定義 マニュアル (19c) : https://docs.oracle.com/cd/F19136_01/adfns/editions.html#GUID-58DE05A0-5DEF-4791- 8FA8-F04D11964906 Technical Deep Dive (英語)

    : https://www.oracle.com/a/tech/docs/ebr-technical-deep-dive-overview.pdf FAQ(英語) : https://www.oracle.com/a/tech/docs/ebr-faq.pdf Copyright © 2021, Oracle and/or its affiliates 13
  11. エディション・ベースの再定義とは? アップグレード前のアプリケーションとアップグレード後のアプリケーションが共存可能 アップグレード前 アプリケーション Oracle Database アップグレード後 アプリケーション View Package

    Table Package View Edition 1 Edition 2 アプリケーションを停止せず、 緩やかな移行が可能 Edition1のセッション Edition2のセッション データベーススキーマ内に複数のエディションを構成して、スキーマ変更を伴うアプリケーションの 無停止アップグレードへの活用 Copyright © 2021 Oracle and/or its affiliates. 14
  12. SCOTTユーザのHelloプロシージャをエディション化して 異なる2つの処理を実行できるプロシージャを作成する エディション化をしてみると? 16 scott.hello() BEGIN hello(); END; “Hello edition

    1” BEGIN hello(); END; “Hello edition 2” 同一オブジェクト名にもかかわらず、処理内容が異なっている Edition 1 Edition 2 Copyright © 2021 Oracle and/or its affiliates.
  13. 1. Scottユーザをエディション使用可能に変更 Create User または、Alter User Ex) alter user scott

    enable editions; 2. ScottユーザでHello プロシージャを作成 ここで作成するプロシージャが後でEdition化される 3. Helloプロシージャを実行する BEGIN Hello(); END; >Hello, edition 1.  “Hello edition 1”のメッセージが返ることを確認 エディション化するための手順例 17 CREATE OR REPLACE PROCEDURE Hello IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello, edition 1.'); END hello; / ora$base DB内部のイメージ ora$baseは、データベース内に エディションがない場合のデフォ ルト。左記の手順ではまだエ ディションを作成していないので、 すべてこのora$baseエディショ ンにオブジェクトが作成されてい くことになる Copyright © 2021 Oracle and/or its affiliates.
  14. 4. Editionを作成する CREATE EDITION文 Ex) CREATE EDITION e2 as child

    of Ora$Base; ※上記コマンドで“e2”というエディションが作成され、 その結果、データベースには“ora$base”と“e2”という 二つのエディションが存在することになる また、ora$baseはすでにHelloプロシージャを所有していたので、 “e2”エディションに継承される つまり、 “ora$base”と“e2”それぞれにHelloプロシージャを持っている ということになる (現時点では、プロシージャの中身はまったく同じ) エディション化するための手順例 18 ora$base e2 継承される DB内部のイメージ Copyright © 2021 Oracle and/or its affiliates.
  15. 5. エディション化されたオブジェクトを更改 Connect scott/tiger edition=e2; “e2”エディション上でHelloプロシージャを編集 エディション化するための手順例 19 CREATE OR

    REPLACE PROCEDURE Hello IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello, edition 2.'); END hello; / conn scott/tiger edition=ora$base; BEGIN Hello(); END; Hello, edition 1. conn scott/tiger edition=e2 BEGIN Hello(); END; Hello, edition 2. “ora$base”エディションの Helloプロシージャを実行 “e2”エディションの Helloプロシージャを実行 ora$base e2 DB内部のイメージ 上記のコマンドで、“e2”エディションの Helloプロシージャの出力メッセージを変更 つまり、DB内には、それぞれロジックの異なる Helloプロシージャが2つ存在している どちらのプロシージャを実行するかは、ユーザーが 接続しているエディションに依存する “ora$base”エディションの実行結果と、 “e2” エディションの実行結果が異なっていることに注目 Copyright © 2021 Oracle and/or its affiliates.
  16. Synonym View SQL翻訳プロファイル All PL/SQL object types: • Function •

    Library • Package および Package Body • Procedure • Trigger • Type および Type Body エディション化可能なオブジェクト 20 ※テーブルはエディション化できない 後述のエディショニング・ビューとクロスエディション・トリガーを組み合わせることで、 仮想的にテーブルをエディション化させることが可能 Copyright © 2021 Oracle and/or its affiliates.
  17. エディショニング・ビューによる新しいテーブルアクセス • 直接物理テーブルをアクセスするのではなく、エディショニング・ビューを仮想的なテーブルとみなしてアクセス • アプリケーションからは、通常のテーブルのように使用可能 • エディショニング・ビューはオンラインで作成できるため、稼働中のアプリケーションの可用性に影響を与えない • 実データは、エディショニング・ビューの元表となる物理テーブルに格納される •

    物理的な列名(テーブルの列名)と、論理的な列名(エディショニング・ビューの列名)をマップ エディショニング・ビュー 22 物理テーブル Contacts_Table UPG前アプリケーション エディショニング・ビュー エディショニング・ビュー UPG後アプリケーション ID Name Sal ID First Sal Last Contacts Contacts エディショニング・ビュー名は同じ 列数が4列に変更 Copyright © 2021 Oracle and/or its affiliates.
  18. エディショニング・ビューにおけるデータ同期の課題を解決 クロスエディション・トリガー 23 Show_Contacts Contacts アップグレード前アプリケーション アップグレード後アプリケーション Show_Contacts Contacts ID

    Nam e … Contacts_Table (ベース表) First Last EV名 EV名 APP APP それぞれのエディショニング・ビューが、ベース表である Contacts_Tableにアクセスしている アップグレード前アプリケーションがContactsで更新す るのは、ID列とName列。しかしName列はアップグ レード後のアプリケーションでは参照できない ずれが発生 Copyright © 2021 Oracle and/or its affiliates.
  19. フォワード・クロスエディション・トリガーは、(親)エディションのエディショニング・ビューから、(子)エディションのエディショニング・ビューへデータを 反映し、同期を行う フォワード・クロスエディション・トリガー 24 Show_Contacts Contacts アップグレード前アプリケーション アップグレード後アプリケーション Show_Contacts Contacts

    ID Name … Contacts_Table (ベース表) First Last APP APP Forward Crossedition Trigger アップグレード前のアプリケーションで更新された Name列の情報を、アップグレード後のアプリケーション が使用するFirst列とLast列に反映することで、データ の整合性を保つ ➔アップグレード後のアプリケーションからでも、アップグ レード前のアプリケーションで更新された情報にアクセス できる Copyright © 2021 Oracle and/or its affiliates.
  20. リバース・クロスエディション・トリガーは、(子)エディションのエディショニング・ビューから、(親)エディションのエディショニング・ビューへデータを 反映し、同期を行う リバース・クロスエディション・トリガー 25 Show_Contacts Contacts アップグレード前アプリケーション アップグレード後アプリケーション Show_Contacts Contacts

    ID Name … Contacts_Table (ベース表) First Last APP APP Reverse Crossedition Trigger アップグレード後のアプリケーションで更新されたFirst 列とLast列の情報を、アップグレード前のアプリケーショ ンが使用するName列に反映することで、データの整 合性を確保する ➔アップグレード前のアプリケーションからでも、アップグ レード後のアプリケーションで更新された情報にアクセス できる Copyright © 2021 Oracle and/or its affiliates.