ニュース&ブログ
RDSへのデータ移行方法三選!(③Oracle Data Pumpユーティリティを使用したデータ移行)
投稿日: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へ移行してみたいと思います。 環境と手順はこんな感じ。 図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用のユーザを作成
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でエクスポート
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で準備されているパッケージを使用します。
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>
⑥転送されたファイルをimpdpでインポート
いよいよ、最後に、転送したダンプ・ファイルをRDSへData Pumpユーティリティを使ってインポートします。 br> インポートに先立ちまして、インポート対象のHRスキーマを作成し、必要な権限を付与します。SQL> create user HR identified by oracle2014;
ユーザーが作成されました。
SQL> grant unlimited tablespace to HR;
権限付与が成功しました。
SQL>
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、コンサルタントなどを経験。最近減量中。