[AWS] RDS for Oracle へ Data Pump インポートする前にやっておくべき 3 つのこと

RDS for Oracleへのデータ移行の手段の1つとして、Oracle Data Pumpがあります。移行元のOracle DBから、一括でデータをエクスポートし、RDSへのインポートがシンプルな手順で可能です。しかし、事前に実施しておくべき手順を踏まなければ、インポートでエラーが発生し、意図した結果が得られないことがあります。移行先のRDSであらかじめ実施しておく3つの作業を紹介します。
2018.04.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

タイトルの通りです。RDS for Oracleへのデータ移行の手段の1つとして、Oracle Data Pumpがあります。

Amazon RDS での Oracle へのデータのインポート | Amazon Relational Database Service ユーザーガイド

移行元のOracle DBから、一括でデータをエクスポートし、RDSへのインポートがシンプルな手順で可能です。しかし、事前に実施しておくべき手順を踏まなければ、インポートでエラーが発生し、意図した結果が得られないことがあります。移行先のRDSであらかじめ実施しておく3つの作業を紹介します。

インポート前の事前作業

Data PumpでRDSインスタンスにインポートする前にやっておくべきことは以下の3つです。

  • インポート先の表領域の作成
  • ユーザ(スキーマ)の作成
  • ユーザへの権限の付与

インポート先の表領域の作成

インポート先の表領域を作成しておきます。デフォルト1GB、自動拡張有効(100MB)、上限なしの場合は以下のSQLになります。

CREATE TABLESPACE TS_1 DATAFILE SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

ユーザ(スキーマ)の作成

インポートする対象のユーザ(スキーマ)を作成します。フルインポートまたはスキーマ単位インポートであれば、対象のユーザもインポート時に作成されます。しかし、後述の権限付与がRDSの制限により実行できない(エラーになる)場合がありますので、あらかじめユーザ作成、権限付与まで実施しておくことがよいでしょう。

CREATE USER "USER_1" IDENTIFIED BY PASSWORD
DEFAULT TABLESPACE "TS_1"
TEMPORARY TABLESPACE "TEMP";

デフォルト以外のプロファイルを使用する場合には、プロファイルを作成した上でユーザを作成しておきましょう。

CREATE PROFILE PF_1 LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
IDLE_TIME UNLIMITED
CONNECT_TIME UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
COMPOSITE_LIMIT UNLIMITED;
CREATE USER "USER_1" IDENTIFIED BY PASSWORD
DEFAULT TABLESPACE "TS_1"
TEMPORARY TABLESPACE "TEMP"
PROFILE "PF_1";

ユーザへの権限の付与

作成したユーザへ権限を付与します。RDSへのData Pumpインポートでは、フルインポートまたはスキーマ単位インポートであれば権限付与(GRAN文)も実行されますが、エラーとなります。そのため、インポートに当たって必要な権限が事前に与える必要があります。

特に、表領域のクォータ割り当ては必須ですので、以下のように権限を割り当てましょう。

ALTER USER "USER_1" QUOTA UNLIMITED ON 'TS_1';
GRANT UNLIMITED TABLESPACE TO "USER_1";

また、そのほかの権限も必要に応じて付与しておくとよいでしょう。例えば以下のような権限があります。

GRANT CREATE SESSION TO "USER_1";
GRANT "RESOURCE" TO "USER_1";
ALTER USER "USER_1" DEFAULT ROLE ALL;

移行元の情報の確認

事前に実施しておく作業は上記の通りですが、必要なユーザや表領域、権限を設定するためには既存の環境(移行元)の情報が必要です。

以下に、既存環境の情報の取得例を紹介します。

ユーザのプロファイル、デフォルト表領域、テンポラリ表領域の確認です。

SELECT USERNAME, PROFILE, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS;

プロファイルの内容は以下で確認できます。

SELECT * FROM DBA_PROFILES ORDER BY PROFILE;

表領域と自動化拡張、最大サイズの設定は以下で取得できます。

SELECT	DF.TABLESPACE_NAME,
	DF.AUTOEXTENSIBLE,
	DF.INCREMENT_BY * TS.BLOCK_SIZE / 1024 / 1024  AS "EXTENT_SIZE(MB)" ,
	DF.MAXBYTES / 1024 / 1024 / 1024 AS "MAX_SIZE(GB)”
FROM DBA_DATA_FILES DF
LEFT JOIN DBA_TABLESPACES TS
ON DF.TABLESPACE_NAME = TS.TABLESPACE_NAME
ORDER BY DF.TABLESPACE_NAME;

また、ダンプデータを利用してSQL FILEを取得することで、インポート時に実行されるSQLを取得することが可能です。SQL FILEから、ユーザやオブジェクトの作成、変更のSQLを確認することも有効です。RDSの場合にはDBMS_DATAPUMPパッケージを使って以下のように実行することでSQL FILEを作成可能です。

DECLARE
hdnl NUMBER;
status VARCHAR2(20);
BEGIN
hdnl := dbms_datapump.open (operation => 'SQL_FILE', job_mode => 'SCHEMA', version => 'COMPATIBLE');
DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'SQLFILE.sql', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_sql_file);
DBMS_DATAPUMP.ADD_FILE(handle => hdnl, filename => 'DUMPFILE.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_LIST',' ''USER_1'',''USER_2'' ');
DBMS_DATAPUMP.START_JOB(handle => hdnl);
DBMS_DATAPUMP.WAIT_FOR_JOB(hdnl,status);
end;
/

最後に

以上です。

データベースのデータ移行は、計画と事前の準備が非常に重要です。しっかりと検証して移行に臨みましょう。

あわせて読みたい記事