分散データベースでの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_partitions
、consistent_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
パラメータを有効にする必要があります。