NEWSニュース&ブログ

RDSへのデータ移行方法三選!(③Oracle Data Pumpユーティリティを使用したデータ移行)

この記事は最終更新から10年以上経過しています。内容が古くなっている可能性があります。

投稿日:2014/7/28

みなさん、こんにちは。または、こんばんは。STSのジョニー・デップです。最近、青信号の色が、青ではなく、緑に思えて仕方がありません。さて、今回は連載3回目と言う事で、RDSへデータを移行する方法、「Oracle Data_pumpユーティリティ編」となります。

ORACLE Data Pumpユーティリティとは

ここで、Oracle Data Pumpユーティリティの説明を少しだけ。Oracle Data PumpユーティリティはOracle Database 10gより導入された新しいユーティリティで、このユーティリティの機能とパラメータはオリジナルEXP/IMPと類似していますが、まったく別のデータ移行用のユーティリティとなります。このユーティリティを利用することで、ダンプ・ファイル・セット(表データ、データベースオブジェクト、制御情報などを含んだファイル)と呼ばれる、メタデータをDatabase内から抽出する事が出来ますが、Data PumpユーティリティでのみImportが可能なファイルになり、オリジナルのEXP/IMPではインポートはできません。オリジナルEXP/IMPよりも、パフォーマンスや、管理性が向上していると言われています。やったね。

検証で使用する環境と実施する内容

さて、それでは今回の検証で利用する環境を紹介します。実はRDSではData pumpはサポートされていますが、すこし利用するのに工夫が必要です。残念。 今回は、EC2にOracleをインストールし、そのデータをData Pumpユーティリティを使って、RDSへ移行してみたいと思います。  環境と手順はこんな感じ。 blog_03_01 図1:検証で使用する環境 ① 同一VPC内にEC2(Oracle インストール済み)とRDS(for Oracle)を作成 ② EC2上のOracleにディレクトリオブジェクトとexpdp用のユーザを作成 ③ データをexpdpでエクスポート ④ EC2からRDSへDB LINKを作成 ⑤ エクスポートしたデータをRDSへ転送 ⑥ 転送されたファイルをimpdpでインポート

①同一VPC内にEC2(Oracleインストール済み)とRDS(for Oracle)を作成

すみませんが。割愛します。と言う事で、EC2へOracleをインストールしsqlplusで接続しました。

図2:sqlplusでEC2のOracleに接続 インスタンス名はORCLです。今回はサンプルスキーマの「HR」の所有するテーブルを移行の対象とします。HRユーザのテーブルと、データ件数は以下の通りです。

SQL> select table_name from user_tables;
TABLE_NAME
——————————
COUNTRIES
JOB_HISTORY
EMPLOYEES
JOBS
DEPARTMENTS
LOCATIONS
REGIONS

7行が選択されました。

SQL> select count(*) from COUNTRIES;

COUNT(*)
———-
25

SQL> select count(*) from JOB_HISTORY;

COUNT(*)
———-
10

SQL> select count(*) from EMPLOYEES;

COUNT(*)
———-
107

SQL> select count(*) from JOBS;

COUNT(*)
———-
19

SQL> select count(*) from DEPARTMENTS;

COUNT(*)
———-
27

SQL> select count(*) from LOCATIONS;

COUNT(*)
———-
23

SQL> select count(*) from REGIONS;

COUNT(*)
———-
4

SQL>

②EC2上のOracleにディレクトリオブジェクトとexpdp用のユーザを作成

まずはEC2上のOracleへディレクトリオブジェクトを作成します。
SQL> CREATE DIRECTORY EXP_DUMP_DIR AS ‘C:\app\Administrator/admin/orcl/dpdump/’;
ディレクトリが作成されました。

SQL> set lines 200 pages 9999
SQL> col OWNER for a5
SQL> col OWNER for a15
SQL> col DIRECTORY_PATH for a50
SQL> select * from DBA_DIRECTORIES where DIRECTORY_NAME = ‘EXP_DUMP_DIR’;

OWNER DIRECTORY_NAME DIRECTORY_PATH
————— —————————— ————————————————–
SYS EXP_DUMP_DIR C:\app\Administrator/admin/orcl/dpdump/

SQL>

ばっちりです。
次にData Pumpユーティリティを実行するユーザを作成し、権限の付与を行います。

SQL> create user user1 identified by test123;
ユーザが作成されました。

SQL> grant create session, create table to USER1;

権限付与が成功しました。

SQL> grant unlimited tablespace to USER1;

権限付与が成功しました。

SQL> grant read, write on directory exp_dump_dir to USER1;

権限付与が成功しました。

SQL> grant execute on dbms_datapump to USER1;

権限付与が成功しました。

SQL> grant EXP_FULL_DATABASE to USER1;

権限付与が成功しました。

SQL>

完璧です。上記の通り、「HR」スキーマのテーブルをエクスポートするユーザはUSER1です。

③データをexpdpでエクスポート

いよいよ前半戦の山場!Data Pumpユーティリティによるデータのエクスポートです。EC2上で稼働しているDatabaseのHRスキーマからテーブルをエクスポートしちゃいましょう。
C:\Users\Administrator>expdp user1/test123 directory=EXP_DUMP_DIR dumpfile=HR.dmp
tables=HR.COUNTRIES,HR.JOB_HISTOR
Export: Release 11.2.0.1.0 – Production on 火 7月 8 14:35:58 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
“USER1”.”SYS_EXPORT_TABLE_01″を起動しています: user1/******** directory=EXP_DUMP_DIR dumpfile=HR.dmp tables=HR.COUN
BLOCKSメソッドを使用して見積り中です…
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積り合計: 448 KB
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型TABLE_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TRIGGERの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
. . “HR”.”COUNTRIES” 6.375 KB 25行がエクスポートされました
. . “HR”.”DEPARTMENTS” 7.015 KB 27行がエクスポートされました
. . “HR”.”EMPLOYEES” 16.81 KB 107行がエクスポートされました
. . “HR”.”JOBS” 6.992 KB 19行がエクスポートされました
. . “HR”.”JOB_HISTORY” 7.054 KB 10行がエクスポートされました
. . “HR”.”LOCATIONS” 8.273 KB 23行がエクスポートされました
. . “HR”.”REGIONS” 5.484 KB 4行がエクスポートされました
マスター表”USER1″.”SYS_EXPORT_TABLE_01″は正常にロード/アンロードされました
******************************************************************************
USER1.SYS_EXPORT_TABLE_01に設定されたダンプ・ファイルは次のとおりです:
C:\APP\ADMINISTRATOR\ADMIN\ORCL\DPDUMP\HR.DMP
ジョブ”USER1″.”SYS_EXPORT_TABLE_01″が14:36:07で正常に完了しました

はい、完了。山場は終了しました。 ここで、一応作成されたダンプ・ファイルを確認しておきます。

図3:エクスポートダンプファイル確認 全く問題なく作成されております。よかったです。

④EC2からRDSへDB LINKを作成&⑤エクスポートしたデータをRDSへ転送


 冒頭にもお伝えしましたが、RDSでData Pumpユーティリティを利用する場合には少し、工夫が必要です。それは、RDS側のディレクトリオブジェクトへデータを格納する方法がかなり限られていると言う事です。このディレクトリオブジェクトに対してファイルを格納するAPIなどは存在しません。そのため、RDSへDB Linkを作成し、DB Link経由で対象のファイルをDBMS_FILE_TRANSFERと言うパッケージを利用して転送します。これはデータベース間でバイナリ・ファイルを転送する事が出来るプロシージャです。
まずは、DB Linkの作成から。今回EC2上のOracleデータベースから、RDSのマスターユーザを経由するDB Linkを作成します。RDSの情報は以下の通り。

■マスターユーザ名:blog
■パスワード:oracle2014
■DB名:BLOG
■END POINT名:ひみつ
■ポート番号:1521

SQL> create database link to_rds connect to blog identified by oracle2014
2 using ‘(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<END POINT名>)(PORT=1521))(CONNECT_DATA=(SID=BLOG)))’;
データベース・リンクが作成されました。
SQL>

これで、DB Linkの作成は完了です。DB Linkの名前は「to_rds」です。
このまま、先ほどエクスポートしたダンプ・ファイルを転送してしまいましょう。

SQL> BEGIN
2 DBMS_FILE_TRANSFER.PUT_FILE(
3 source_directory_object => ‘EXP_DUMP_DIR’,
4 source_file_name => ‘HR.dmp’,
5 destination_directory_object => ‘DATA_PUMP_DIR’,
6 destination_file_name => ‘HR_copy.dmp’,
7 destination_database => ‘to_rds’
8 );
9 END;
10 /
PL/SQLプロシージャが正常に完了しました。

SQL>
簡単です。これで、転送は完了したはず。RDSへ接続して、ファイルが転送されたか確認してみましょう。
確認にはRDSで準備されているパッケージを使用します。
C:\Users\Administrator>sqlplus blog/oracle2014@<END POINT名>:1521/BLOG
SQL*Plus: Release 11.2.0.1.0 Production on 火 7月 8 14:14:00 2014

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Oracle Database 11g Release 11.2.0.4.0 – 64bit Production
に接続されました。
SQL> SELECT * FROM table(rdsadmin.rds_file_util.listdir(‘DATA_PUMP_DIR’));

FILENAME
——————————————————————————–
TYPE FILESIZE MTIME
——————– ———- ——–
datapump/
directory 4096 14-07-08

HR_copy.dmp
file 503808 14-07-08
SQL>
HR_copy.dmpがRDS上のデフォルトで用意されている、DATA_PUMP_DIRに転送されている事が確認できました。

⑥転送されたファイルをimpdpでインポート

いよいよ、最後に、転送したダンプ・ファイルをRDSへData Pumpユーティリティを使ってインポートします。 インポートに先立ちまして、インポート対象のHRスキーマを作成し、必要な権限を付与します。
SQL> create user HR identified by oracle2014;
ユーザーが作成されました。

SQL> grant unlimited tablespace to HR;

権限付与が成功しました。

SQL>
次にインポートですが、サンプルスキーマである「HR」が持っているテーブルは他のスキーマのオブジェクトと依存関係にあります。今回はサンプルスキーマのテーブルのみインポートしたいので、テーブル以外の不要なものはEXCLUDEオプションで除外します。また、表領域もREMAP_TABLESPACEオプションにてEXAMPLE表領域からUSERS表領域へ作るようにインポートコマンドを書きます。上手にかけたら実行します。
C:\Users\Administrator>impdp blog/oracle2014@<END POINT名>:1521/BLOG DUMPFILE=HR_copy.dmp
DIRECTORY=DATA_PUMP_DIR REMAP_TABLESPACE=EXAMPLE:USERS EXCLUDE
=GRANT,TRIGGER
Import: Release 11.2.0.1.0 – Production on 火 7月 8 15:19:06 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

接続先: Oracle Database 11g Release 11.2.0.4.0 – 64bit Production
マスター表”BLOG”.”SYS_IMPORT_FULL_01″は正常にロード/アンロードされました
“BLOG”.”SYS_IMPORT_FULL_01″を起動しています: blog/********@blog-rds-oracle.<文字列>.ap-northeast-1.rds.amazonaws.com:1521/BLOG DUMPFILE=HR_copy.dmp DIRECTORY=DATA_PUMP_DIR REMAP_TABLESPACE=EXAMPLE
:USERS EXCLUDE=GRANT,TRIGGER
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
. . “HR”.”COUNTRIES” 6.375 KB 25行がインポートされました
. . “HR”.”DEPARTMENTS” 7.015 KB 27行がインポートされました
. . “HR”.”EMPLOYEES” 16.81 KB 107行がインポートされました
. . “HR”.”JOBS” 6.992 KB 19行がインポートされました
. . “HR”.”JOB_HISTORY” 7.054 KB 10行がインポートされました
. . “HR”.”LOCATIONS” 8.273 KB 23行がインポートされました
. . “HR”.”REGIONS” 5.484 KB 4行がインポートされました
オブジェクト型TABLE_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型TABLE_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
ジョブ”BLOG”.”SYS_IMPORT_FULL_01″が火 7月 8 06:19:25 2014 elapsed 0 00:00:15で正常に完了しました

C:\Users\Administrator>

この後に、テーブルの内容を確認します。

SQL> select table_name from user_tables;
TABLE_NAME
——————————
COUNTRIES
JOB_HISTORY
EMPLOYEES
JOBS
DEPARTMENTS
LOCATIONS
REGIONS

7行が選択されました。

SQL> select count(1) from COUNTRIES;

COUNT(1)
———-
25

SQL> select count(1) from JOB_HISTORY;

COUNT(1)
———-
10

SQL> select count(1) from EMPLOYEES;

COUNT(1)
———-
107

SQL> select count(1) from JOBS;

COUNT(1)
———-
19

SQL> select count(1) from DEPARTMENTS;

COUNT(1)
———-
27

SQL> select count(1) from LOCATIONS;

COUNT(1)
———-
23

SQL> select count(1) from REGIONS;

COUNT(1)
———-
4

SQL>

はい。テーブルの移行はできております。やったね。

いかがでしたでしょうか。少し工夫がいるように思いますが、以外に簡単にData Pumpユーティリティを使ってデータの移行が出来る事がわかったかと思います。
その他に紹介した方法も合わせながら、RDSをどんどん利用して、楽しいクラウド生活を送りましょう。
それでは、また逢う日まで、さよなら、さよなら、さよなら。

以上

山口正寛(1984年生まれ おうし座/2013年入社)

株式会社システムサポート 東京支社 クラウドコンサルティング事業部所属。
AWSソリューションアーキテクト。
社内では主に、データベース(特にOracle、Redshift)を担当。DBA、コンサルタントなどを経験。最近減量中。