メニュー
Amazon Relational Database Service
ユーザーガイド (API Version 2014-10-31)

Amazon RDS での Oracle へのデータのインポート

データを Amazon RDS DB インスタンスにインポートする方法は、データの量と、データベース内のデータベースオブジェクトの数と種類によって決まります。たとえば、Oracle SQL Developer を使用してシンプルな 20 MB のデータベースをインポートできます。複雑なデータベースや、サイズが数百メガバイトまたは数テラバイトのデータベースをインポートするには、Oracle Data Pump を使用できます。

また、AWS Database Migration Service (AWS DMS) を使用して Amazon RDS DB インスタンスにデータをインポートできます。AWS DMS はダウンタイムなしでデータベースを移行でき、多くのデータベースエンジンに対して、ターゲットデータベースに切り替える準備ができるまで、進行中のレプリケーションを続行できます。AWS DMS を使用して、同じデータベースエンジンまたは異なるデータベースエンジンから Oracle に移行できます。別のデータベースエンジンから移行する場合は、AWS Schema Conversion Tool を使用して、AWS DMS では移行されないスキーマオブジェクトを移行できます。AWS DMS の詳細については、「AWS Database Migration Service とは」を参照してください。

これらの移行方法を使用する前に、ベストプラクティスとして、データベースのバックアップを作成することをお勧めします。スナップショットを作成することで、Amazon RDS インスタンスをバックアップすることができます。後で、スナップショットからデータベースを復元できます。詳細については、「Amazon RDS DB インスタンスのバックアップと復元」を参照してください。

Oracle SQL Developer

小規模のデータベースでは、Oracle によって無償で配布されるグラフィカルな Java ツールである Oracle SQL Developer を使用できます。このツールは、デスクトップコンピュータ (Windows、Linux、Mac) またはいずれか 1 つのサーバーにインストールできます。Oracle SQL Developer には、2 つの Oracle データベース間でデータを移行したり、MySQL などの他のデータベースから Oracle へデータを移行したりするためのオプションが用意されています。Oracle SQL Developer は小規模なデータベースの移行に最適です。データの移行を開始する前に、Oracle SQL Developer 製品のドキュメントを読むことをお勧めします。

SQL Developer をインストールすると、SQL Developer を使用して移行元のデータベースと移行先のデータベースに接続できます。[Tools] メニューの [Database Copy] コマンドを使用して、Amazon RDS インスタンスにデータをコピーします。

Oracle SQL Developer をダウンロードするには、 http://www.oracle.com/technetwork/developer-tools/sql-developer にアクセスしてください。

Oracle には、MySQL や SQL Server などの他のデータベースから移行する方法に関するドキュメントも用意されています。詳細については、Oracle のドキュメントの http://www.oracle.com/technetwork/database/migration を参照してください。

Oracle Data Pump

Oracle Data Pump は、長い期間 Oracle エクスポート/インポートユーティリティの代替として使用されてきました。また Oracle Data Pump は、Oracle のインストールから Amazon RDS DB インスタンスに大量のデータを移行する際に推奨される方法です。Oracle Data Pump は、次のようなさまざまなシナリオで使用できます。

  • Oracle データベースを使用した Amazon EC2 インスタンスから Oracle DB インスタンスにデータをインポートする

  • Oracle DB インスタンス上のデータベースから別の Oracle DB インスタンスにデータをインポートする

  • VPC 内の Oracle DB インスタンス上のデータベースから別の Oracle DB インスタンスにデータをインポートする (VPC の有無は問わない)

  • ローカルの Oracle データベースから Amazon RDS DB インスタンスにデータをインポートする

次のプロセスでは、Oracle Data Pump と DBMS_FILE_TRANSFER パッケージを使用します。このプロセスでは、Oracle インスタンスに接続し、Oracle Data Pump を使用してデータをエクスポートします。次に、DBMS_FILE_TRANSFER.PUT_FILE メソッドを使用して、Oracle インスタンスから、データベースリンクを経由して接続されている移行先の DB インスタンスの DATA_PUMP_DIR にダンプファイルをコピーします。最後のステップでは、コピーされたダンプファイルから RDS インスタンスにデータをインポートします。

このプロセスには、次の要件があります。

  • DBMS_FILE_TRANSFER パッケージに対する実行権限を持っている必要があります。

  • 移行先の DB インスタンスはバージョン 11.2.0.2.v6 以降あることが必要です。

  • 移行元の DB インスタンスの DATA_PUMP_DIR ディレクトリに対する書き込み権限を持っている必要があります。

  • 移行元のインスタンスと移行先の DB インスタンスにダンプファイルを格納するための十分なストレージ領域があることが必要です。

注記

このプロセスでは、DATA_PUMP_DIR ディレクトリ (すべての Oracle DB インスタンスで事前に設定されているディレクトリ) にダンプファイルをインポートします。このディレクトリはデータファイルと同じストレージボリュームにあります。ダンプファイルをインポートすると、既存の Oracle データファイルはより多くの領域を使用するので、DB インスタンスでは領域の追加使用に対応できることを必ず確認してください。インポートされたダンプファイルは、DATA_PUMP_DIR ディレクトリから自動的に削除されることも、消去されることもありません。インポートされたダンプファイルを削除するには、UTL_FILE.FREMOVE を使用します。

Oracle Data Pump と DBMS_FILE_TRANSFER パッケージを使用するインポートプロセスでは、次のステップを実行します。

  • ステップ 1: 移行元のデータベースのユーザーに権限を付与する

  • ステップ 2: DBMS_DATAPUMP を使用してダンプファイルを作成する

  • ステップ 3: 移行先の DB インスタンスへのデータベースリンクを作成する

  • ステップ 4: DBMS_FILE_TRANSFER を使用して、エクスポートされたファイルダンプを Amazon RDS インスタンスにコピーする

  • ステップ 5: Amazon RDS インスタンスのデータベースにダンプファイルをインポートする

  • ステップ 6: クリーンアップ

ステップ 1: 移行元のデータベースのユーザーに権限を付与する

SQL Plus や Oracle SQL Developer を使用して、インポートするデータを含む Oracle インスタンスに接続します。必要に応じて、ユーザーアカウントを作成し、必要なアクセス許可を付与します。

次のコマンドは、新しいユーザーを作成し、必要なアクセス許可を付与します。

Copy
SQL> create user USER1 identified by test123; SQL> grant create session, create table to USER1; SQL> alter user USER1 quota 100M on users; SQL> grant read, write on directory data_pump_dir to USER1; SQL> grant execute on dbms_datapump to USER1;

ユーザー独自のテーブルを使用できます。また、プロセスをテストするためにテーブルを 1 つ作成することもできます。次のコマンドは、DB インスタンスにインポートするためのサンプルテーブルを作成します。

Copy
SQL> create table USER1.tab1 tablespace users as select 'USER1_'||object_name str_col, sysdate dt_col from all_objects;

ステップ 2: DBMS_DATAPUMP を使用してダンプファイルを作成する

SQL Plus や Oracle SQL Developer を使用して Oracle インスタンスに接続し、Oracle Data Pump ユーティリティを使用してダンプファイルを作成します。次のスクリプトは、DATA_PUMP_DIR ディレクトリに tab1.dmp というダンプファイルを作成します。

Copy
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'tab1.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'exp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''USER1'')'); DBMS_DATAPUMP.start_job(hdnl); END; /

ステップ 3: 移行先の DB インスタンスへのデータベースリンクを作成する

次に、移行元のインスタンスと移行先の DB インスタンスの間にデータベースリンクを作成します。データベースリンクを作成してエクスポートファイルを転送するためには、ローカルの Oracle インスタンスに DB インスタンスとのネットワーク接続が必要です。

同じ VPC 内またはピア接続された VPC 内の 2 つの DB インスタンス間のデータベースリンクを作成する場合、2 つの DB インスタンス間には有効なルートがある必要があります。各 DB インスタンスのセキュリティグループは他の DB インスタンスの受信と送信を許可する必要があります。セキュリティグループのインバウンドルールとアウトバウンドルールは、同じ VPC またはピアリング接続先 VPC からセキュリティグループを参照できます。詳細については、「VPC の DB インスタンスで使用するデータベースリンクの調整」を参照してください。

次のコマンドは、移行先の DB インスタンスのデータベースに関連するユーザーを対象とした、to_rds というデータベースリンクを作成します。

Copy
create database link to_rds connect to USER2 identified by user2pwd using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)(PORT=<listener port>))(CONNECT_DATA=(SID=<remoteSID>)))';

手順 4: DBMS_FILE_TRANSFER を使用して、エクスポートされたファイルダンプを Amazon RDS DB インスタンスにコピーする

次に、DBMS_FILE_TRANSFER を使用して、移行元のデータベースインスタンスから移行先の DB インスタンスにダンプファイルをコピーします。次のスクリプトは、移行元のインスタンスから to_rds という移行先のデータベースリンク (前の手順で作成) に tab1.dmp というダンプファイルをコピーします。

Copy
BEGIN DBMS_FILE_TRANSFER.PUT_FILE( source_directory_object => 'DATA_PUMP_DIR', source_file_name => 'tab1.dmp', destination_directory_object => 'DATA_PUMP_DIR', destination_file_name => 'tab1_copied.dmp', destination_database => 'to_rds' ); END; /

ステップ 5: 必要なテーブルスペースをターゲットインスタンスに作成する

データをインポートする前に、テーブルスペースを作成する必要があります。詳細については、「テーブルスペースの作成とサイズ変更」を参照してください。

手順 6: Data Pump を使用し DB インスタンスでデータファイルをインポートする

Oracle Data Pump を使用してスキーマを DB インスタンスにインポートします。次の例の最初の部分は、データインポートステートメントの形式を示しています。2 番目の部分は、tab1_copied.dmp というデータファイルをインポートすることを示しています。REMAP_TABLESPACE などの追加オプションが必要な場合があります。

Copy
impdp <username>@<TNS_ENTRY> DUMPFILE=user1copied.dmp DIRECTORY=DATA_PUMP_DIR full=y impdp copy1@copy1 DUMPFILE=tab1_copied.dmp DIRECTORY=DATA_PUMP_DIR full=y

DB インスタンスのテーブルを表示することにより、データのインポートを検証できます。

Copy
SQL> select count(*) from user1.tab1;

ステップ 7: クリーンアップ

データをインポートした後、保管する必要がなくなったファイルを削除できます。次のコマンドを使用して、DATA_PUMP_DIR 内のファイルのリストを表示します。

Copy
select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime;

注記

RDSADMIN.RDS_FILE_UTIL.LISTDIR はバージョン 11.2.0.3.v1 以降でのみ使用できます。

次のコマンドを使用して、DATA_PUMP_DIR 内の不要になったファイルを削除できます。

Copy
exec utl_file.fremove('DATA_PUMP_DIR','[file name]');

たとえば、次のコマンドは、「test_dbms_lob.txt」というファイルを削除します。

Copy
exec utl_file.fremove('DATA_PUMP_DIR','test_dbms_lob.txt');

Oracle エクスポート/インポートユーティリティ

Oracle エクスポート/インポートユーティリティは、データサイズが小さく、2 進浮動小数点数や倍精度浮動小数点数などのデータ型を必要としない場合の移行に最適なツールです。インポートプロセスではスキーマオブジェクトが作成されるため、スキーマオブジェクトを事前に作成するためのスクリプトを実行する必要はありません。このプロセスは、小規模なテーブルを使用したデータベースに適しています。次の例では、これらのユーティリティを使用して、特定のテーブルのエクスポートやインポートを実行する方法について説明します。

移行元のデータベースからテーブルをエクスポートするには、次のコマンドを使用します。必要に応じてユーザー名/パスワードを置き換えてください。

Copy
exp cust_dba@ORCL FILE=exp_file.dmp TABLES=(tab1,tab2,tab3) LOG=exp_file.log

エクスポートプロセスでは、指定されたテーブルのスキーマとデータを含むバイナリダンプファイルが作成されます。これで、次のコマンドを使用して、このスキーマとデータを移行先のデータベースにインポートできます。

Copy
imp cust_dba@targetdb FROMUSER=cust_schema TOUSER=cust_schema \ TABLES=(tab1,tab2,tab3) FILE=exp_file.dmp LOG=imp_file.log

ユーザーのニーズに合うと考えられるエクスポートコマンドまたはインポートのコマンドの使用方法は、他にもあります。詳細については、Oracle のドキュメントを参照してください。

Oracle SQL*Loader

Oracle SQL*Loader は、含まれるオブジェクトの数が制限されている大規模なデータベースに適しています。移行元のデータベースからのエクスポートと移行先のデータベースへの読み込みに関与するプロセスは、スキーマに固有のものであるため、次の例では、サンプルのスキーマオブジェクトを作成し、移行元からエクスポートして、移行先のデータベースに読み込みます。

  1. 次のコマンドを使用してサンプルの移行元テーブルを作成します。

    Copy
    create table customer_0 tablespace users as select rownum id, o.* from all_objects o, all_objects x where rownum <= 1000000;
  2. 移行先の Amazon RDS インスタンスで、データの読み込みに使用する移行先テーブルを作成します。

    Copy
    create table customer_1 tablespace users as select 0 as id, owner, object_name, created from all_objects where 1=2;
  3. データは、移行元のデータベースから区切り記号を含んだフラットファイルにエクスポートされます。これを実行するため、この例では SQL*Plus を使用します。移行するデータについて、データベース内のすべてのオブジェクトをエクスポートするためのスクリプトの生成が必要になる場合があります。

    Copy
    alter session set nls_date_format = 'YYYY/MM/DD HH24:MI:SS'; set linesize 800 HEADING OFF FEEDBACK OFF array 5000 pagesize 0 spool customer_0.out SET MARKUP HTML PREFORMAT ON SET COLSEP ',' SELECT id, owner, object_name, created FROM customer_0; spool off
  4. データの詳細について記述した制御ファイルを作成する必要があります。この場合も、データによっては、このステップを実行するスクリプトの構築が必要になることがあります。

    Copy
    cat << EOF > sqlldr_1.ctl load data infile customer_0.out into table customer_1 APPEND fields terminated by "," optionally enclosed by '"' ( id POSITION(01:10) INTEGER EXTERNAL, owner POSITION(12:41) CHAR, object_name POSITION(43:72) CHAR, created POSITION(74:92) date "YYYY/MM/DD HH24:MI:SS" )

    必要に応じて、ステージング領域 (Amazon EC2 インスタンスなど) に上のコードで生成したファイルをコピーします。

  5. 最後に、移行先のデータベース用の適切なユーザー名とパスワードで SQL*Loader を使用して、データをインポートします。

    Copy
    sqlldr cust_dba@targetdb control=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000

Oracle マテリアライズドビュー

Oracle マテリアライズドビューのレプリケーションを使用して、大規模なデータセットを効率的に移行することもできます。レプリケーションを使用すると、移行先テーブルと移行元との同期を継続的に維持できるため、Amazon RDS への実際のカットオーバーは、必要に応じて後で行うことができます。レプリケーションは、Amazon RDS インスタンスから移行元のデータベースへのデータベースリンクを使用してセットアップします。

マテリアライズドビューでは、移行先のデータベースから移行元のデータベースへのアクセスを許可する必要があります。次の例では、移行元データベースでアクセスルールが有効になっており、移行先の Amazon RDS データベースが SQLNet を経由して移行元にアクセスすることが許可されています。

  1. 同じパスワードで認証できるユーザーアカウントを、移行先と移行元の Amazon RDS インスタンスの両方に作成します。

    Copy
    create user dblink_user identified by password default tablespace users temporary tablespace temp; grant create session to dblink_user; grant select any table to dblink_user; grant select any dictionary to dblink_user;
  2. 新しく作成した dblink_user を使用して、移行先の Amazon RDS インスタンスから移行元のインスタンスへのデータベースリンクを作成します。

    Copy
    create database link remote_site connect to dblink_user identified by password using '(description=(address=(protocol=tcp) (host=<myhost>) (port=<listener port>)) (connect_data=(sid=<sourcedb sid>)))';
  3. リンクをテストします。

    Copy
    select * from v$instance@remote_site;
  4. 移行元のインスタンスで、プライマリキーを持つサンプルテーブルとマテリアライズドビューのログを作成します。

    Copy
    create table customer_0 tablespace users as select rownum id, o.* from all_objects o, all_objects x where rownum <= 1000000; alter table customer_0 add constraint pk_customer_0 primary key (id) using index; create materialized view log on customer_0;
  5. 移行先の Amazon RDS インスタンスで、マテリアライズドビューを作成します。

    Copy
    CREATE MATERIALIZED VIEW customer_0 BUILD IMMEDIATE REFRESH FAST AS SELECT * FROM cust_dba.customer_0@remote_site;