メニュー
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 インスタンス) から Amazon RDS Oracle DB インスタンスへのデータのインポート

  • Amazon RDS Oracle DB インスタンスから Oracle (オンプレミスまたは Amazon EC2 インスタンス) へのデータのインポート

  • Amazon RDS Oracle DB インスタンス間でのデータのインポート (EC2-Classic から VPC へのデータの移行など)

Oracle Data Pump ユーティリティをダウンロードするには、http://www.oracle.com/technetwork/database/features/instant-client に移動します。

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

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

  • DBMS_FILE_TRANSFER パッケージと DBMS_DATAPUMP パッケージに対する実行権限が必要です。

  • 移行元の 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: 移行先の Amazon RDS インスタンスのユーザーに権限を付与する

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

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

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

  • ステップ 5: DBMS_FILE_TRANSFER を使用して、エクスポートされたダンプファイルを移行先の DB インスタンスにコピーする

  • ステップ 6: DBMS_DATAPUMP を使用して移行先の DB インスタンスにデータファイルをインポートする

  • ステップ 7: クリーンアップする

ステップ 1: 移行先の Amazon RDS インスタンスのユーザーに権限を付与する

  1. SQL Plus や Oracle SQL Developer を使用して、データをインポートする先の Amazon RDS Oracle DB インスタンスに接続します。Amazon RDS マスターユーザーとして接続します。DB インスタンスへの接続方法については、「Oracle データベースエンジンを実行している DB インスタンスへの接続」を参照してください。

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

  3. データのインポート先のユーザーアカウントが存在しない場合は、ユーザーアカウントを作成し、必要なアクセス権限とロールを付与します。データを複数のユーザースキーマにインポートする場合は、各ユーザーアカウントを作成し、それぞれ必要な特権およびロールを付与します。

    たとえば、以下のコマンドでは、新しいユーザーを作成し、ユーザーのスキーマ内にデータをインポートするために必要なアクセス権限とロールを付与します。

    create user schema_1 identified by <password>; grant create session, resource to schema_1; alter user schema_1 quota 100M on users;

    この例では、新規ユーザーに CREATE SESSION 特権と RESOURCE ロールを付与します。インポートするデータベースオブジェクトによっては、追加の特権とロールが必要になる場合があります。

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

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

注記

移行元のデータベースが Amazon RDS インスタンスの場合、このステップは省略できます。エクスポートを行うには、Amazon RDS マスターユーザーアカウントを使用します。

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

create user export_user identified by <password>; grant create session, create table, create database link to export_user; alter user export_user quota 100M on users; grant read, write on directory data_pump_dir to export_user; grant select_catalog_role to export_user; grant execute on dbms_datapump to export_user; grant execute on dbms_file_transfer to export_user;

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

管理ユーザーまたはステップ 2 で作成したユーザーとして、SQL Plus または Oracle SQL Developer を使用して移行元の Oracle インスタンスに接続します。移行元のデータベースが Amazon RDS Oracle DB インスタンスである場合は、Amazon RDS マスターユーザーとして接続します。次に、Oracle Data Pump ユーティリティを使用してダンプファイルを作成します。

次のスクリプトでは、DATA_PUMP_DIR ディレクトリに sample.dmp というダンプファイルを作成します。

DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'sample.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 (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /

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

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

このステップでは、前のステップと同じユーザーアカウントを使用して接続します。

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

次のコマンドは、移行先の DB インスタンスの Amazon RDS マスターユーザーに接続する to_rds というデータベースリンクを作成します。

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

ステップ 5: DBMS_FILE_TRANSFER を使用して、エクスポートされたダンプファイルを移行先の DB インスタンスにコピーする

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

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

ステップ 6: DBMS_DATAPUMP を使用して移行先の DB インスタンスにデータファイルをインポートする

Oracle Data Pump を使用してスキーマを DB インスタンスにインポートします。METADATA_REMAP などの追加オプションが必要になる場合があります。

Amazon RDS マスターユーザーアカウントで DB インスタンスに接続し、インポートを実行します。

DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'sample_copied.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /

DB インスタンスでユーザーのテーブルを表示することで、データのインポートを検証できます。たとえば、次のクエリはスキーマ 1 のテーブル数を返します。

select count(*) from dba_tables where owner='SCHEMA_1';

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

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

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

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

exec utl_file.fremove('DATA_PUMP_DIR','<file name>');

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

exec utl_file.fremove('DATA_PUMP_DIR','sample_copied.dmp');

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

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

Oracle のエクスポートおよびインポートユーティリティをダウンロードするには、http://www.oracle.com/technetwork/database/features/instant-client に移動します。

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

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

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

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

Oracle SQL*Loader をダウンロードするには、http://www.oracle.com/technetwork/database/features/instant-client に移動します。

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

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

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

    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. データの詳細について記述した制御ファイルを作成する必要があります。この場合も、データによっては、このステップを実行するスクリプトの構築が必要になることがあります。

    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 を使用して、データをインポートします。

    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 インスタンスの両方に作成します。

    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 インスタンスから移行元のインスタンスへのデータベースリンクを作成します。

    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. リンクをテストします。

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

    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 インスタンスで、マテリアライズドビューを作成します。

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