[AWS] RDS for Oracle へ Data Pump インポートする前にやっておくべき 3 つのこと
こんにちは、菊池です。
タイトルの通りです。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; /
最後に
以上です。
データベースのデータ移行は、計画と事前の準備が非常に重要です。しっかりと検証して移行に臨みましょう。