RDS for Oracle でデータポンプが利用可能に (1)

昨夜のAWSブログでの発表等で RDS for Oracle でデータポンプが利用可能になった旨、発表されております。

Oracle Database は11g以降、オリジナルのエクスポートを基本的にサポートしません。
データの移動にはバージョンにより、以下のように使い分けが必要になります。
※「サポートが必要な場合は」という意味ですが、Oracleを使っていてサポートが不要という場面は想像しがたいです。

  • 10g以前→10g:オリジナル
  • 10g以前→11g:オリジナル
  • 11g→11g:データポンプ

RDS for Oracleを11.2.0.2.v5にアップデートしたうえでネットワークモードのデータポンプにより双方向でデータの移動が可能だそうです。

実際に更新された Amazon RDS Data Import Guide for OracleOracle Data Pump 部分を訳すと以下のように書いてあります。

オラクル・データ・ポンプは(オリジナルの)エクスポート/インポート・ユーティリティに置き換わるツールです。データ・ポンプは、エクスポート/インポートに関する多くの機能強化を含んでいます。また、それはデータベース間でより大きなデータセットを移動させる場合、オリジナルよりはるかに速いです。さらに、データ・ポンプでは、ダンプファイルをエクスポートする必要がありません。ソース・データベースからデータを読み込み、ターゲット・データベースに直接書き込むネットワークインポートを行なうことができます。次の例では、Amazon EC2上のオラクル・データベースからAmazon RDSインスタンス上のオラクル・データベースに全てのスキーマをコピーする方法を示します。


1. oracleユーザとしてEC2インスタンスにログインします。データベースは起動している必要があります。リスナー・プロセスも同様です。lsnrctl start コマンドでリスナーを開始することでデータベースへの接続が受入れ可能になります。


2. tnsnames.oraファイルに2つのエントリが必要です。1つはローカル・データベース、もう1つはRDSインスタンスのものです。これはtnsnames.oraファイルの抜粋です:


EC2DB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip-12-46-107-195.ec2.internal)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = ec2db)
)
)

RDSDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = mydb.cg921fiuepnr.us-east-1.rds.amazonaws.com)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = rdsdb)
)
EC2DBは"loopback"接続であり、ホスト名がこのEC2インスタンスに対するプライベートDNS名であることに注意してください。Amazon EC2 Management Console から DNS名が確認できます。
RDSDBはAmazon RDSインスタンスを指します。ホスト名はRDSインスタンスのendpointです。Amazon RDS Management Console からendpointが確認できます。
 

3. EC2のローカルにあるOracleデータベースに接続し、RDSインスタンスを指すデータベースリンクを作成します。


sqlplus system/manager
...
create database link rdsdb
connect to master identified by xxxx
using 'rdsdb';


4. 次に、RDSインスタンスに接続し、EC2のOracleデータベースを指すデータベースリンクを作成します。


sqlplus master/xxxx@rdsdb
...
create database link ec2db
connect to system identified by yyyy
using '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = ip-12-46-107-195.ec2.internal)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ec2db)))';;
RDSインスタンスからEC2インスタンス上のtnsnames.oraファイルにアクセスできないため、接続文字列には完全な接続識別子の指定が必要です。


5. 例としてEC2のローカルにあるCUST_SCHEMAというスキーマに複数のテーブル、インデックスやオブジェクト(オブジェクト権限やトリガなど)があるものとして、このユーザのスキーマを全てRDSインスタンスにインポートしたいこととします。以下のコマンドを使うことでEC2上のデータベースからRDSインスタンスにネットワーク・インポートできます。


impdp master/xxxx@rdsdb directory=data_pump_dir network_link=ec2db schemas=cust_schema
impdpコマンドにはディレクトリ・オブジェクトが必要ですが、Amazon RDS の全てのインスタンスには事前に DATA_PUMP_DIR という名前のディレクトリ・オブジェクトがデータポンプインポート用に用意されています。インポート処理ではEC2のローカルデータベース側で事前に作成したデータベースリンクでこのディレクトリが使用されます。最終的に CUST_SCHEMA 内の全てのオブジェクトがコピーされています。

次回のエントリ「RDS for Oracle でデータポンプが利用可能に (2)」では、実際にオンプレ(と言ってもMBAのVirtualBox上のDB)から接続してデータを移行してみようと思います。

また、その次のエントリでは、RDSをインターネット側に開けっ放しにしておくことは考えにくいことから、VPC内で利用することを想定してデータの移行に問題がないかも検証してみたいと思います。