Oracle Data Pumpを使用した移行
次のトピックで説明する例およびガイドラインを使用して、Oracle Data Pumpエクスポート・ユーティリティでソース・データベースからDDL定義およびデータを抽出し、データベース・エクスポート・ファイルに対してデータ・ポンプ・インポート・ユーティリティを使用してターゲット分散データベースに移入できます。
分散データベースのスキーマをすでに作成している場合は、データ移行のトピックにすぐに移動できます。
スキーマ移行
非分散データベースから分散データベースへの移行には、いくつかのスキーマ変更が必要です。少なくとも、キーワードSHARDED
またはDUPLICATED
をCREATE TABLE
文に追加する必要があります。場合によっては、表のパーティション化も変更するか、シェーディング・キーが追加された列を変更する必要があります。
分散データベース・スキーマを適切に設計するには、非分散データベースのスキーマおよびワークロードを分析し、次の決定を行う必要があります。
- シャーディングする表と複製する表
- 表ファミリ内のシャード表間の親子関係
- シャード表で使用されるシャーディング方法
- シャーディング・キーとして何を使用するか
これらの決定が簡単でない場合は、シャーディング・アドバイザを使用して決定できます。シャーディング・アドバイザは、Oracle Globally Distributed Database環境への移行を検討している非シャード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インポートは現在のシャードに属していない行を無視します。
すべてのシャードがパラレルにロードされるため、データをシャードに直接ロードする方がはるかに高速です。線形スケーラビリティも提供されます。分散データベース内のシャードが多いほど、データ収集率が高くなります。
Oracle Data PumpのシャーディングMetadataのサポート
Oracle Data Pumpでは、シャードDDLをサポートする分散データベースへの移行がサポートされています。ソース・データベース・シャード・オブジェクトに基づいて、分散データベース・オブジェクトをターゲット・データベースに移行できます。
Oracle Data Pumpでは、API dbms_metadata.get_ddl()
のシャーディングDDLがサポートされています。変換パラメータINCLUDE_SHARDING_CLAUSES
を使用すると、このサポートが容易になります。このパラメータがtrue
に設定され、基礎となるオブジェクトにそれが含まれている場合、get_ddl()
APIはcreate table
、sequence
、tablespace
およびtablespace set
のシャーディングDDLを返します。インポート時にシャーディング属性が設定されないように、INCLUDE_SHARDING_CLAUSES
のデフォルト値はfalse
に設定されます。
詳細、例および参照は、Oracle DatabaseユーティリティのトピックTRANSFORMおよび変換への条件の配置と、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスのトピックSET_TRANSFORM_PARAMおよびSET_REMAP_PARAMプロシージャを参照してください。
サンプル・スキーマ・データのロード
例として、次のステップでは、サンプル・スキーマ・データを非分散データベースから分散データベースに移動する方法を示します。構文の例は、前のトピックで紹介したサンプルの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のデータ移行は異なる方法で処理する必要があります。