分散データベースでのDDLの処理

Oracle Globally Distributed Databaseにスキーマを作成するには、シャード・カタログ・データベースでDDLコマンドを発行する必要があります。シャード・カタログ・データベースは、DDLを検証し、シャードで処理する前にそれらをローカルで処理します。

シャード・カタログ・データベースには、分散データベースに存在するすべてのオブジェクトのローカル・コピーが含まれており、分散データベースのスキーマのプライマリ・コピーとして機能します。シャード・カタログの検証およびDDLの処理が成功した場合、そのDDLはすべてのシャードに自動的に伝播され、シャード・カタログで発行された順序で適用されます。

DDLの伝播中にシャードが停止しているか、アクセスできない場合、シャード・カタログはそのシャードに適用できなかったDDLを追跡し、そのシャードがアクセス可能になったときにそれらを適用します。シャードがオンラインに戻ると、クライアントがアクセスできるようになる前に、分散データベースで処理されたすべてのDDLが、同じ順序でシャードに適用されます。

新しいシャードが分散データベースに追加された場合、クライアントがアクセスできるようになる前に、分散データベースで処理されたすべてのDDLがそのシャードに同じ順序で適用されます。

分散データベースでDDLを発行するには、次の2つの方法があります。

  • GDSCTL SQLコマンドを使用します。

    次の例に示すように、GDSCTL SQLコマンドを使用してDDLを発行すると、GDSCTLはすべてのシャードがDDLの処理を終了するまで待機し、ステータスを返します。

    GDSCTL> sql “create tablespace set tbsset”
  • GDS$CATALOG.sdbnameサービスを使用し、SQL*Plusを使用してシャード・カタログ・データベースに接続します。

    シャード・カタログ・データベースに対してDDLコマンドを発行すると、ローカルでの処理が完了したときにステータスが返されますが、すべてのシャードへのDDLの伝播はバックグラウンドで非同期に行われます。

    SQL> create tablespace set tbsset;

ノート:

SYSアカウントを使用したシャードDDLの処理はお薦めしません。その目的のための特権アカウントを作成します。

Oracle Globally Distributed DatabaseのDDL構文拡張の詳細は、Oracle Globally Distributed DatabaseのDDL構文拡張を参照してください。

ローカルまたはグローバルでのオブジェクトの作成

GDSCTLを使用して作成されたオブジェクトは、グローバルなOracle Globally Distributed Databaseオブジェクトを作成しますが、SQL*Plusを使用してシャード・カタログに接続することで、ローカルまたはグローバル・オブジェクトを作成できます。

オブジェクトを作成するDDLがGDSCTLのsqlコマンドを使用して発行された場合、オブジェクトがすべてのシャードで作成されます。オブジェクトのプライマリ・コピーが、シャード・カタログ・データベースにも作成されます。すべてのシャードおよびシャード・カタログ・データベースに存在するオブジェクトは、分散データベース・オブジェクトと呼ばれます。

SQL*Plusを使用してシャード・カタログに接続する場合、2つのタイプのオブジェクト(分散データベース・オブジェクトおよびローカル・オブジェクト)を作成できます。ローカル・オブジェクトは、シャード・カタログにのみ存在する従来のオブジェクトです。ローカル・オブジェクトは、管理のために使用したり、シャード・カタログ・データベースから発行されるマルチシャード問合せで(たとえば、レポートを生成および格納するために)使用したりできます。

シャード・オブジェクトは、ローカル・オブジェクトに対する依存性を持つことができません。たとえば、ローカル表に全シャード表示は作成できません。

SQL*Plusセッションで作成されるオブジェクトのタイプ(分散データベースまたはローカル)は、セッションでSHARD DDLモードが有効にされているかどうかによって異なります。全シャード・ユーザー(すべてのシャードおよびシャード・カタログ・データベースに存在するユーザー)の場合、このモードは、シャード・カタログ・データベースではデフォルトで有効になっています。セッションでSHARD DDLが有効になっている間に作成されるすべてのオブジェクトは、分散データベース・オブジェクトです。

セッションでSHARD DDLを有効にするには、全シャード・ユーザーが次を実行する必要があります。

ALTER SESSION ENABLE SHARD DDL

SHARD DDLが無効であるときに作成されたすべてのオブジェクトは、ローカル・オブジェクトです。ローカル・オブジェクトを作成するには、最初に全シャード・ユーザーを実行する必要があります

ALTER SESSION DISABLE SHARD DDL

SHARD DDLセッション・パラメータの詳細は、ALTER SESSIONを参照してください。

DDL処理の監視およびオブジェクト作成の検証

GDSCTLおよびSQLを使用してDDL処理を監視し、DDLがすべてのシャードに伝播されていることを確認できます。

DDL処理の監視

シャードへのDDLの伝播のステータスを確認するには、GDSCTLのshow ddlコマンドおよびconfig shardコマンドを使用できます。

シャード・カタログでSQL*Plusを使用してDDLを実行した場合、SQL*PlusではすべてのシャードのDDLステータスが返されないため、この確認は必須です。

show ddlコマンドの出力は切り捨てられることがあります。出力内容の完全なテキストを表示するには、シャード・カタログでSELECT ddl_text FROM gsmadmin_internal.ddl_requestsを実行します。

シャード・ディレクタ・ホストから次のコマンドを実行します。

GDSCTL> show ddl
id    DDL Text                                  Failed shards
--    --------                                  -------------
5     grant connect, resource to app_schema
6     grant dba to app_schema
7     grant execute on dbms_crypto to app_s... 
8     CREATE TABLESPACE SET  TSP_SET_1 usin...
9     CREATE TABLESPACE products_tsp datafi...
10    CREATE SHARDED TABLE Customers (   Cu...
11    CREATE SHARDED TABLE Orders (   Order...
12    CREATE SEQUENCE Orders_Seq;
13    CREATE SHARDED TABLE LineItems (   Or...
14    CREATE MATERIALIZED VIEW "APP_SCHEMA"...

ここに示すように、構成内の各シャードでconfig shardコマンドを実行し、コマンド出力の「Last Failed DDL」行を書き留めます。

GDSCTL> config shard -shard sh1
Name: sh1
Shard Group: primary_shardgroup
Status: Ok
State: Deployed
Region: region1
Connection string: shard_host_1:1521/sh1_host:dedicated
SCAN address: 
ONS remote port: 0
Disk Threshold, ms: 20
CPU Threshold, %: 75
Version: 18.0.0.0
Last Failed DDL: 
DDL Error: ---
Failed DDL id: 
Availability: ONLINE

Supported services
------------------------
Name                                          Preferred Status    
----                                          --------- ------    
oltp_ro_srvc                                  Yes       Enabled   
oltp_rw_srvc                                  Yes       Enabled  

表領域セット作成の検証

シャード表ファミリのために作成した表領域セットの表領域、および重複表のために作成した表領域が、すべてのシャードに作成されたことを確認します。

C006TSP_SET_1を介してC001TSP_SET_1として次に示す表領域セットの表領域の数は、分散データベース構成がデプロイされたときにGDSCTL create shardcatalogコマンドで指定されたチャンクの数に基づきます。

重複Products表領域をPRODUCTS_TSPとして次に示します。

次に示すように、構成内のすべてのシャードでSELECT TABLESPACE_NAMEを実行します。

$ sqlplus / as sysdba

SQL> select TABLESPACE_NAME, BYTES/1024/1024 MB from sys.dba_data_files
 order by tablespace_name;

TABLESPACE_NAME 		    MB
----------------------- ----------
C001TSP_SET_1           100
C002TSP_SET_1           100
C003TSP_SET_1			      100
C004TSP_SET_1			      100
C005TSP_SET_1			      100
C006TSP_SET_1			      100
PRODUCTS_TSP            100
SYSAUX                  650
SYSTEM                  890
SYS_SHARD_TS			      100
TSP_SET_1			          100

TABLESPACE_NAME 		     MB
------------------------ ----------
UNDOTBS1			           105
USERS					             5

13 rows selected.

チャンクの作成および分散の検証

チャンクおよびチャンク表領域がすべてのシャードに作成されたことを確認します。

ここに示すようにGDSCTL config chunksコマンドを実行し、各シャードのチャンクIDの範囲をノートにとります。

GDSCTL> config chunks
Chunks
------------------------
Database                      From      To        
--------                      ----      --        
sh1                           1         6         
sh2                           1         6         
sh3                           7         12        
sh4                           7         12

次に示すように、構成内の各シャードで次のSQL文を実行します。

SQL> show parameter db_unique_name

NAME             TYPE        VALUE
---------------- ----------- ------------------------------
db_unique_name   string      sh1

SQL> select table_name, partition_name, tablespace_name
 from dba_tab_partitions
 where tablespace_name like 'C%TSP_SET_1'
 order by tablespace_name;

TABLE_NAME       PARTITION_NAME   TABLESPACE_NAME
---------------- ---------------- --------------------
ORDERS           CUSTOMERS_P1     C001TSP_SET_1
CUSTOMERS        CUSTOMERS_P1     C001TSP_SET_1
LINEITEMS        CUSTOMERS_P1     C001TSP_SET_1
CUSTOMERS        CUSTOMERS_P2     C002TSP_SET_1
LINEITEMS        CUSTOMERS_P2     C002TSP_SET_1
ORDERS           CUSTOMERS_P2     C002TSP_SET_1
CUSTOMERS        CUSTOMERS_P3     C003TSP_SET_1
ORDERS           CUSTOMERS_P3     C003TSP_SET_1
LINEITEMS        CUSTOMERS_P3     C003TSP_SET_1
ORDERS           CUSTOMERS_P4     C004TSP_SET_1
CUSTOMERS        CUSTOMERS_P4     C004TSP_SET_1

TABLE_NAME       PARTITION_NAME   TABLESPACE_NAME
---------------- ---------------- --------------------
LINEITEMS        CUSTOMERS_P4     C004TSP_SET_1
CUSTOMERS        CUSTOMERS_P5     C005TSP_SET_1
LINEITEMS        CUSTOMERS_P5     C005TSP_SET_1
ORDERS           CUSTOMERS_P5     C005TSP_SET_1
CUSTOMERS        CUSTOMERS_P6     C006TSP_SET_1
LINEITEMS        CUSTOMERS_P6     C006TSP_SET_1
ORDERS           CUSTOMERS_P6     C006TSP_SET_1
18 rows selected.

シャード・カタログ・データベースに接続し、次に示すようにチャンクが均一に分散されていることを確認します。

$ sqlplus / as sysdba

SQL> SELECT a.name Shard, COUNT(b.chunk_number) Number_of_Chunks
  FROM gsmadmin_internal.database a, gsmadmin_internal.chunk_loc b
  WHERE a.database_num=b.database_num
  GROUP BY a.name
  ORDER BY a.name;

SHARD			       NUMBER_OF_CHUNKS
------------------------------ ----------------
sh1					      6
sh2					      6
sh3					      6
sh4					      6

表の作成の検証

シャード表および重複表が作成されたことを確認するには、シャード・カタログ・データベースおよび各シャードにアプリケーション・スキーマ・ユーザーとしてログインし、次のapp_schemaユーザーの例に示すように、データベース・シャードの表を問い合せます。

$ sqlplus app_schema/app_schema_password
Connected.

SQL> select table_name from user_tables;

TABLE_NAME
-----------------------------------------------------------------------
CUSTOMERS
ORDERS
LINEITEMS
PRODUCTS

4 rows selected.

Oracle Globally Distributed DatabaseのDDL構文拡張

Oracle Globally Distributed Databaseには、分散データベースに対してのみ実行できる構文を持つSQL DDL文が含まれています。

Oracle Globally Distributed Databaseをサポートするために問合せおよびDML文を変更する必要はなく、DDL文の変更も非常に限られます。ほとんどの既存のDDL文は、非分散データベースと同じ構文およびセマンティクスを使用して、分散データベースで同様に機能します。

CREATE TABLESPACE SET

この文は、1つ以上のシャード表および索引の論理ストレージ・ユニットとして使用できる表領域セットを作成します。表領域セットは、シャード領域のシャード間に分散された複数のOracle表領域で構成されます。

CREATE TABLESPACE SET文は、分散データベース専用です。構文はCREATE TABLESPACEと似ています。

CREATE TABLESPACE SET tablespace_set 
	   [IN SHARDSPACE shardspace]
      		[USING TEMPLATE (
    { MINIMUM EXTENT size_clause
    | BLOCKSIZE integer [ K ]
    | logging_clause
    | FORCE LOGGING
    | ENCRYPTION tablespace_encryption_spec
    | DEFAULT [ table_compression ] storage_clause
    | { ONLINE | OFFLINE }
    | extent_management_clause
    | segment_management_clause
    | flashback_mode_clause
    }...
   )];

システム管理のシャーディングでは、分散データベースにデフォルトの1つのシャード領域のみがあります。表領域セット内の表領域の数は自動的に決定され、対応するシャード領域内のチャンクの数と同じです。

表領域セット内のすべての表領域はビッグファイル表領域であり、プロパティが同じです。プロパティはUSING TEMPLATE句で指定され、表領域セット内の単一の表領域のプロパティを記述します。この句は、通常の表領域のpermanent_tablespace_clauseと同じですが、datafile_tempfile_spec句にデータファイル名を指定できないことが異なります。表領域セット内の各表領域のデータファイル名は自動的に生成されます。

表領域セットは永続表領域のみで構成され、システム、UNDOまたは一時表領域セットはありません。また、次の例では、表領域セットのデータファイルの合計サイズは100mx Nです(Nは表領域セット内の表領域の数です)。

CREATE TABLESPACE SET TSP_SET_1 IN SHARDSPACE sgr1 
USING TEMPLATE
( DATAFILE SIZE 100m
  EXTEND MANAGEMENT LOCAL
  SEGMENT SPACE MANAGEMENT AUTO
);

ALTER TABLESPACE SET

この文は、1つ以上のシャード表および索引の論理ストレージ・ユニットとして使用できる表領域セットを変更します。

表領域セットのSHARDSPACEプロパティは変更できません。表領域セットの他のすべての属性は、通常の永続表領域と同様に変更できます。表領域セット内の表領域はビッグファイルであるため、ADD DATAFILE句およびDROP DATAFILE句はサポートされません。

DROP TABLESPACE SETおよびPURGE TABLESPACE SET

これらの文は、1つ以上のシャード表および索引の論理ストレージ・ユニットとして使用できる表領域セットを削除またはパージします。

これらの文の構文およびセマンティクスは、DROP文およびPURGE TABLESPACE文と似ています。

CREATE TABLE

CREATE TABLE文は、シャード表および複製表を作成するために拡張され、表ファミリを指定します。

構文

CREATE [ { GLOBAL TEMPORARY | SHARDED | DUPLICATED} ] 
	     TABLE [ schema. ] table
      { relational_table | object_table | XMLType_table }
      	[ PARENT [ schema. ] table ] ;

CREATE TABLE文の次の部分は、分散データベースをサポートするためのものです

  • SHARDEDキーワードおよびDUPLICATEDキーワードは、表のコンテンツがシャード間でパーティション化されるか、すべてのシャードで複製されることをそれぞれ示します。DUPLICATEDキーワードは、重複表を作成するための唯一の構文の変更です。以降で説明する他のすべての変更はシャード表にのみ適用されます。

  • PARENT句は、シャード表を表ファミリのルート表にリンクします。

  • システムおよび複合シャーディングでは、シャード表を作成するために、TABLESPACEのかわりにTABLESPACE SETが使用されます。TABLESPACEが含まれるすべての句は、TABLESPACE SETが含まれるように拡張されました。

  • 3つの句: table_partitioning_clauses内のconsistent_hash_partitionsconsistent_hash_with_subpartitionsおよびpartition_set_clause

    table_partitioning_clauses ::=
    {range_partitions
    | hash_partitions
    | list_partitions
    | composite_range_partitions
    | composite_hash_partitions
    | composite_list_partitions
    | reference_partitioning
    | system_partitioning
    | consistent_hash_partitions
    | consistent_hash_with_subpartitions
    | partition_set_clause
    }

CREATE SHARDED TABLE customers 
( cust_id     NUMBER NOT NULL
, name        VARCHAR2(50)
, address     VARCHAR2(250) 
, location_id VARCHAR2(20)
, class       VARCHAR2(3)
, signup_date DATE
,
CONSTRAINT cust_pk PRIMARY KEY(cust_id, class)
)
PARTITIONSET BY LIST (class)
PARTITION BY CONSISTENT HASH (cust_id)
PARTITIONS AUTO
(PARTITIONSET gold   VALUES (‘gld’) TABLESPACE SET ts2,
 PARTITIONSET silver VALUES (‘slv’) TABLESPACE SET ts1)
;

consistent_hash_with_subpartitionsの例

CREATE SHARDED TABLE Customers
       ( "custi_id" NUMBER NOT NULL
       , name VARCHAR2(50)
       , class VARCHAR2(3) NOT NULL
       , signup_date DATE
       ,
       CONSTRAINT cust_pk PRIMARY KEY("custi_id",name,signup_date,class)
       )
       PARTITIONSET BY LIST (class)
       PARTITION BY CONSISTENT HASH ("custi_id",name)
       SUBPARTITION BY RANGE (signup_date)
       SUBPARTITION TEMPLATE
          ( SUBPARTITION per1 VALUES LESS THAN (TO_DATE('01/01/2000','DD/MM/YYYY'))
          , SUBPARTITION per2 VALUES LESS THAN (TO_DATE('01/01/2010','DD/MM/YYYY'))
          , SUBPARTITION per3 VALUES LESS THAN (TO_DATE('01/01/2020','DD/MM/YYYY'))
          , SUBPARTITION future VALUES LESS THAN (MAXVALUE))
       PARTITIONS AUTO
       (
         PARTITIONSET "gold" VALUES ('Gld','BRZ') TABLESPACE SET ts1 SUBPARTITIONS STORE IN(TBS1,TBS2,TBS3,TBS4)
       , PARTITIONSET "silver" VALUES ('Slv','OTH') TABLESPACE SET ts2 SUBPARTITIONS STORE IN(TBS5,TBS6,TBS7,TBS8)
       ) ;

制限事項

現在のリリースでのシャード表に関する制限:

  • シャード表のデフォルトの表領域セットはありません。

  • 一時表はシャーディングまたは複製できません。

  • 索引構成シャード表はサポートされません。

  • シャード表には、ネストした表の列またはアイデンティティ列を含めることはできません。

  • シャード表に定義される主キー制約には、シャーディング列を含める必要があります。重複表の列を参照するシャード表の列の外部キー制約はサポートされていません。

  • システム・パーティション化および間隔レンジ・パーティション化は、シャード表ではサポートされません。個別のハッシュ・パーティションの指定は、コンシステント・ハッシュによるパーティション化ではサポートされません。

  • PARTITION BY句またはPARTITIONSET BY句に使用されるシャード表の列には、仮想列を指定できません。

現在のリリースの重複表では、次のことはサポートされません。

  • システム・パーティション表および参照パーティション表

  • 非最終的な抽象型

  • 主キーを除く列の最大数は999個です

  • nologgingオプション

  • 重複表のXMLType列は非ASSM表領域で使用できません

分散データベースをサポートする句の使用方法の詳細は、CREATE TABLEを参照してください。

ALTER TABLE

ALTER TABLE文は、シャード表および重複表を変更するために拡張されています。

分散データベースALTER TABLEを使用する場合は、制限事項があります。

次のオプションは、システム管理またはコンポジットの分散データベースのシャード表ではサポートされません:

  • 名前変更

  • シャードに対するすべてのパーティション関連の操作(TRUNCATE PARTITION、UNUSABLE LOCAL INDEXESおよびREBUILD UNUSABLE LOCAL INDEXESを除く)

次の操作は、重複表ではサポートされていません。

  • データ型: 非最終的な抽象型

  • 列のオプション: ベクトル・エンコード、不可視の列、ネストした表

  • クラスタ化表

  • 外部表

  • ILMポリシー

  • PARENT

  • 表のフラッシュバック操作

  • システムおよび参照パーティション化

  • NOLOGGINGオプションの有効化

  • 重複表のマテリアライズド・ビュー・ログの削除

  • シャード上の重複表のマテリアライズド・ビューの削除

  • シャード上の(重複表の)マテリアライズド・ビューの変更

ALTER SESSION

ALTER SESSION文は、分散データベースをサポートするように拡張されています。

セッションレベルのSHARD DDLパラメータは、シャード・カタログ・データベースに対して発行されたDDLのスコープを設定します。

ALTER SESSION { ENABLE | DISABLE } SHARD DDL;

SHARD DDLを有効にした場合、セッションで発行されたすべてのDDLはシャード・カタログおよびすべてのシャードで実行されます。SHARD DDLを無効にした場合、DDLはシャード・カタログ・データベースに対してのみ実行されます。分散データベース・ユーザー(すべてのシャードおよびカタログに存在するユーザー)の場合、SHARD DDLはデフォルトで有効にされます。分散データベース・ユーザーを作成するには、CREATE USERを実行する前に、SHARD DDLパラメータを有効にする必要があります。