RDS for Oracleにダンプファイルをインポートしてみる【AWS】

RDSアイキャッチ画面

この記事ではRDS上にあるダンプファイルをRDSに実際にインポートする方法を紹介します。
RDSに転送する方法、ダンプファイルを作成する方法は下記を参考にしてください。

・RDS上にあるダンプファイルをインポートしたい。

RDS上に格納されたダンプファイルを確認

下記コマンドにRDS上にダンプファイルが格納されているのを確認します。

SELECT * FROM TABLE (RDSADMIN.RDS_FILE_UTIL.LISTDIR(P_DIRECTORY => 'DATA_PUMP_DIR'));

RDS上のdumpファイルをインポートする。

ディレクトリを作成します。なんでも良いですが下記で用意します。

/home/ec2-user/work/sql

下記のコードをsqlファイルで保存します。

vi schema_full.sql

記述する内容は下記を参考。<YOUR_DUMPFILE_NAME>はダンプファイル名を指定してください。

DECLARE
   h1 NUMBER;  -- ジョブハンドル
BEGIN
   -- インポートジョブの作成(FULL = N、SCHEMA レベルのインポート)
   h1 := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => NULL);

   -- ダンプファイルの指定
   DBMS_DATAPUMP.ADD_FILE(handle => h1, filename => '<YOUR_DUMPFILE_NAME>', directory => 'DATA_PUMP_DIR');

   -- ログファイルの指定(必要に応じて)
   DBMS_DATAPUMP.ADD_FILE(handle => h1, filename => 'import_log.log', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);

   -- インポートのパラメータを設定(例えば、存在するオブジェクトを上書きする場合)
   DBMS_DATAPUMP.METADATA_FILTER(handle => h1, name => 'EXCLUDE_PATH_EXPR', value => 'IN (''TABLE'')');
   DBMS_DATAPUMP.SET_PARAMETER(handle => h1, name => 'TABLE_EXISTS_ACTION', value => 'REPLACE');

   -- インポートジョブの実行
   DBMS_DATAPUMP.START_JOB(h1);

END;
/

今回でいうと下記の内容です。
(今回は省略しましたが、インポートする前に表領域とユーザー作成、表領域割り当てしておくことが必要です。)

DECLARE
   h1 NUMBER;  -- ジョブハンドル
BEGIN
   -- インポートジョブの作成(FULL = N、SCHEMA レベルのインポート)
   h1 := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => NULL);

   -- ダンプファイルの指定
   DBMS_DATAPUMP.ADD_FILE(handle => h1, filename => 'test_full.dmp', directory => 'DATA_PUMP_DIR');

   -- ログファイルの指定(必要に応じて)
   DBMS_DATAPUMP.ADD_FILE(handle => h1, filename => 'import_log.log', directory => 'DATA_PUMP_DIR', filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);


   -- インポートジョブの実行
   DBMS_DATAPUMP.START_JOB(h1);

END;
/

importログの確認コマンド

下記importログ確認コマンドよりダンプファイルのインポート状況をモニタリングできます。
今回はデータが少ないので、すぐ終わりました。

SELECT TEXT FROM TABLE(RDSADMIN.RDS_FILE_UTIL.READ_TEXT_FILE('DATA_PUMP_DIR' ,'import_log.log'));

一件エラーができているようですが「conmlete with」と表示されれば問題ありません。

テーブル確認

下記コマンドよりテーブルを確認。

select
   table_name,
   to_number(
     extractvalue(
       xmltype(
    dbms_xmlgen.getxml('select count(*) c from '||table_name))
       ,'/ROWSET/ROW/C')) count
 from user_tables
 WHERE TABLE_NAME NOT LIKE 'BIN$%'
   and (iot_type != 'IOT_OVERFLOW' or iot_type is null)
order by table_name;

無事にインポートできました。

今回EC2上に作成したDBが無事インポートできるのを確認できました!

本来であればデータ件数、index、シーケンスも確認した方が良いですが、今回は実験なので
テーブル確認のみとします。

以上です、誰かの参考になれば幸いです。