12 ディレクトリベースのOracle Globally Distributed Databaseのデプロイおよび管理

ディレクトリベースのシャーディングでは、実行時にキー値とシャードを動的に関連付けることができるため、キー値からシャードへのマッピングを細かく制御できます。

ディレクトリベースのシャーディング・ロードマップ

シャード・データベースの構成、スキーマ・オブジェクトの作成、ライフサイクル管理操作など、ディレクトリベースのシャード・データベースを設定します。

1.ディレクトリベースのシャード・データベースのデプロイ

ディレクトリベースの構成は、ユーザー定義のシャード・データベースの場合と同じステップに従いますが、いくつかの違いがあります。

シャード・データベース・トポロジのデータベースを計画、インストール、作成するために必要な情報のほとんどは、Oracle Globally Distributed Databaseのデプロイを参照してください。

ディレクトリベースのシャーディングのトポロジを構成するには、次のタスクを実行します。

  1. ユーザー定義のシャーディングのシャード・カタログを作成します。「ディレクトリベースのシャーディング用のシャード・カタログの作成」を参照してください。

  2. シャード・ディレクタを追加して起動します。「シャード・ディレクタの追加と起動」を参照してください。

  3. シャード領域を作成し、それらのシャード領域にシャードを作成します。「シャード領域の追加(必要な場合)」、「シャードCDBの追加」、および「シャードPDBの追加」を参照してください。

  4. シャード領域内に表領域を作成します。例については、「ユーザー定義のシャーディング」を参照してください。

    各表領域は個別に作成し、明示的にシャード領域に関連付ける必要があることに注意してください。

  5. トポロジの確認、シャードとホスト・メタデータの追加、構成のデプロイおよびグローバル・データベース・サービスの起動を行います。Oracle Globally Distributed Databaseのデプロイを参照してください。

2.スキーマ・オブジェクトの作成

3.DMLおよび問合せの実行

「ディレクトリによってシャードされた表でのDMLサポート」を参照してください。

4.ライフサイクル操作の実行

ディレクトリベースのシャード・データベースの存続期間中、次のようなタスクを実行する必要があります。

ディレクトリベースのシャーディング用のシャード・カタログの作成

ディレクトリベースのシャーディングはユーザー定義のシャーディング方法の拡張であるため、シャード・カタログはユーザー定義のシャーディング・オプションを使用して構成されます。

GDSCTL> create shardcatalog -database catalog_connect_string
 -user mysdbadmin/mysdbadmin_password -sharding user
 -protectmode maxperformance 

シャード・カタログの作成に関する詳細(シャード・カタログの「接続文字列」の指定やシャード・カタログへの接続など)は、「シャード・カタログの作成」を参照してください。

ディレクトリによってシャードされた表の作成

CREATE SHARDED TABLE文でPARTITION BY DIRECTORYを使用して、ディレクトリベースのシャード表を作成します。

次に例を示します。

CREATE SHARDED TABLE customers
( id             NUMBER NOT NULL
, name           VARCHAR2(30)
, address        VARCHAR2(30)
, status         VARCHAR2(1)
,
CONSTRAINT cust_pk PRIMARY KEY(id)
)
PARTITION BY DIRECTORY (id)
( PARTITION p1 TABLESPACE tbs1,
  PARTITION p2 TABLESPACE tbs2,
  PARTITION p3 TABLESPACE tbs3…);

ノート:

  • ユーザー定義シャーディングとは異なり、CREATE TABLE文のパーティションにキー値は指定されません。

  • ディレクトリ表は、ルート表の作成時に自動的に作成されます。ディレクトリ表の定義は次のとおりです。

    <shard user schema>.<root_table>$SDIR

  • ルート表とは異なるスキーマで親句を使用して子表を作成する場合は、子表のスキーマ所有者に追加権限が必要です。(これはディレクトリベースのシャーディング専用であり、通常のユーザー定義シャーディングには必要ありません。)

    これは、ディレクトリ表のシャーディング・キー列に対して子表に外部キー制約が存在し、ディレクトリ・マッピングにシャーディング・キー値が存在せずに子表に行を挿入できないようにするためです。その結果、子表のスキーマには、ディレクトリ表のシャーディング・キー列に対する参照権限が必要です。

    後述の「参照の付与」を参照してください。

参照の付与

この例を次の図に示します。

  • ルート表dealershipsはスキーマuser1の下にあり、シャーディング・キーとしてaccount_idがあります。

  • 子表salespeopleはスキーマuser2の下にあり、「parent user1.dealerships」で定義されます。

このsalespeople子表を作成する前に、次のものが必要です。

  • grant all privileges on user1.dealerships to user2;

    これは、ユーザー定義シャーディングに必要なものと同じです。

  • grant references (account_id) on user1.dealerships$sdir to user2;

    これは、ディレクトリベースのシャーディングの新機能です。

dealerships$sdirは内部で生成されたディレクトリ表名であり、root_table_name$sdirの形式であることに注意してください。

2番目の付与がない場合、子表作成DDLはシャード・カタログで成功しますが、シャードで失敗します(外部キーはシャードにのみ追加されるため)。

ディレクトリベースのシャーディングでのキーの管理

ディレクトリ表には、パーティションにキーをマッピングするためのメタデータが含まれています。DBMS_SHARDING_DIRECTORY PL/SQL APIを使用して、キーを追加および削除できます。

ノート:

キーを追加および削除する場合、コミットが含まれるAPIと含まれないAPIがあります。APIのコミット・バージョンが使用されないかぎり、コミットが明示的に発行されるまで、ディレクトリ・コンテンツはシャードに伝播されません。

キーの追加

addKeyToPartitionまたはaddKeyToPartitionCommitを使用して、指定したパーティション名のディレクトリにキーを追加できます。

addKeyToPartitionCommitプロシージャは、最後に自動的にコミットを実行する点を除き、同じパラメータを持つaddKeyToPartitionプロシージャとまったく同じです。

PROCEDURE addKeyToPartition[Commit]
     (schema_name    IN varchar2,    -- root table schema name
      root_table     IN varchar2,    -- root table name
      partition_name IN  varchar2,   -- name of the partition
      key …)                        -- shard key column value

キー列の値は、正しいタイプのCREATE TABLE文に指定されている順序と同じである必要があります。このプロシージャが成功できるのは、指定されたキーがディレクトリにまだ存在しない場合のみです。

キーの削除

removeKeyまたはremoveKeyCommitを使用して、ディレクトリからキーを削除できます。

removeKeyCommitプロシージャは、最後に自動的にコミットを実行する点を除き、同じパラメータを持つremoveKeyプロシージャとまったく同じです。

PROCEDURE removeKey
     (schema_name    IN varchar2,    -- root table schema name
      root_table     IN varchar2,    -- root table name
      key … )                       -- shard key column values

キー列の値は、正しいタイプのCREATE TABLE文に指定されている順序と同じである必要があります。このプロシージャが成功できるのは、指定されたキーがディレクトリに存在し、キーを参照する行を持つ表(ルート表または子表のいずれか)がない場合のみです。

キーからパーティションへの自動割当ての有効化

ルート表への後続の新しいキー挿入に対して、キーとパーティションの自動割当てルールを指定できます。

PROCEDURE setAssignmentRule
     (schema_name    IN varchar2,    -- root table schema name
      root_table     IN varchar2,    -- root table name
      rule_id        IN number);   -- rule ID as defined in public constants

設定すると、キーとパーティション間の割当てルールは、システムの再起動に関係なく、プロシージャへの別のコールが別のルール値で実行されるまで、またはNONEを使用して自動割当てをオフにする必要があることを意味するまで、様々なセッションにわたって有効のままになります。

次の定数は、キーとパーティションの割当てルールに定義されています。

  • NONE constant number :=0; -- ルールベースの割当てのオフ

  • LAST_PARTITION constant number := 1; -- 最後に追加されたパーティションにのみキーを割り当てるルール

  • ROUNT_ROBIN constant number :=2; -- ラウンド・ロビンによってパーティションにキーを割り当てるためのルール

  • RANDOM constant number :=3; -- パーティションにキーをランダムに割り当てるルール

  • CUSTOM constant number :=4; -- 未定

ディレクトリによってシャードされた表でのDMLサポート

ディレクトリベースのシャーディングでは、通常のDMLと、パーティション・プルーニングのサポートによりシャードで実行される問合せに対する他のシャーディング方法と同じサポートが提供されます。

シャード領域への新しい表領域およびチャンク(パーティション)の追加

既存のシャード領域または新しく追加されたシャード領域にキーの新しいグループ化を追加する場合は、ディレクトリによってシャードされた表に新しい表領域およびパーティションを追加する必要がある場合があります。

関連するステップは次のとおりです。

  1. 目的のシャード領域に新規表領域を作成します。

  2. シャード表に対してALTER TABLE ADD PARTITION partition_name TABLESPACE tablespace_nameを実行します。次に例を示します。

    ALTER TABLE customers ADD PARTITION p4 TABLESPACE tb4;

これにより、指定したシャード領域に空のパーティションとチャンクが作成されます。その後、新しいキー値を挿入すると、この新しいパーティションをターゲットとして指定できます。

割当てルールをlast partitionに指定すると、新しいすべてのキー挿入が新しいパーティションに自動的に割り当てられます。

ディレクトリ・ベースのシャーディングでのチャンク管理

ユーザー定義のシャーディングと同様に、ディレクトリベースのシャーディングで作成される表領域もチャンクに割り当てられます。

チャンクの合計数は、シャード表で指定されたパーティション数によって定義されます。特定のシャード領域のチャンクの数は、割り当てられたパーティションの数です。シャード表に対するALTER TABLE ADDDROPおよびSPLIT PARTITIONコマンドにより、チャンクの数が増加または減少します。

GDSCTLコマンドSPLIT CHUNKは、システム管理のシャーディングでは、ハッシュ範囲の中央でチャンクを分割するために使用されますが、ディレクトリベースのシャーディングではサポートされません。ALTER TABLE SPLIT PARTITION文を使用してチャンクを分割する必要があります。

また、ユーザー定義のシャーディングと同様に、シャードがシャード・データベースに追加されると、チャンク移行は自動的には開始されません。別のシャードに移動する必要があるチャンクごとにGDSCTL MOVE CHUNKコマンドを実行する必要があります。

パーティションの分割(チャンク)

  1. DBMS_SHARDING_DIRECTORY PL/SQL API flagKeyForSplitを呼び出し、分割するキーをマークします。

    PROCEDURE flagKeyForSplit
         (schema_name    IN varchar2,    -- root table schema name
          root_table     IN varchar2,    -- root table name
          key … )                       -- shard key column values
    

    キー列の値は、正しいタイプのCREATE TABLE文に指定されている順序と同じである必要があります。このプロシージャが成功できるのは、指定されたキーがディレクトリに存在する場合のみです。

  2. パーティション分割DDLを発行します。

    ALTER TABLE customers SPLIT PARTITION p1 INTO 
    ( PARTITION p1 TABLESPACE tb1,
      PARTITION p3 TABLESPACE tb3 ) 
      UPDATE INDEXES;
    

    ディレクトリベースのシャーディングでは、パーティションは一度に2つのパーティションにのみ分割できます。

    この操作では、ディレクトリに分割対象としてマークされたすべてのキーが処理され、対応するデータが新しいパーティションに分割されます。

シャーディング・キー・ディレクトリ公開ビュー

ビューroot_table_name$shard_dir_viewでは、指定したルート表のパーティション/チャンク/シャード・マッピングに対するキーが提供されます。

表12-1 root_table_name$SHARD_DIR_VIEW

名前 タイプ NULL 説明
KEY列… 可変 いいえ 一意のシャーディング・キー列値
KEY_ID$ RAW(32) いいえ キーに割り当てられた一意のSHA-256 ID
CHUNK_ID$ 番号 いいえ キーが割り当てられるチャンクID
PARTITION_NAME VARCHAR2(128) いいえ キーが割り当てられているルート表パーティションの名前
SHARDSPACE_NAME VARCHAR2(128) いいえ チャンクが属するシャード領域名
SPLIT_FLAG$ 番号 はい

0: フラグなし(デフォルト)

1: フラグ付き