Oracle Data Pumpを使用したシャード・データベースへの移行
次のトピックで説明する例およびガイドラインを使用して、Oracle Data Pumpエクスポート・ユーティリティでソース・データベースからDDL定義およびデータを抽出し、データベース・エクスポート・ファイルに対してデータ・ポンプ・インポート・ユーティリティを使用してターゲット・シャード・データベースに移入できます。
シャード・データベースのスキーマをすでに作成している場合は、データ移行のトピックにすぐに移動できます。
シャード・データベースへのスキーマの移行
非シャード・データベースからシャード・データベースへの移行には、いくつかのスキーマ変更が必要です。少なくとも、キーワードSHARDEDまたはDUPLICATEDをCREATE TABLE文に追加する必要があります。場合によっては、表のパーティション化も変更するか、シェーディング・キーが追加された列を変更する必要があります。
                  
シャード・データベース・スキーマを適切に設計するには、非シャード・データベースのスキーマおよびワークロードを分析し、次の決定を行う必要があります。
- シャーディングする表と複製する表
- 表ファミリ内のシャード表間の親子関係
- シャード表で使用されるシャーディング方法
- シャーディング・キーとして何を使用するか
これらの決定が簡単でない場合は、シャーディング・アドバイザを使用して決定できます。シャーディング・アドバイザは、Oracle Sharding環境への移行を検討している非シャードOracle Databaseに対して実行するツールです。
非シャードからシャード・データベースへのスキーマおよびデータの移行を示すために、次の図に示すサンプル・データ・モデルを使用します。
データ・モデルはCustomers、Orders、StockItemsおよびLineItemsの4つの表で構成され、データ・モデルでは次の主キー制約が施行されます。
- 
                        
                        Customer.(CustNo)
- 
                        
                        Orders.(PONo)
- 
                        
                        StockItems.(StockNo)
- 
                        
                        LineItems.(LineNo, PONo)
このデータ・モデルでは、次の参照整合性制約が定義されます。
- 
                        
                        Customers.CustNo -> Orders.CustNo
- 
                        
                        Orders.PONo -> LineItems.PONo
- 
                        
                        StockItems.StockNo -> LineItems.StockNo
次のDDL文は、非シャード・スキーマ定義の例を作成します。
CREATE TABLE Customers (
 CustNo     NUMBER(3) NOT NULL,
 CusName    VARCHAR2(30) NOT NULL,
 Street     VARCHAR2(20) NOT NULL,
 City       VARCHAR2(20) NOT NULL,
 State      CHAR(2) NOT NULL,
 Zip        VARCHAR2(10) NOT NULL,
 Phone      VARCHAR2(12),
 PRIMARY KEY (CustNo)
);
CREATE TABLE Orders (
 PoNo       NUMBER(5),
 CustNo     NUMBER(3) REFERENCES Customers,
 OrderDate  DATE,
 ShipDate   DATE,
 ToStreet   VARCHAR2(20),
 ToCity     VARCHAR2(20),
 ToState    CHAR(2),
 ToZip      VARCHAR2(10),
 PRIMARY KEY (PoNo)
);
CREATE TABLE LineItems (
 LineNo      NUMBER(2),
 PoNo        NUMBER(5) REFERENCES Orders,
 StockNo     NUMBER(4) REFERENCES StockItems,
 Quantity    NUMBER(2),
 Discount    NUMBER(4,2),
 PRIMARY KEY (LineNo, PoNo)
);
CREATE TABLE StockItems (
 StockNo     NUMBER(4) PRIMARY KEY,
 Description VARCHAR2(20),
 Price       NUMBER(6,2)
);
シャード・データベースへのデータの移行
非シャード・データベースからシャード・データベースに移行するには、ソース・データベースの非シャード表からターゲット・データベースのシャード表および重複表にデータを移動する必要があります。
非シャード表から重複表へのデータの移動は簡単ですが、非シャード表からシャード表へのデータの移動には特に注意が必要です。
重複表へのデータのロード
Data Pump、SQL Loader、プレーンSQLなどの既存のデータベース・ツールを使用して、重複表にデータをロードできます。データはシャード・カタログ・データベースにロードする必要があります。その後、全シャードに自動的にレプリケートされます。
重複表の内容はマテリアライズド・ビューを使用してデータベース・シャードに完全にレプリケートされるため、重複表のロードにかかる時間は同じデータを通常の表にロードするよりも長くなる場合があります。
シャード表へのデータのロード
シャード表をロードする場合、各データベース・シャードにはデータ・セットの個別のサブセットが含まれるため、ロード中に各表のデータをシャード間で分割(パーティション化)する必要があります。
データベース・シャードのすべてにサブセットのデータをロードするには、Oracle Data Pumpユーティリティを使用できます。ソース・データベースのデータは、Data Pumpダンプ・ファイルにエクスポートできます。その後、同じダンプ・ファイルを使用して、各シャードで同時にData Pumpインポートを実行できます。
ダンプ・ファイルは、すべてのシャードからアクセス可能な共有記憶域に配置するか、各シャードのローカル記憶域にコピーできます。個々のシャードにインポートする場合、Data Pumpインポートは現在のシャードに属していない行を無視します。
すべてのシャードがパラレルにロードされるため、データをシャードに直接ロードする方がはるかに高速です。線形スケーラビリティも提供されます。シャード・データベース内のシャードが多いほど、データ収集率が高くなります。
サンプル・スキーマ・データのロード
例として、次のステップでは、サンプル・スキーマ・データを非シャードからシャード・データベースに移動する方法を示します。構文の例は、前のトピックで紹介したサンプルのCustomers-Orders-LineItems-StockItemsスキーマに基づいています。
ノート:
expdpおよびimpdpコマンドでPARALLELパラメータを使用すると、Data Pumpの実行速度を上げることができます。エクスポートの場合、この例に示すように、このパラメータをDUMPFILEパラメータの%Uワイルド・カードと組み合せて使用して、複数のダンプ・ファイルを作成できるようにする必要があります。
                        
expdp uname/pwd@orignode SCHEMAS=uname directory=expdir dumpfile=samp_%U.dmp logfile=samp.log FLASHBACK_TIME=SYSTIMESTAMP PARALLEL=4 前述のコマンドでは、4つのパラレル・ワーカーが使用され、接尾辞_01、_02、_03および_04を持つ4つのダンプ・ファイルが作成されます。インポート時に同じワイルドカードを使用すると、複数の入力ファイルを参照できるようになります。
シャーディング・キーのないデータの移行
例として、次のステップは、シャーディング・キーを含まないソース表からシャード表にデータを移行する方法を示しています。
前のトピックのデータ・ポンプ・エクスポートおよびインポート・コマンドの例には、LineItems表は含まれていません。これは、非シャード・データベースのこの表にシャーディング・キー列(CustNo)が含まれていないためです。ただし、この列は表のシャード・バージョンで必要です。
非シャード・バージョンとシャード・バージョンの表のスキーマが一致しないため、次のステップに示すように、LineItemsのデータ移行は異なる方法で処理する必要があります。


