15.2 移行方法
この項では、LONGまたはBasicFile LOBデータをSecureFile記憶域に移行するために使用できる様々な方法について説明します。
内容は次のとおりです。
- SecureFiles移行ユーティリティを使用したLOBの移行
これは、BasicFile LOBデータをSecureFile記憶域に移行するための推奨される方法です。このユーティリティは、オンライン再定義によって提供されるすべての機能をカプセル化し、一連のAPIコールの手動実行に伴う時間と労力を節約します。 - オンライン再定義を使用したLOBの移行
複数のAPIコールを実行して、LONGまたはBasicFile LOBデータをSecureFile記憶域に移行するには、オンライン再定義を使用します。 - データ・ポンプを使用したLOBの移行
Oracle Data Pumpでは、ソース・データベース内の表を再作成するか、SecureFiles LOBとしてLOB列を再作成できます。
親トピック: SecureFile LOBへの列の移行
15.2.1 SecureFiles移行ユーティリティを使用したLOBの移行
これは、BasicFile LOBデータをSecureFile記憶域に移行するために推奨される方法です。このユーティリティは、オンライン再定義によって提供されるすべての機能をカプセル化し、一連のAPIコールの手動実行に伴う時間と労力を節約します。
長所
- 表またはパーティションをオフラインにする必要がありません。
- データベース、スキーマ、表またはLOBセグメント・レベルで移行を実行します。
- データの移行後、SecureFiles移行ユーティリティを使用してSecureFile LOBを圧縮することもできます。
短所
- 必要な表またはパーティション全体、およびすべてのLOBセグメントに等しい追加の記憶域が必要
- グローバル索引の再作成が必要。
親トピック: 移行方法
15.2.2 オンライン再定義を使用したLOBの移行
オンライン再定義を使用して、複数のAPIコールを実行して、LONGまたはBasicFile LOBデータをSecureFile記憶域に移行します。
オンライン再定義の利点
- 表またはパーティションをオフラインにする必要がない。
- パラレルで実行可能。
オンライン再定義のパラレル実行を設定するには、次を実行します。
ALTER SESSION FORCE PARALLEL DML;
オンライン再定義のデメリット
- 必要な表またはパーティション全体、およびすべてのLOBセグメントに等しい追加の記憶域が必要
- グローバル索引の再作成が必要。
例15-1 BasicFiles LOB記憶域からSecureFile LOB記憶域への表の移行のためのオンライン再定義
REM Grant privileges required for online redefinition.
GRANT EXECUTE ON DBMS_REDEFINITION TO pm;
GRANT ALTER ANY TABLE TO pm;
GRANT DROP ANY TABLE TO pm;
GRANT LOCK ANY TABLE TO pm;
GRANT CREATE ANY TABLE TO pm;
GRANT SELECT ANY TABLE TO pm;
REM Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO pm;
GRANT CREATE ANY INDEX TO pm;
CONNECT pm/pm
-- This forces the online redefinition to execute in parallel
ALTER SESSION FORCE parallel dml;
DROP TABLE cust;
CREATE TABLE cust(c_id NUMBER PRIMARY KEY,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
);
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
-- Creating Interim Table
-- There is no requirement to specify constraints because they are
-- copied over from the original table.
CREATE TABLE cust_int(c_id NUMBER NOT NULL,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
) LOB(c_lob) STORE AS SECUREFILE (NOCACHE FILESYSTEM_LIKE_LOGGING);
DECLARE
col_mapping VARCHAR2(1000);
BEGIN
-- map all the columns in the interim table to the original table
col_mapping :=
'c_id c_id , '||
'c_zip c_zip , '||
'c_name c_name, '||
'c_lob c_lob';
DBMS_REDEFINITION.START_REDEF_TABLE('pm', 'cust', 'cust_int', col_mapping);
END;
/
DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('pm', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('pm', 'cust', 'cust_int');
-- Drop the interim table
DROP TABLE cust_int;
DESC cust;
-- The following insert statement fails. This illustrates
-- that the primary key constraint on the c_id column is
-- preserved after migration.
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
SELECT * FROM cust;
例15-2 LONGデータ型からSecureFile LOBへの表の移行のためのオンライン再定義
LONG
からLOBへの移行ステップは次のとおりです。
- 空の仮表を作成します。再定義処理が完了すると、この表には移行済のデータが保持されます。この仮表で次の操作を行います。
- 移行元の表にある
LONG
列ごとにCLOB
列またはNCLOB
列を定義します。 - 移行元の表にある
LONG RAW
列ごとにBLOB
列を定義します。
- 移行元の表にある
- 再定義プロセスを開始します。そのためには、次のように、
DBMS_REDEFINITION.START_REDEF_TABLE
をコールし、TO_LOB
演算子を使用して列マッピングを渡します。DBMS_REDEFINITION.START_REDEF_TABLE( 'schema_name', 'original_table', 'interim_table', 'TO_LOB(long_col_name) lob_col_name', 'options_flag', 'orderby_cols');
long_col_name
は元の表で変換するLONG
列またはLONG
RAW
列の名前で、lob_col_name
は仮表のLOB列の名前です。このLOB列に変換後のデータが保持されます。 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
プロシージャをコールします。詳細は、関連マニュアルを参照してください。DBMS_REDEFINITION.FINISH_REDEF_TABLE
プロシージャをコールします。詳細は、関連マニュアルを参照してください。
次の例は、LONG
からLOBへの移行のオンライン再定義を示しています。
REM Grant privileges required for online redefinition.
GRANT execute ON DBMS_REDEFINITION TO pm;
GRANT ALTER ANY TABLE TO pm;
GRANT DROP ANY TABLE TO pm;
GRANT LOCK ANY TABLE TO pm;
GRANT CREATE ANY TABLE TO pm;
GRANT SELECT ANY TABLE TO pm;
REM Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO pm;
GRANT CREATE ANY INDEX TO pm;
CONNECT pm/pm
-- This forces the online redefinition to execute in parallel
ALTER SESSION FORCE parallel dml;
DROP TABLE cust;
CREATE TABLE cust(c_id NUMBER PRIMARY KEY,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_long LONG
);
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
-- Creating Interim Table
-- There is no requirement to specify constraints because they are
-- copied over from the original table.
CREATE TABLE cust_int(c_id NUMBER NOT NULL,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_long CLOB
);
DECLARE
col_mapping VARCHAR2(1000);
BEGIN
-- map all the columns in the interim table to the original table
col_mapping :=
'c_id c_id , '||
'c_zip c_zip , '||
'c_name c_name, '||
'to_lob(c_long) c_long';
DBMS_REDEFINITION.START_REDEF_TABLE('pm', 'cust', 'cust_int', col_mapping);
END;
/
DECLARE
error_count PLS_INTEGER := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('pm', 'cust', 'cust_int',
1, true, true, true, false,
error_count);
DBMS_OUTPUT.PUT_LINE('errors := ' || to_char(error_count));
END;
/
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('pm', 'cust', 'cust_int');
-- Drop the interim table
DROP TABLE cust_int;
DESC cust;
-- The following insert statement fails. This illustrates
-- that the primary key constraint on the c_id column is
-- preserved after migration.
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
SELECT * FROM cust;
親トピック: 移行方法
15.2.3 データ・ポンプを使用したLOBの移行
Oracle Data Pumpでは、ソース・データベース内の表を再作成するか、LOB列をSecureFiles LOBとして再作成できます。
Oracle Data Pumpによって表が再作成されるときは、デフォルトでは、それらの表は、ソース・データベース内にあるそれらと同じ状態で再作成されます。このため、LOB列がソース・データベースでBasicFiles LOBであった場合、Oracle Data Pumpではインポート先のデータベースのBasicFile LOBとして再作成が試みられます。ただし、コマンドラインでTRANSFORM
パラメータを使用するか、DBMS_DATAPUMP
およびDBMS_METADATA
パッケージでLOB_STORAGE
パラメータを使用することで、再作成された表でSecureFile LOBとしてLOBを作成するよう強制できます。
impdp system/manager directory=dpump_dir schemas=lobuser dumpfile=lobuser.dmp
transform=lob_storage:securefile
ノート:
トランスポータブル・インポートでは名前の変換は無効です。関連項目:
SecureFile LOBに変換するためのTRANSFORMパラメータを使用したTRANSFORMキーワードHIDDEN
を使用すると、デフォルトのインラインLOBサイズをユーザー指定のサイズと区別できます。
CREATE TABLE <tab> (…) LOB (L1) STORE AS … [ENABLE STORAGE IN ROW [4000|8000]
HIDDEN];
データ・ポンプを使用したLOBの移行に関する制限事項
ASSM以外の表領域ではSecureFile LOBを使用できません。ソース・データベースにASSMをサポートしていない表領域のLOB列が含まれている場合、Oracleデータ・ダンプを使用し、LOB列にsecurefile句を使用して表を再作成すると、エラー・メッセージが表示されます。
LOB列を含むASSM以外の表をインポートするには、TRANSFORM=LOB_STORAGE:SECUREFILE
を使用せずに、これらの表に対して別のインポートを実行します。
例:
impdp system/manager directory=dpump_dir schemas=lobuser dumpfile=lobuser.dmp
親トピック: 移行方法