12 ディレクトリベースのOracle Globally Distributed Databaseのデプロイおよび管理
ディレクトリベースのシャーディングでは、実行時にキー値とシャードを動的に関連付けることができるため、キー値からシャードへのマッピングを細かく制御できます。
ディレクトリベースのシャーディング・ロードマップ
シャード・データベースの構成、スキーマ・オブジェクトの作成、ライフサイクル管理操作など、ディレクトリベースのシャード・データベースを設定します。
1.ディレクトリベースのシャード・データベースのデプロイ
ディレクトリベースの構成は、ユーザー定義のシャード・データベースの場合と同じステップに従いますが、いくつかの違いがあります。
シャード・データベース・トポロジのデータベースを計画、インストール、作成するために必要な情報のほとんどは、Oracle Globally Distributed Databaseのデプロイを参照してください。
ディレクトリベースのシャーディングのトポロジを構成するには、次のタスクを実行します。
-
ユーザー定義のシャーディングのシャード・カタログを作成します。「ディレクトリベースのシャーディング用のシャード・カタログの作成」を参照してください。
-
シャード・ディレクタを追加して起動します。「シャード・ディレクタの追加と起動」を参照してください。
-
シャード領域を作成し、それらのシャード領域にシャードを作成します。「シャード領域の追加(必要な場合)」、「シャードCDBの追加」、および「シャードPDBの追加」を参照してください。
-
シャード領域内に表領域を作成します。例については、「ユーザー定義のシャーディング」を参照してください。
各表領域は個別に作成し、明示的にシャード領域に関連付ける必要があることに注意してください。
-
トポロジの確認、シャードとホスト・メタデータの追加、構成のデプロイおよびグローバル・データベース・サービスの起動を行います。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と、パーティション・プルーニングのサポートによりシャードで実行される問合せに対する他のシャーディング方法と同じサポートが提供されます。
シャード領域への新しい表領域およびチャンク(パーティション)の追加
既存のシャード領域または新しく追加されたシャード領域にキーの新しいグループ化を追加する場合は、ディレクトリによってシャードされた表に新しい表領域およびパーティションを追加する必要がある場合があります。
関連するステップは次のとおりです。
-
目的のシャード領域に新規表領域を作成します。
-
シャード表に対して
ALTER TABLE ADD PARTITION partition_name TABLESPACE tablespace_name
を実行します。次に例を示します。ALTER TABLE customers ADD PARTITION p4 TABLESPACE tb4;
これにより、指定したシャード領域に空のパーティションとチャンクが作成されます。その後、新しいキー値を挿入すると、この新しいパーティションをターゲットとして指定できます。
割当てルールをlast partition
に指定すると、新しいすべてのキー挿入が新しいパーティションに自動的に割り当てられます。
ディレクトリ・ベースのシャーディングでのチャンク管理
ユーザー定義のシャーディングと同様に、ディレクトリベースのシャーディングで作成される表領域もチャンクに割り当てられます。
チャンクの合計数は、シャード表で指定されたパーティション数によって定義されます。特定のシャード領域のチャンクの数は、割り当てられたパーティションの数です。シャード表に対するALTER TABLE ADD
、DROP
およびSPLIT PARTITION
コマンドにより、チャンクの数が増加または減少します。
GDSCTLコマンドSPLIT CHUNK
は、システム管理のシャーディングでは、ハッシュ範囲の中央でチャンクを分割するために使用されますが、ディレクトリベースのシャーディングではサポートされません。ALTER TABLE SPLIT PARTITION
文を使用してチャンクを分割する必要があります。
また、ユーザー定義のシャーディングと同様に、シャードがシャード・データベースに追加されると、チャンク移行は自動的には開始されません。別のシャードに移動する必要があるチャンクごとにGDSCTL MOVE CHUNK
コマンドを実行する必要があります。
パーティションの分割(チャンク)
-
DBMS_SHARDING_DIRECTORY
PL/SQL APIflagKeyForSplit
を呼び出し、分割するキーをマークします。PROCEDURE flagKeyForSplit (schema_name IN varchar2, -- root table schema name root_table IN varchar2, -- root table name key … ) -- shard key column values
キー列の値は、正しいタイプの
CREATE TABLE
文に指定されている順序と同じである必要があります。このプロシージャが成功できるのは、指定されたキーがディレクトリに存在する場合のみです。 -
パーティション分割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: フラグ付き |