Slide 1

Slide 1 text

Oracle Database のスキーマ・バージョン管理 日本オラクル株式会社 2021年5月

Slide 2

Slide 2 text

• SQLcl + Liquibase • エディションベースの再定義 アジェンダ Copyright © 2021 Oracle and/or its affiliates. 2

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

• SQL Developerのコマンドラインツール版 • 12.2以降で標準搭載。OCI YUM, OTNからもダウンロード(25MB)可 • SQL*Plusコマンドをサポートし追加機能あり • 11.2以降をサポート SQLcl: Oracle Databaseの次世代コマンドラインツール Copyright © 2021 Oracle and/or its affiliates. 4

Slide 5

Slide 5 text

アプリケーション・スキーマの中の • 表 • ビュー • ストアド・プロシージャ 等スキーマ内のすべてを管理 スキーマのバージョン管理 Copyright © 2021 Oracle and/or its affiliates. 5

Slide 6

Slide 6 text

v3..vN Upgrade v2 Deploy v1 Back to v2 ??? Rollback! 実現したいことのイメージ Copyright © 2021 Oracle and/or its affiliates. 6

Slide 7

Slide 7 text

Liquibaseとは 「DBのリファクタリング・ツール」 • オープン・ソース・プロジェクト • データベースのスキーマ/ユーザーのバージョンを配布 • Oracleを含む主要なDBMSをサポート • インストール、アップグレード、ロールバックが可能 Liquibaseによる変更ログ管理のメリット • コーディングを少なく • フレンドリーなインターフェース • データベースのオブジェクトの依存関係の順序を認識可能 • 更新すると自動的にロールバック・シナリオが生成 ソリューション: Liquibaseを活用して容易に Copyright © 2021 Oracle and/or its affiliates. 7

Slide 8

Slide 8 text

コマンドラインで実行可能 Apache Ant, Apache Maven, servlet container, Spring Framework. Liquibase – どのように動作するか 有効ではあるが…開発・運用者が変更ログを使ったアップグレードとロールバックのコーディングをする必要あり このコーディングの際に 変更ログの適用順序を意識する必要あり Copyright © 2021 Oracle and/or its affiliates. 8

Slide 9

Slide 9 text

• 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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

スキーマに接続 オブジェクトの取得 別のスキーマへ接続 別のスキーマへオブジェクト作成 オブジェクトの取得とデプロイ 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

Slide 12

Slide 12 text

GENOBJECT : オブジェクトの変更ログの作成 GENSCHEMA:接続しているスキーマの変更ログの作成 UPDATE : 指定した変更ログの適用 UPDATESQL : 指定したログに更新するSQLを生成 ROLLBACK:変更を要求した状態にロールバック ROLLBACKSQL : 要求した状態にロールバックするためのSQLを生成 DIFF : 2つのデータベース間の差違を出力 など サポートされるlbコマンド Copyright © 2021, Oracle and/or its affiliates 12

Slide 13

Slide 13 text

エディションベースの再定義 マニュアル (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

Slide 14

Slide 14 text

エディション・ベースの再定義とは? アップグレード前のアプリケーションとアップグレード後のアプリケーションが共存可能 アップグレード前 アプリケーション Oracle Database アップグレード後 アプリケーション View Package Table Package View Edition 1 Edition 2 アプリケーションを停止せず、 緩やかな移行が可能 Edition1のセッション Edition2のセッション データベーススキーマ内に複数のエディションを構成して、スキーマ変更を伴うアプリケーションの 無停止アップグレードへの活用 Copyright © 2021 Oracle and/or its affiliates. 14

Slide 15

Slide 15 text

データベース内のオブジェクトを仮想的にバージョニングすることを実現する機能 • アップグレード前とアップグレード後のアプリケーションの共存 • アプリケーションダウンタイムの最小化 • セッション単位での柔軟なエディションの変更 • Oracle Database 11g Release 2より利用可能 エディション 15 オブジェクト オブジェクト Copyright © 2021 Oracle and/or its affiliates.

Slide 16

Slide 16 text

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.

Slide 17

Slide 17 text

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.

Slide 18

Slide 18 text

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.

Slide 19

Slide 19 text

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.

Slide 20

Slide 20 text

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.

Slide 21

Slide 21 text

エディショニング・ビューは、11g R2以降で利用できるオブジェクト • 仮想的にテーブルをエディション化するために使用 • ビューではなくテーブルと同様の特性 • Before、Afterトリガーで、DML文での直接変更が可能 • 通常のView同様に低いオーバーヘッド エディショニング・ビュー 21 トリガーのタイプ オブジェクト Before After Instead of Table Y Y N View N N Y Editioning View Y Y N Copyright © 2021 Oracle and/or its affiliates.

Slide 22

Slide 22 text

エディショニング・ビューによる新しいテーブルアクセス • 直接物理テーブルをアクセスするのではなく、エディショニング・ビューを仮想的なテーブルとみなしてアクセス • アプリケーションからは、通常のテーブルのように使用可能 • エディショニング・ビューはオンラインで作成できるため、稼働中のアプリケーションの可用性に影響を与えない • 実データは、エディショニング・ビューの元表となる物理テーブルに格納される • 物理的な列名(テーブルの列名)と、論理的な列名(エディショニング・ビューの列名)をマップ エディショニング・ビュー 22 物理テーブル Contacts_Table UPG前アプリケーション エディショニング・ビュー エディショニング・ビュー UPG後アプリケーション ID Name Sal ID First Sal Last Contacts Contacts エディショニング・ビュー名は同じ 列数が4列に変更 Copyright © 2021 Oracle and/or its affiliates.

Slide 23

Slide 23 text

エディショニング・ビューにおけるデータ同期の課題を解決 クロスエディション・トリガー 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.

Slide 24

Slide 24 text

フォワード・クロスエディション・トリガーは、(親)エディションのエディショニング・ビューから、(子)エディションのエディショニング・ビューへデータを 反映し、同期を行う フォワード・クロスエディション・トリガー 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.

Slide 25

Slide 25 text

リバース・クロスエディション・トリガーは、(子)エディションのエディショニング・ビューから、(親)エディションのエディショニング・ビューへデータを 反映し、同期を行う リバース・クロスエディション・トリガー 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.

Slide 26

Slide 26 text

私たちのミッションは、人々が新たな方法で データを理解し、本質を見極め、無限の可能性 を解き放てるよう支援していくことです。 Our mission is to help people see data in new ways, discover insights, unlock endless possibilities. 26 Copyright © 2021, Oracle and/or its affiliates |