この記事は公開されてから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;
/
最後に
以上です。
データベースのデータ移行は、計画と事前の準備が非常に重要です。しっかりと検証して移行に臨みましょう。