10 Oracle Shardingのソリューション
次のソリューションは、Oracle Shardingを使用してビジネスの問題を解決する方法を示しています。
- フェデレーテッド・シャード・データベースへの既存の非シャード・データベースの結合
異なる場所に同じアプリケーションを実行する複数のデータベース・インストール環境があり、たとえば、それらのすべてのデータを対象にしてデータ分析問合せを実行する場合、独立したデータベースをシャード・データベースに結合してOracle Shardingのマルチシャード問合せを利用できます。 - 中間層とシャード間のアフィニティの作成
中間層ルーティングを使用すると、高機能のルーターがシャーディング・キーに関連付けられた中間層にルーティングできるようになります。
フェデレーテッド・シャード・データベースへの既存の非シャード・データベースの結合
異なる場所に同じアプリケーションを実行する複数のデータベース・インストール環境があり、たとえば、それらのすべてのデータを対象にしてデータ分析問合せを実行する場合、独立したデータベースをシャード・データベースに結合してOracle Shardingのマルチシャード問合せを利用できます。
- 概要
- フェデレーテッド・シャーディング構成の作成およびデプロイ
既存のデータベースを使用してフェデレーテッド・シャーディング環境をデプロイするには、ユーザー定義のシャーディングの場合と同様に、GDSCTL
コマンドを使用してデータベースのレイアウトを定義します。 - フェデレーテッド・シャーディングのリファレンス
親トピック: Oracle Shardingのソリューション
概要
- フェデレーテッド・シャーディングについて
フェデレーテッド・シャーディング構成について、必要な理由およびその仕組みについて説明します。 - フェデレーテッド・シャーディングのスキーマの要件
データベース・スキーマまたはアプリケーションを変更せずに、同じアプリケーションを実行している既存のデータベースをフェデレーテッド・シャーディング構成に変換できます。 - フェデレーテッド・シャーディング構成のシャード表および重複表
各フェデレーテッド・データベースに異なるットのデータがある表は、従来のシャード・データベースのシャード表と同等です。すべてのフェデレーテッド・データベースで同じ内容の表は、従来のシャード・データベースの重複表と同等です。 - フェデレーテッド・シャーディングの制限事項
フェデレーテッド・シャーディング構成の作成にはいくつかの制限事項があります。 - フェデレーテッド・シャーディングのセキュリティ
フェデレーテッド・シャーディングについて
フェデレーテッド・シャーディング構成の概要、必要な理由およびその仕組みについて説明します。
フェデレーテッド・シャーディングは、シャードが類似のスキーマを持つ独立したデータベースで構成されるOracle Sharding構成です。
独立したデータベースからシャード・データベースを作成することで、データ分析のために大量のデータを単一の場所にインポートする必要性が減少します。
この方法には、次のような利点があります。
- 既存の地理的に分散されたデータベースを使用してシャーディング環境を作成します。新しいシステムをプロビジョニングする必要はありません
- マルチシャード問合せを実行し、単一の問合せで多数の場所のデータにアクセスします
フェデレーテッド・シャーディング構成では、Oracle Shardingは独立した各データベースをシャードとして扱うため、それらのシャードに対してマルチシャード問合せを発行できます。
シャード間でマイナー・バージョンの不一致があるフェデレーテッド・シャーディング構成を作成できます。たとえば、あるリージョンをOracle Database 20.2にして、別のリージョンをOracle Database 20.3にできます。すべてのデータベース・シャードおよびシャード・カタログは、Oracle Database 20c以降である必要があります。
親トピック: 概要
フェデレーテッド・シャーディングのスキーマの要件
データベース・スキーマまたはアプリケーションを変更せずに、同じアプリケーションを実行している既存のデータベースをフェデレーテッド・シャーディング構成に変換できます。
ただし、データベースはスキーマが同じであるか、違いがわずかである必要があります。たとえば、いずれかのデータベースの表に追加の列を含めることができます。
アプリケーションのアップグレードでは、スキーマの変更をトリガーできます(新しい表、新しい列、新しいチェック制約の追加、または列のデータ型の変更(あるいはその両方の操作)を行う場合など)。フェデレーテッド・シャーディング構成全体の一部である場合、Oracle Shardingは、全体的なスキーマ構造が同じままであるかぎり、アプリケーションのアップグレードによって生じるスキーマの差異に対処できます。
親トピック: 概要
フェデレーテッド・シャーディング構成のシャード表および重複表
各フェデレーテッド・データベースに異なるセットのデータがある表は、従来のシャード・データベースのシャード表と同等です。すべてのフェデレーテッド・データベースで同じ内容の表は、従来のシャード・データベースの重複表と同等です。
フェデレーテッド・シャーディング構成を作成する場合、すべての表がシャーディングされていることがシステムで想定されるため、マルチシャード問合せコーディネータを使用して、重複表とみなす必要がある表を明示的にマークする必要があります。
親トピック: 概要
フェデレーテッド・シャーディングの制限事項
フェデレーテッド・シャーディング構成の作成にはいくつかの制限事項があります。
- フェデレーテッド・シャーディング構成にはチャンクの概念がないため、
GDSCTL MOVE CHUNK
コマンドはサポートされません。 - シャーディング・キー・ベースのアプリケーションのルーティングはサポートされません。
- 既存のデータベースは、フェデレーテッド・シャーディング構成に追加する前に、Oracle Database 20c以降にアップグレードする必要があります。
親トピック: 概要
フェデレーテッド・シャーディングのセキュリティ
データベース・ユーザーはすべてのフェデレーテッド・データベースに存在する必要はありませんが、すべてのデータベースにスキーマ所有者が存在する必要があります。これらのスキーマ所有者の権限およびパスワードは、異なる場合があります。セキュリティのため、インポートされるのは共通の権限のみです。
親トピック: 概要
フェデレーテッド・シャーディング構成の作成およびデプロイ
既存のデータベースを使用してフェデレーテッド・シャーディング環境をデプロイするには、ユーザー定義のシャーディングの場合と同様に、GDSCTL
コマンドを使用してデータベースのレイアウトを定義します。
フェデレーテッド・シャーディング構成を作成およびデプロイする場合の手順の概要を次に示します。
-
FOR_FEDERATED_DATABASE
オプションを指定してGDSCTL CREATE SHARDCATALOG
コマンドを実行し、フェデレーテッド・シャーディング構成を作成します。 -
シャード・ディレクタを構成に追加します。
-
シャード領域を構成に追加します。シャード領域は、既存のデータベースおよびそのレプリカとして定義します。
-
既存のデータベースをシャード領域に追加することによってシャードを追加し、
DEPLOY
を実行します。 -
GDSCTL SYNC SCHEMA
を実行して、フェデレーテッド・シャーディング構成内のスキーマを比較し、共通の共有スキーマを取得します。SYNC SCHEMA
を使用して、DDLの検査および適用を行います。 -
シャード・カタログに対して
SQL ALTER TABLE
を使用し、フェデレーテッド・シャードで同じデータを含む表を重複表に変換します。 -
マルチシャード問合せのために、フェデレーテッド・シャーディング構成のシャードを準備します。
次のトピックでは、フェデレーテッド・シャーディング固有のタスクについて詳しく説明します。
- フェデレーテッド・シャーディング構成の作成
フェデレーテッド・シャーディング構成を作成するには、SHARDING
パラメータでシャーディング方法を選択するかわりにFOR_FEDERATED_DATABASE
オプションを指定して、GDSCTL
コマンドCREATE SHARDCATALOG
を使用します。 - DDLの取得、検査および適用
既存のデータベースに共通するスキーマ・オブジェクトをシャード・カタログに作成するには、各フェーズでGDSCTL SYNC SCHEMA
コマンドを実行します。 - 重複表への表の変換
フェデレーテッド・シャーディング構成の表を重複表としてマークするには、ALTER TABLE table_name externally duplicated
を使用します。 - マルチシャード問合せのためのシャードの準備
特定のシャードに対する問合せを実行するには、すべてのシャード・ユーザーを作成して、ORA_SHARDSPACE_NAME
疑似列を使用します。
フェデレーテッド・シャーディング構成の作成
フェデレーテッド・シャーディング構成を作成するには、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_PASSWORD
、REPFACTOR
、Oracle Data Guard保護モードのPROTECTMODE
などです)。
ノート:
フェデレーテッド・シャーディング構成では、Oracle Data Guardのレプリケーションのみがサポートされています。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 DDL
は、ここで説明しているとおりに各フェーズで実行する必要があります。
-
取得フェーズ
-retrieve_only
オプションを指定してSYNC SCHEMA
を実行し、シャード・カタログに対して実行する前にDDLを検査して検証します。sync schema -schema schemalist –retrieve_only
-retrieve_only
を指定せずにSYNC SCHEMA
を実行した場合、DDLの取得と適用が同時に行われます。 -
検査フェーズ
DDL文とその実行ステータスは、
-show
オプションを使用して検査できます。-ddl ddlnum
オプションは指定したDDLを表示し、-count n
オプションは表示するエントリの最大数を指定します。sync schema –show -ddl ddlnum -count n
または、
-failed_only
オプションを使用して、エラーが発生した文のみを検査できます。sync schema –show -failed_only
-
適用フェーズ
最後のフェーズで、ユーザーはシャード・カタログに対してDDLを実行して、スキーマとそのオブジェクトを作成します。
sync schema –apply
適用フェーズでエラーが発生した場合、それを回避する方法は2つあります。
-
エラーの原因を修正できる場合は、修正してから
SYNC SCHEMA -apply
を再実行すると、失敗したDDLが再試行されます。 -
DDLを修正できない場合、またはそのDDLが不要な場合は、
SYNC SCHEMA –apply -skip_first
を実行すると、DDLが失敗した場所から適用フェーズが再開されます。
セキュリティ上の理由により、Oracle ShardingではDDLを編集する方法を提供していません。
-
-
増分の変更のインポート
スキーマに後から変更が発生した場合は、前のフェーズを再実行して増分の変更をインポートできます。たとえば、新しいオブジェクトを追加したり、表に新しい列を追加すると、
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の操作
- フェデレーテッド・シャーディングのトラブルシューティング
一般的なフェデレーテッド・シャーディングの問題を解決するには、次のトラブルシューティングのヒントを参照してください。
SYNC SCHEMAの操作
- DDLの同期
DDLの同期は、フェデレーテッド・シャーディング構成でシャードのデプロイメント直後にSYNC SCHEMA
によって実行される操作です。 - ユーザーのインポート
ユーザーまたはスキーマがすべてのシャードに存在し、インポート可能なスキーマ・オブジェクトを所有している場合は、SYNC SCHEMA
によるインポートの候補となります。 - ユーザーのロールおよび権限の付与
インポートされたユーザーの場合は、SYNC SCHEMA
によってユーザーの権限が比較されます。 - オブジェクト定義のインポート
SYNC SCHEMA
によって比較されてシャード・カタログにインポートされたオブジェクトは、マルチシャード問合せで参照されるオブジェクト、またはマルチシャード問合せ処理によって使用されるオブジェクトです。 - スキーマ・オブジェクトの比較
あるシャードのオブジェクトと別のシャードのオブジェクトは、異なる定義を持つことができます。SYNC SCHEMA
は、異なる定義を比較して共通の定義を作成し、インポートされたオブジェクトに対してマルチシャード問合せを実行できるようにします。
親トピック: フェデレーテッド・シャーディングのリファレンス
DDLの同期
DDLの同期は、フェデレーテッド・シャーディング構成でシャードのデプロイメント直後にSYNC SCHEMA
によって実行される操作です。
この操作の目的は、すべてのシャードからオブジェクト定義をインポートし、シャード間で定義を比較し、すべてのシャードに存在するオブジェクト(共通オブジェクト)のDDLを生成することです。DDLを実行してオブジェクトが作成されると、ユーザーはマルチシャード問合せでこれらのオブジェクトを参照できます。
親トピック: SYNC SCHEMAの操作
ユーザーのインポート
ユーザーまたはスキーマがすべてのシャードに存在し、インポート可能なスキーマ・オブジェクトを所有している場合は、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
によってユーザーの権限が比較されます。
SYNC SCHEMA
は、すべてのシャードで付与される権限のみを付与します(共通の付与)。ユーザーAがシャード1でDBAロールを持っているがシャード2では持っていない場合、シャード・カタログでDBAロールを付与されません。
親トピック: SYNC SCHEMAの操作
オブジェクト定義のインポート
SYNC SCHEMA
によって比較されてシャード・カタログにインポートされたオブジェクトは、マルチシャード問合せで参照されるオブジェクト、またはマルチシャード問合せ処理によって使用されるオブジェクトです。
これらのオブジェクトは次のとおりです。
- 表
- ビューとマテリアライズド・ビュー(表としてエクスポート)
- CHECK制約
- オブジェクト・タイプ
- シノニム
SYNC SCHEMA
の実行では、記憶域に関連するオブジェクトまたはマルチシャード問合せ処理に影響しないオブジェクト(表領域、索引、索引タイプ、ディレクトリ、ゾーン・マップなど)はインポートされません。
親トピック: SYNC SCHEMAの操作
スキーマ・オブジェクトの比較
あるシャードと別のシャードのオブジェクトは、異なる定義である場合があります。SYNC SCHEMA
は、異なる定義を比較して共通の定義を作成し、インポートされたオブジェクトに対してマルチシャード問合せを実行できるようにします。
SYNC SCHEMA
は、オブジェクトの数およびオブジェクト定義という2つのレベルでオブジェクトの差異を検出します。
最初に、SYNC SCHEMA
ではオブジェクトの数が考慮されます。アプリケーションのアップグレード中に、一部のオブジェクトがスキーマに追加されることがあります。シャード・カタログにインポートされるのは、すべてのシャードにあるオブジェクトのみです。
2番目に、あるシャードと別のシャードのオブジェクト定義は属性が異なる場合があります。SYNC SCHEMA
によってインポートされるオブジェクトでは、次の相違がある場合があります。
親トピック: 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
属性が異なる場合があります。
親トピック: スキーマ・オブジェクトの比較
フェデレーテッド・シャーディングのトラブルシューティング
一般的なフェデレーテッド・シャーディングの問題を解決するには、次のトラブルシューティングのヒントを参照してください。
ORA-03851: 操作は、フェデレーテッド・データベースでサポートされていません
ORA-03701: パラメータの組合せが無効です: フェデレーテッド・データベースと...
従来のシャードされたデータベースに適用される操作およびコマンド・オプションの一部は、フェデレーテッド・データベースには適用できません。理由は次のとおりです。
-
フェデレーテッド・データベースにはチャンクの概念がありません。
SPLIT CHUNK
、MOVE CHUNK
などのチャンク関連の操作は無効です。 -
既存のシャードは独自の高可用性構成がすでに設定されている可能性があるため、Data Guard Broker構成はフェデレーテッド・データベースでシステムによって設定または管理されません。
SET DATAGUARD_PROPERTY
、MODIFY SHARDSPACE
などの操作はサポートされません。 -
Oracle Golden Gate構成はサポートされません。
-
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
親トピック: フェデレーテッド・シャーディングのリファレンス
中間層とシャード間のアフィニティの作成
中間層ルーティングを使用すると、高機能のルーターがシャーディング・キーに関連付けられた中間層にルーティングできるようになります。
中間層ルーティングAPIを使用すると、シャード・データベース・トポロジをルーター層に公開して、特定のシャーディング・キーに基づくリクエストが適切なアプリケーション中間層にルーティングされ、そこから特定のシャード・サブセットに対して接続が確立されるようにできます。
一般的なOracle Sharding環境では、中間層接続プールはデータベース・リクエストを特定のシャードにルーティングします。このため、各中間層接続プールが各シャードへの接続を確立する状況をまねくことがあります。この場合、データベースへの接続が多くなりすぎる可能性があります。この問題は、中間層とシャード間にアフィニティを作成することで解決できます。このシナリオでは、各データ・センターまたはクラウドに中間層(Webサーバー、アプリケーション・サーバー)を確保し、クライアント・データ(クライアント・シャーディング・キーに対応する)を含むシャードが存在する中間層にクライアント・リクエストを直接ルーティングすることが理想的です。この種の設定によく使用される用語はスイム・レーンです。各スイムレーンは、Webサーバーからアプリケーション・サーバー、データベースへと至る専用のスタックです。
Oracle Universal Connection Pool (UCP)は、関連する中間層にクライアント・リクエストをルーティングするために使用できる中間層ルーティングAPIを提供することで、この問題を解決します。UCP中間層APIは、OracleShardRoutingCache
クラスによって公開されます。このクラスのインスタンスはUCP内部シャード・ルーティング・キャッシュを表し、ユーザー、パスワード、URLなどの接続プロパティを指定して作成できます。ルーティング・キャッシュは、シャーディング・カタログに接続して、シャード・マッピング・トポロジへのキーを取得し、キャッシュに格納します。
ルーティング・キャッシュはUCP中間層API getShardInfoForKey(shardKey,superShardKey)
によって使用されます。これは、シャーディング・キーを入力として受け入れ、入力シャーディング・キーにマップされたShardInfo
インスタンスのセットを返します。ShardInfo
インスタンスは、シャードの一意のシャード名と優先度をカプセル化します。中間層APIを使用するアプリケーションは、戻された一意のシャード名の値を、特定のシャードへの接続がある中間層にマップできます。ルーティング・キャッシュは、各ONSイベントをサブスクライブすることによってチャンクの分割または他のシャードへの移動時に自動的に更新されます。
次のコード例は、Oracle UCP中間層ルーティングAPIの使用方法を示しています。
例10-1 UCP APIを使用した中間層ルーティング
import java.sql.SQLException;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
import oracle.jdbc.OracleShardingKey;
import oracle.jdbc.OracleType;
import oracle.ucp.UniversalConnectionPoolException;
import oracle.ucp.routing.ShardInfo;
import oracle.ucp.routing.oracle.OracleShardRoutingCache;
/**
* The code example illustrates the usage of UCP's mid-tier routing feature.
* The API accepts sharding key as input and returns the set of ShardInfo
* instances mapped to the sharding key. The ShardInfo instance encapsulates
* unique shard name and priority. The unique shard name then can be mapped
* to a mid-tier server which connects to a specific shard.
*
*/
public class MidtierShardingExample {
private static String user = "testuser1";
private static String password = "testuser1";
// catalog DB URL
private static String url = "jdbc:oracle:thin:@//hostName:1521/catalogServiceName";
private static String region = "regionName";
public static void main(String args[]) throws Exception {
testMidTierRouting();
}
static void testMidTierRouting() throws UniversalConnectionPoolException,
SQLException {
Properties dbConnectProperties = new Properties();
dbConnectProperties.setProperty(OracleShardRoutingCache.USER, user);
dbConnectProperties.setProperty(OracleShardRoutingCache.PASSWORD, password);
// Mid-tier routing API accepts catalog DB URL
dbConnectProperties.setProperty(OracleShardRoutingCache.URL, url);
// Region name is required to get the ONS config string
dbConnectProperties.setProperty(OracleShardRoutingCache.REGION, region);
OracleShardRoutingCache routingCache = new OracleShardRoutingCache(
dbConnectProperties);
final int COUNT = 10;
Random random = new Random();
for (int i = 0; i < COUNT; i++) {
int key = random.nextInt();
OracleShardingKey shardKey = routingCache.getShardingKeyBuilder()
.subkey(key, OracleType.NUMBER).build();
OracleShardingKey superShardKey = null;
Set<ShardInfo> shardInfoSet = routingCache.getShardInfoForKey(shardKey,
superShardKey);
for (ShardInfo shardInfo : shardInfoSet) {
System.out.println("Sharding Key=" + key + " Shard Name="
+ shardInfo.getName() + " Priority=" + shardInfo.getPriority());
}
}
}
}
親トピック: Oracle Shardingのソリューション