15.2 移行方法

この項では、LONGまたはBasicFile LOBデータをSecureFile記憶域に移行するために使用できる様々な方法について説明します。

15.2.1 オンライン再定義を使用したLOBの移行

LONGまたはBasicFile LOBデータをSecureFile記憶域に移行するには、オンライン再定義をお薦めします。LONGからLOBへの移行のオンライン再定義は表レベルで実行する必要がありますが、BasicFileから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.2 データ・ポンプを使用した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