フェデレーテッド・シャード・データベースへの既存の非シャード・データベースの結合

異なる場所に同じアプリケーションを実行する複数のデータベース・インストール環境があり、たとえば、それらのすべてのデータを対象にしてデータ分析問合せを実行する場合、独立したデータベースをシャード・データベースに結合してOracle Globally Distributed Databaseのマルチシャード問合せを利用できます。

概要

フェデレーテッド・シャーディングについて

フェデレーテッド・シャーディング構成の概要、必要な理由およびその仕組みを学習します。

フェデレーテッド・シャーディングは、シャードが類似のスキーマを持つ独立したデータベースで構成されるシャード・データベース構成です。

独立したデータベースからシャード・データベースを作成することで、データ分析のために大量のデータを単一の場所にインポートする必要性が減少します。

この方法には、次のような利点があります。

  • 既存の地理的に分散されたデータベースを使用してシャーディング環境を作成します。新しいシステムをプロビジョニングする必要はありません
  • マルチシャード問合せを実行し、単一の問合せで多くの場所のデータにアクセスします

フェデレーテッド・シャーディング構成では、Oracle Globally Distributed Databaseは独立した各データベースをシャードとして扱うため、それらのシャードに対してマルチシャード問合せを発行できます。

シャード間でマイナー・バージョンの不一致があるフェデレーテッド・シャーディング構成を作成できます。たとえば、あるリージョンをOracle Database 21.1にして、別のリージョンをOracle Database 21.3にできます。すべてのデータベース・シャードおよびシャード・カタログは、Oracle Database 21c以降である必要があります。

フェデレーテッド・シャーディングのスキーマの要件

データベース・スキーマまたはアプリケーションを変更せずに、同じアプリケーションを実行している既存のデータベースをフェデレーテッド・シャーディング構成に変換できます。

ただし、データベースはスキーマが同じであるか、違いがわずかである必要があります。たとえば、いずれかのデータベースの表に追加の列を含めることができます。

アプリケーションのアップグレードでは、スキーマの変更をトリガーできます(新しい表、新しい列、新しいチェック制約の追加、または列のデータ型の変更(あるいはその両方の操作)を行う場合など)。フェデレーテッド・シャーディング構成の一部である場合、Oracle Globally Distributed Databaseは、全体的なスキーマ構造が同じままであるかぎり、アプリケーションのアップグレードによって生じるスキーマの差異に対処できます。

フェデレーテッド・シャーディング構成のシャード表および重複表

各フェデレーテッド・データベースに異なるセットのデータがある表は、従来のシャード・データベースのシャード表と同等です。すべてのフェデレーテッド・データベースで同じ内容の表は、従来のシャード・データベースの重複表と同等です。

フェデレーテッド・シャーディング構成を作成する場合、すべての表がシャーディングされていることがシステムで想定されるため、マルチシャード問合せコーディネータを使用して、重複表とみなす必要がある表を明示的にマークする必要があります。

フェデレーテッド・シャーディングの制限事項

フェデレーテッド・シャーディング構成の作成にはいくつかの制限事項があります。

  • フェデレーテッド・シャーディング構成にはチャンクの概念がないため、GDSCTL MOVE CHUNKコマンドはサポートされません。
  • シャーディング・キー・ベースのアプリケーションのルーティングはサポートされません。
  • 既存のデータベースは、フェデレーテッド・シャーディング構成に追加する前に、Oracle Database 21c以降にアップグレードする必要があります。
  • DDL、クロスシャード挿入、更新および削除は、ENABLE SHARD DDL下のフェデレーテッド・シャーディング・アーキテクチャのシャード・カタログからサポートされていません。

フェデレーテッド・シャーディングのセキュリティ

データベース・ユーザーはすべてのフェデレーテッド・データベースに存在する必要はありませんが、すべてのデータベースにスキーマ所有者が存在する必要があります。これらのスキーマ所有者の権限およびパスワードは、異なる場合があります。セキュリティのため、インポートされるのは共通の権限のみです。

フェデレーテッド・シャーディング構成の作成およびデプロイ

既存のデータベースを使用してフェデレーテッド・シャーディング環境をデプロイするには、ユーザー定義のシャーディングの場合と同様に、GDSCTLコマンドを使用してデータベースのレイアウトを定義します。

フェデレーテッド・シャーディング構成を作成およびデプロイする場合の手順の概要を次に示します。

  1. FOR_FEDERATED_DATABASEオプションを指定してGDSCTL CREATE SHARDCATALOGコマンドを実行し、フェデレーテッド・シャーディング構成を作成します。

  2. シャード・ディレクタを構成に追加します。

  3. シャード領域を構成に追加します。シャード領域は、既存のデータベースおよびそのレプリカとして定義します。

  4. 既存のデータベースをシャード領域に追加することによってシャードを追加し、DEPLOYを実行します。

  5. GDSCTL SYNC SCHEMAを実行して、フェデレーテッド・シャーディング構成内のスキーマを比較し、共通の共有スキーマを取得します。SYNC SCHEMAを使用して、DDLの検査および適用を行います。

  6. シャード・カタログに対してSQL ALTER TABLEを使用し、フェデレーテッド・シャードで同じデータを含む表を重複表に変換します。

  7. マルチシャード問合せのために、フェデレーテッド・シャーディング構成のシャードを準備します。

次のトピックでは、フェデレーテッド・シャーディング固有のタスクについて詳しく説明します。

フェデレーテッド・シャーディング構成の作成

フェデレーテッド・シャーディング構成を作成するには、SHARDINGパラメータでシャーディング方法を選択するかわりにFOR_FEDERATED_DATABASEオプションを指定して、GDSCTLコマンドCREATE SHARDCATALOGを使用します。

フェデレーテッド・シャーディング構成の作成でのGDSCTLコマンドCREATE SHARDCATALOGの使用方法は、ユーザー定義のシャーディングでシャード・カタログを作成する場合と同様ですが、SHARDINGパラメータでシャーディング方法を指定するかわりにFOR_FEDERATED_DATABASEオプションを使用します。つまり、FOR_FEDERATED_DATABASEオプションとSHARDINGオプションは相互に排他的です。

CREATE SHARDCATALOG -DATABASE connect_identifier
  [-USER username[/password]]
  [-REGION region_name_list] 
  [-CONFIGNAME config_name]
  [-AUTOVNCR ON/OFF]
  [-FORCE] 
  [-SDB sdb_name]
  [-SHARDSPACE shardspace_name_list]
  -FOR_FEDERATED_DATABASE

前述のCREATE SHARDCATALOG構文の文は、サポートされるパラメータを示しています。表示されていないパラメータは、FOR_FEDERATED_DATABASEシャーディング方法で使用する場合はサポートされません(たとえば、–AGENT_PASSWORDREPFACTOR、Oracle Data Guard保護モードのPROTECTMODEなどです)。

ノート:

フェデレーテッド・シャーディング構成では、Oracle Data Guardのレプリケーションのみがサポートされています。Oracle Globally Distributed DatabaseではData Guard構成の作成および管理が処理されませんが、ADD SHARDコマンドでData Guardパラメータを使用すると、プライマリおよびスタンバイを追加してGDSCTLでステータスを確認できます。

関連項目:

使用上のノートおよびコマンド・オプションについては、Oracle Global Data Services概要および管理ガイドのGDSCTLのCREATE SHARDCATALOGのトピックを参照してください。

DDLの取得、検査および適用

既存のデータベースに共通するスキーマ・オブジェクトをシャード・カタログに作成するには、各フェーズでGDSCTL SYNC SCHEMAコマンドを実行します。

ここに示すGDSCTL SYNC SCHEMA構文は、操作の3つのフェーズを示しています。

sync[hronize] schema
  [-schema [schemalist | all] [-retrieve_only] [-restart [-force]]
 | -apply [-skip_first]
 | -show [[-ddl ddlnum] [-count n] | [-failed_only]]]

SYNC SCHEMAは、ここで説明しているとおりに各フェーズで実行する必要があります。

  1. 取得フェーズ

    -retrieve_onlyオプションを指定してSYNC SCHEMAを実行し、シャード・カタログに対して実行する前にDDLを検査して検証します。

    sync schema -schema schemalist –retrieve_only

    -retrieve_onlyを指定せずにSYNC SCHEMAを実行した場合、DDLの取得と適用が同時に行われます。

  2. 検査フェーズ

    DDL文とその処理ステータスは、-showオプションを使用して検査できます。-ddl ddlnumオプションは指定したDDLを表示し、-count nオプションは表示するエントリの最大数を指定します。

    sync schema –show -ddl ddlnum -count n

    または、-failed_onlyオプションを使用して、エラーが発生した文のみを検査できます。

    sync schema –show -failed_only
  3. 適用フェーズ

    最後のフェーズで、ユーザーはシャード・カタログに対してDDLを実行して、スキーマとそのオブジェクトを作成します。

    sync schema –apply

    適用フェーズでエラーが発生した場合、それを回避する方法は2つあります。

    • エラーの原因を修正できる場合は、修正してからSYNC SCHEMA -applyを再実行すると、失敗したDDLが再試行されます。

    • DDLを修正できない場合、またはそのDDLが不要な場合は、SYNC SCHEMA –apply -skip_firstを実行すると、DDLが失敗した場所から適用フェーズが再開されます。

    セキュリティ上の理由により、Oracle Globally Distributed DatabaseではDDLを編集できません。

  4. 増分の変更のインポート

    スキーマに後から変更が発生した場合は、前のフェーズを再実行して増分の変更をインポートできます。たとえば、新しいオブジェクトを追加したり、表に新しい列を追加すると、ALTER TABLE ADD文が生成されます。

関連項目:

SYNC SCHEMAの使用上のノートおよびオプションの詳細は、Oracle Global Data Services概要および管理ガイドsync schema (synchronize schema)のトピックを参照してください。

SYNC SCHEMAによって実行されるタスクの詳細は、SYNC SCHEMAの操作を参照してください。

重複表への表の変換

フェデレーテッド・シャーディング構成の表を重複表としてマークするには、ALTER TABLE table_name externally duplicatedを使用します。

SYNC SCHEMAによって作成される表は、マルチシャード問合せレイヤーではexternally shardedの表とみなされます。すべてのシャードで表に同じデータが含まれている場合、ユーザーはその表をexternally duplicatedに変更できます。これにより、ORA_SHARDSPACE_NAMEに対するフィルタ述部がない表の問合せの場合でも、マルチシャード問合せは1つのシャードのみからデータを取得します。

ALTER TABLE table_name [externally duplicated | externally sharded]

マルチシャード問合せのためのシャードの準備

特定のシャードに対する問合せを実行するには、すべてのシャード・ユーザーを作成して、ORA_SHARDSPACE_NAME疑似列を使用します。

すべてのシャード・ユーザー

シャード・カタログからマルチシャード問合せを実行する前に、すべてのシャード・ユーザーを作成して、シャード表および重複表へのアクセス権を付与する必要があります。これらのユーザーとその権限は、シャードDDLを有効にしてシャード・カタログに作成する必要があります。

シャード領域固有の問合せの作成

フェデレーテッド・シャーディングのシャード領域は、プライマリ・シャードと0個以上のスタンバイ・シャードで構成されるセットです。特定のシャード(領域)の問合せ結果をフィルタ処理するために、ORA_SHARDSPACE_NAMEという疑似列がすべてのexternally sharded表に追加されます。表のこの疑似列の値は、シャード領域の名前です。

MULTISHARD_QUERY_DATA_CONSISTENCYの値に応じて、シャード領域のプライマリまたはスタンバイから行をフェッチできます。特定のシャードに対してマルチシャード問合せを実行するには、述語ORA_SHARDSPACE_NAME = shardspace_name_shard_belongs_toを使用して問合せをフィルタ処理できます。

CUSTOMER表がexternally shardedとしてマークされている場合、SELECT CUST_NAME, CUST_ID FROM CUSTOMERなどの問合せは、すべてのシャードで実行されます。

SELECT CUST_NAME, CUST_ID FROM CUSTOMER WHERE ora_shardspace_name = 'EUROPE'などの問合せは、shardspace_nameがEuropeであるシャードで実行されます。MULTISHARD_QUERY_DATA_CONSISTENCYパラメータ値に応じて、シャード領域Europeのプライマリ・シャードまたはスタンバイで問合せが実行されます。

異なるシャード領域のシャード表を結合できます。たとえば、シャード領域NAに注文があるシャード領域Europeの顧客を検索するには、次のような問合せを記述します。

SELECT order_id, customer_name FROM customers c , orders o WHERE c.cust_id = o.cust_id and
c.ora_shardspace_name = ‘Europe’ and o.ora_shardspace_name = ‘NA’ 

ORA_SHARDSPACE_NAME述部を使用するかどうかにかかわらず、externally duplicatedの表を問い合せる場合は、いずれかのシャード領域のみを対象とする必要があります。MULTISHARD_QUERY_DATA_CONSISTENCYパラメータ値によって、シャード領域のプライマリ・シャードまたはそのレプリカのどちらに問い合せるかが決定されます。

フェデレーテッド・シャーディングのリファレンス

SYNC SCHEMAの操作

DDLの同期

DDLの同期は、フェデレーテッド・シャーディング構成でシャードのデプロイメント直後にSYNC SCHEMAによって実行される操作です。

この操作の目的は、すべてのシャードからオブジェクト定義をインポートし、シャード間で定義を比較し、すべてのシャードに存在するオブジェクト(共通オブジェクト)のDDLを生成することです。DDLを実行してオブジェクトが作成されると、ユーザーはマルチシャード問合せでこれらのオブジェクトを参照できます。

ユーザーのインポート

ユーザーまたはスキーマがすべてのシャードに存在し、インポート可能なスキーマ・オブジェクトを所有している場合は、SYNC SCHEMAによるインポートの候補となります。

-SCHEMAパラメータにユーザーのリストを渡すことによって、インポートするユーザーのリストを絞り込むことができます。たとえば、

gdsctl> sync schema -schema scott
gdsctl> sync schema -schema scott,myschema

大/小文字が区別されるスキーマでは、引用符で囲んだ識別子を使用します。

gdsctl> sync schema -schema "O'Brien",scott

Oracle以外のすべてのスキーマを含めるには、SCHEMAパラメータに値ALLを使用します。

gdsctl> sync schema -schema all

ユーザーをインポートする前に、SYNC SCHEMAによって、検出されたすべてのユーザーがすべてのシャードに存在すること、およびシャード・カタログに同じ名前のユーザーがすでに存在していないことが検証されます。その後、ユーザーはローカル・ユーザーとしてシャード・カタログに作成され、ロックされます。これらはローカル・ユーザーであるため、シャード間で共有されるのは同じ名前のみですが、各データベースの同じ名前を持つ他のユーザーと基本的に同じです。これらのユーザーはすべてのシャード・ユーザーではないため、ログインして問合せを発行できません。マルチシャード問合せを発行するには、すべてのシャード・ユーザーを作成する必要があります。

ノート:

PDBのローカルのユーザーのみがインポートされます。共通のCDBユーザーはインポートされません。
ユーザーのロールおよび権限の付与

インポートされたユーザーの場合は、SYNC SCHEMAによってユーザーの権限が比較されます。

SYNC SCHEMAは、すべてのシャードで付与される権限のみを付与します(共通の付与)。ユーザーAがシャード1でDBAロールを持っているがシャード2では持っていない場合、シャード・カタログでDBAロールを付与されません。

オブジェクト定義のインポート

SYNC SCHEMAによって比較されてシャード・カタログにインポートされたオブジェクトは、マルチシャード問合せで参照されるオブジェクト、またはマルチシャード問合せ処理によって使用されるオブジェクトです。

これらのオブジェクトは次のとおりです。

  • ビューとマテリアライズド・ビュー(表としてエクスポート)
  • CHECK制約
  • オブジェクト・タイプ
  • シノニム

SYNC SCHEMAの実行では、記憶域に関連するオブジェクトまたはマルチシャード問合せ処理に影響しないオブジェクト(表領域、索引、索引タイプ、ディレクトリ、ゾーン・マップなど)はインポートされません。

スキーマ・オブジェクトの比較

あるシャードと別のシャードのオブジェクトは、異なる定義である場合があります。SYNC SCHEMAは、異なる定義を比較して共通の定義を作成し、インポートされたオブジェクトに対してマルチシャード問合せを実行できるようにします。

SYNC SCHEMAは、オブジェクトの数およびオブジェクト定義という2つのレベルでオブジェクトの差異を検出します。

最初に、SYNC SCHEMAではオブジェクトの数が考慮されます。アプリケーションのアップグレード中に、一部のオブジェクトがスキーマに追加されることがあります。シャード・カタログにインポートされるのは、すべてのシャードにあるオブジェクトのみです。

2番目に、あるシャードと別のシャードのオブジェクト定義は属性が異なる場合があります。SYNC SCHEMAによってインポートされるオブジェクトでは、次の相違がある場合があります。

表の相違

フェデレーテッド・シャーディング構成でオブジェクトを比較する場合、マルチシャード問合せに影響する表の相違と、影響しない相違があります。

列の相違

マルチシャード問合せに影響するのは、列の相違のみです。SYNC SCHEMAは、この相違にのみ対処します。

  • 列の数が異なる場合があります。

  • 特定の列のデータ型が異なる場合があります。

  • 特定の列のデフォルト値が異なる場合があります

  • 仮想列の式が異なる場合があります

表に異なる数の列がある場合、SYNC SCHEMAはすべての列の和集合を含む表を作成することを選択します。共通部分を取得するだけでなく、すべての列の和集合を取得すると、追加されるシャードの列がシャード・カタログに示されている列より少ない場合、増分デプロイ時にユーザーがマルチシャード問合せをリライトせずに済みます。

列のデータ型が異なる場合、SYNC SCHEMAはそれを最上位(最大)のデータ型として定義します。

列のデータ型が異なり、いずれかの列がユーザー定義のオブジェクト型である場合、その列はシャード・カタログにインポートされません。

列のデフォルト値が異なる場合、SYNC SCHEMAはデフォルト値としてNULLを設定します。

ネストした表の列は、シャード・カタログにインポートされません。

例: Customer表は、次に示されているようにシャード1およびシャード2に定義されています。

シャード1:

Customer( Cust_id number, Name varchar(30),
    Address varchar(50),Zip_code number)

シャード2:

Customer( Cust_id varchar(20), Name varchar(30),
    Address varchar(50),Zip_code number,
    Country_code number)

シャード1ではCust_id列がnumberで、シャード2ではvarchar(20)です。また、シャード2にはCountry_codeが存在しますが、シャード1には存在しません。

SYNC SCHEMAによってシャード・カタログに作成されるCustomer表には、Country_codeを含むすべての列があり、Cust_idの型はvarchar(20)です。

Customer( Cust_id varchar(20), Name varchar(30),
    Address  varchar(50),Zip_code number,
    Country_code number)

SYNC SCHEMAは、シャード・カタログのスキーマ間のこれらの相違を追跡します。カタログ・データベースに対して発行され、これらの異種列にアクセスする問合せは、シャードに送信される前に相違に対処するようにリライトされます。シャードでは、データ型の不一致がある場合、データはカタログに作成された上位のデータ型にキャストされます。シャードに列がない場合は、カタログに設定されたデフォルト値が返されます。

パーティション・スキームの相違

この相違はマルチシャード問合せに影響せず、無視されます。

  • パーティション化列が異なる場合があります。
  • パーティション・タイプが異なる場合があります。
  • パーティションの数が異なる場合があります。

記憶域属性の相違

この相違はマルチシャード問合せに影響せず、無視されます。

  • 表が作成される表領域が異なります。
  • 暗号化が異なる場合があります。
  • INMEMORY属性が異なる場合があります。
ビューの相違

シャードのビューは、シャード・カタログで表として作成および処理されます。表に適用される制限と同じ制限がビューにも適用されます。

制約の相違

シャード・カタログに作成されるのは、CHECK制約のみです。CHECK制約の条件はすべてのシャードで同じである必要があります。

オブジェクト型の相違

オブジェクト型とタイプ本体は、すべてのシャードで同じ定義を持つ場合にのみ作成されます。

フェデレーテッド・シャーディングのトラブルシューティング

一般的なフェデレーテッド・シャーディングの問題を解決するには、次のトラブルシューティングのヒントを参照してください。

ORA-03851: 操作は、フェデレーテッド・データベースでサポートされていません

ORA-03701: パラメータの組合せが無効です: フェデレーテッド・データベースと...

従来のシャードされたデータベースに適用される操作およびコマンド・オプションの一部は、フェデレーテッド・データベースには適用できません。理由は次のとおりです。

  • フェデレーテッド・データベースにはチャンクの概念がありません。SPLIT CHUNKMOVE CHUNKなどのチャンク関連の操作は無効です。

  • 既存のシャードは独自の高可用性構成がすでに設定されている可能性があるため、Data Guard Broker構成はフェデレーテッド・データベースでシステムによって設定または管理されません。SET DATAGUARD_PROPERTYMODIFY SHARDSPACEなどの操作はサポートされません。

  • CREATE SHARDコマンドはサポートされません。

ORA-03885: 一部のプライマリ・シャードがアンデプロイされているか、または使用できません

SYNC SCHEMA操作では、すべてのプライマリ・シャードが使用可能である必要があります。CONFIG SHARDコマンドの出力をチェックし、すべてのプライマリ・シャードのステータスを確認します。問題を修正し、シャードが使用可能になったら、操作を再試行します。

ORA-03871: 一部のDDL文がカタログに適用されていません

前回の発行の一部の文がシャード・カタログに適用されていない場合、SYNC SCHEMA操作でシャードからオブジェクト定義をインポートできません。これらの文を実行するには、-applyオプションを指定してSYNC SCHEMAを実行します。

マルチシャード問合せでのエラーの処理

シャードとカタログでオブジェクト定義が一致しないためにマルチシャード問合せがこのエラーで失敗した場合は、シャード・カタログに最新のスキーマ変更がインポートされていることを確認します。フェデレーテッド・データベースにスキーマの変更がある場合は常に、SYNC SCHEMAを実行してシャードのスキーマに変更をインポートする必要があります。

SYNC SCHEMAの後続の実行では、オブジェクトは削除および再作成されませんが、定義の変更を組み込むためにALTER文が生成されます。これにより、SYNC SCHEMAの操作中にすでに実行中であった問合せがある場合、それらは無効なオブジェクト・エラーで失敗しません。

DDL処理フェーズでのエラーの処理

DDLがシャード・カタログで失敗した場合は、SYNC SCHEMA -showオプションを使用して、各DDLのステータスを検査できます。

gdsctl> sync schema -show

ノート: SYNC SCHEMA -showコマンドは、SHOW DDLコマンドとは異なります。SHOW DDLでは、最初にカタログで実行されてからシャードに伝播される、すべてのシャード・ユーザーによって実行されるDDL文がリストされます。それに対して、SYNC SCHEMA -showのDDL文はシャードからインポートされたオブジェクトから生成されます。

デフォルトでは、SYNC SCHEMA -showは一定の数の最新のDDLをリストします。-countおよび-ddlオプションは、特定の範囲のDDLを検査するために使用できます。たとえば、

gdsctl> sync schema -show -count 20
gdsctl> sync schema -show -count 20 -ddl 5

DDLテキスト全体とエラー・メッセージ(ある場合)を確認するには、-ddlオプションを使用します。

gdsctl> sync schema -show -ddl 5

失敗したDDL文のみをリストするには、-failed_onlyオプションを使用します。

gdsctl> sync schema –failed_only

失敗したDDLのエラー・メッセージに基づいて、エラーの原因を修正し、適用フェーズを実行します。

gdsctl> sync schema -apply

SYNC SCHEMAコマンドには、初めて実行したときと同じように最初から完全な操作を実行するための-restartオプションもあります。このオプションを指定すると、SYNC SCHEMAの以前のすべての実行でインポートされた既存のすべてのスキーマ、および関連するメタデータがDROPされます。これにより、それらのオブジェクトで実行されているすべての問合せが失敗します。

gdsctl> sync schema -restart