Amazon RDS の Oracle にデータをインポートする - Amazon Relational Database Service

Amazon RDS の Oracle にデータをインポートする

Amazon RDS DB インスタンスにデータをインポートする方法は、次の条件によって異なります。

  • 保有しているデータの量

  • データベース内のデータベースオブジェクトの数

  • データベース内のさまざまなデータベースオブジェクト

例えば、次のメカニズムを使用できます。

  • Oracle SQL Developer — シンプルな 20 MB のデータベースを 1 つインポートできます。

  • Oracle Data Pump – 複雑なデータベースや、サイズが数百メガバイトまたは数テラバイトのデータベースをインポートできます。このタスクでは、Amazon S3 が使用できます。例えば、Amazon S3 の Data Pump ファイルを DB インスタンスにダウンロードできます。詳細については、「Amazon S3 統合」を参照してください。

  • AWS Database Migration Service (AWS DMS) — ダウンタイムなしでデータベースを移行できます。AWS DMS の詳細については、「AWS Database Migration Service とは」およびブログ記事「AWS DMS を使用してほぼゼロのダウンタイムで Oracle データベースを移行する」参照してください。

重要

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

多くのデータベースエンジンでは、ターゲットデータベースに切り替える準備ができるまで、進行中のレプリケーションを続行できます。AWS DMS を使用して、同じデータベースエンジンまたは異なるデータベースエンジンから Oracle に移行できます。別のデータベースエンジンから移行する場合は、AWS Schema Conversion Tool を使用します。これにより、AWS DMS では移行できないスキーマオブジェクトを移行できます。

次の動画では、Oracle の移行テクニックについて簡単に紹介します。

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 for Oracle DB インスタンスにデータをインポートする。

  • RDS for Oracle DB インスタンスから Oracle データベース (オンプレミスまたは Amazon EC2 インスタンス) にデータをインポートする。

  • RDS for Oracle DB インスタンス間でデータをインポートする (例: EC2-Classic から VPC へのデータ移行)。

Oracle Data Pump ユーティリティをダウンロードするには、Oracle Technical Network ウェブサイトの「Oracle Database ソフトウェア・ダウンロード」を参照してください。

Oracle Database のバージョン間で移行する場合の互換性に関する考慮事項については、Oracle のドキュメントを参照してください。

Oracle Data Pump を使用してデータをインポートするときは、データを含むダンプファイルをソースデータベースからターゲットデータベースに転送する必要があります。ダンプファイルを転送するには、Amazon S3 バケットを使用するか、2 つのデータベース間のデータベースリンクを使用します。

Oracle Data Pump を使用して Oracle DB インスタンスにデータをインポートする場合は、次のベストプラクティスをお勧めします。

  • 特定のスキーマやオブジェクトをインポートするには、schema または table モードでインポートを実行します。

  • インポートするスキーマをアプリケーションに必要なスキーマに制限します。

  • full モードではインポートしないでください。

    Amazon RDS for Oracle では、管理ユーザー SYS または SYSDBA へのアクセスは許可されていないため、full モードでインポートしたり、Oracle 管理のコンポーネントのスキーマをインポートしたりすると、Oracle データディレクトリが損傷し、データベースの安定性に影響を及ぼす可能性があります。

  • 大量のデータをロードする場合は、ダンプファイルをターゲットの Amazon RDS for Oracle DB インスタンスに転送し、インスタンスの DB スナップショットを作成後、インポートをテストして、問題なく完了したことを確認します。データベースコンポーネントが無効の場合は、DB インスタンスを削除後、DB スナップショットから再作成します。復元された DB インスタンスには、DB スナップショットの作成時に DB インスタンス上でステージングされたダンプファイルがすべて含まれています。

  • Oracle Data Pump エクスポートパラメータ TRANSPORT_TABLESPACESTRANSPORTABLE、または TRANSPORT_FULL_CHECK を使用して作成されたダンプファイルはインポートしないでください。Amazon RDS for Oracle DB インスタンスでは、これらのダンプファイルのインポートはサポートされていません。

  • スキーマ SYSSYSTEMRDSADMINRDSSEC、および RDS_DATAGUARD に Oracle Scheduler オブジェクト (ジョブ、プログラム、スケジュール) を含むダンプファイルをインポートしないでください。Amazon RDS for Oracle DB インスタンスでは、これらのダンプファイルのインポートはサポートされていません。

注記

サポートされていない Scheduler オブジェクトを除外するには、Data Pump エクスポート時に追加のディレクティブを使用します。DBMS_DATAPUMP を使用する場合は、METADATA_FILTER の前に DBMS_METADATA.START_JOB をさらに追加します。

DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM SYS.OBJ$ WHERE TYPE# IN (66,67,74) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) )]','PROCOBJ');

expdp を使用する場合は、次の例に示す exclude ディレクティブを含むパラメータファイルを作成します。その後、PARFILE=parameter_file コマンドで expdp を使用します。

exclude=procobj:"IN (SELECT NAME FROM sys.OBJ$ WHERE TYPE# IN (66,67,74) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC') ) )"

このセクションの例は、Oracle データベースにデータをインポートする方法の 1 つを示しています。ただし、Oracle Data Pump では、さまざまな方法でデータをインポートできます。Oracle Data Pump の詳細については、Oracle のドキュメントを参照してください。

このセクションの例では DBMS_DATAPUMP パッケージを使用します。同じタスクは、Oracle Data Pump コマンドラインユーティリティの impdp および expdp を使用して実行できます。これらのユーティリティは、Oracle インスタントクライアントを含む Oracle クライアントインストールの一部としてリモートホストにインストールできます。

Oracle Data Pump と Amazon S3 バケットを使用したデータのインポート

次のインポートプロセスでは、Oracle Data Pump と Amazon S3 バケットを使用します。このプロセスでは、Oracle DBMS_DATAPUMP パッケージを使用してソースデータベースのデータをエクスポートし、そのダンプファイルを Amazon S3 バケットに保存します。ダンプファイルは、Amazon S3 バケットから、ターゲットの Amazon RDS for Oracle DB インスタンスの DATA_PUMP_DIR ディレクトリにダウンロードされます。最後のステップでは、DBMS_DATAPUMP パッケージを使用して、コピーしたダンプファイルのデータを Amazon RDS for Oracle DB インスタンス内にインポートします。

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

  • ファイル転送に使用できる Amazon S3 バケットが必要です。また、この Amazon S3 バケットは、DB インスタンスと同じ AWS リージョン内にある必要があります。手順については、Amazon Simple Storage Service 入門ガイドの「バケットの作成」を参照してください。

  • Amazon S3 バケットにアップロードするオブジェクトは、5 TB 以下にする必要があります。Amazon S3 でオブジェクトを操作する方法については、『Amazon Simple Storage Service 開発者ガイド』を参照してください。

    注記

    ダンプファイルが5 TBを超える場合、並列オプションを使用して Oracle Data Pump エクスポートを実行できます。このオペレーションは、個々のファイルの 5 TB の制限を超えないように複数のダンプファイルにデータを分散します。

  • Amazon RDS 統合用の Amazon S3 バケットは、「Amazon RDS for Oracle と Amazon S3 を統合する前提条件」の手順に従って準備してください。

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

注記

このプロセスでは、DATA_PUMP_DIR ディレクトリ (すべての Oracle DB インスタンスで事前に設定されているディレクトリ) にダンプファイルをインポートします。このディレクトリはデータファイルと同じストレージボリュームにあります。ダンプファイルをインポートした場合、既存の Oracle データファイルのスペース占有率は高くなります。そのため、DB インスタンスではスペースの追加占有に対応できることを確認する必要があります。インポートしたダンプファイルは、DATA_PUMP_DIR ディレクトリから自動的に削除またはパージされることはありません。インポートしたダンプファイルを削除するには、Oracle ウェブサイトにある UTL_FILE.FREMOVE を使用します。

Oracle Data Pump と Amazon S3 バケットを使用したインポートプロセスには、次のステップがあります。

ステップ 1: ターゲットの Amazon RDS インスタンスのユーザーに特権を付与する

ターゲットの 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 を付与します。インポートするデータベースオブジェクトによっては、特権とロールの追加が必要になる場合があります。

    注記

    schema_1 を、このステップおよび次のステップのスキーマ名に置き換えます。

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

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

次のスクリプトでは、DATA_PUMP_DIR スキーマが含まれている sample.dmp というダンプファイルを SCHEMA_1 ディレクトリに作成します。SCHEMA_1 をエクスポートするスキーマの名前に置き換えます。

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_exp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM sys.OBJ$ WHERE TYPE# IN (66,67,74) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')))]','PROCOBJ'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
注記

Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「ジョブステータスのモニタリング」を参照してください。エクスポートログの内容は、rdsadmin.rds_file_util.read_text_file の手順を使用して表示できます。詳細については、「DB インスタンスディレクトリ内のファイルの読み取り」を参照してください。

ステップ 3: Amazon S3 バケットにダンプファイルをアップロードする

ダンプファイルを Amazon S3 バケットにアップロードします。

Amazon RDS プロシージャ rdsadmin.rdsadmin_s3_tasks.upload_to_s3 を使用して、Amazon S3 バケットにダンプファイルをコピーします。次の例では、DATA_PUMP_DIR ディレクトリのすべてのファイルを、mys3bucket という名前の Amazon S3 バケットにアップロードします。

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT ステートメントでは、データ型 VARCHAR2 のタスクの ID が返ります。

詳細については、「Oracle DB インスタンスから Amazon S3 バケットにファイルをアップロードする」を参照してください。

ステップ 4: エクスポートしたダンプファイルを Amazon S3 バケットからターゲットの DB インスタンスにコピーする

SQL Plus や Oracle SQL Developer を使用して、Amazon RDS ターゲットの Oracle DB インスタンスに接続します。Amazon RDS プロシージャ rdsadmin.rdsadmin_s3_tasks.download_from_s3 を使用して、Amazon S3 バケットからターゲットの DB インスタンスにダンプファイルをコピーします。次の例では、mys3bucket という名前の Amazon S3 バケットから DATA_PUMP_DIR ディレクトリにファイルをすべてダウンロードします。

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'mys3bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

SELECT ステートメントでは、データ型 VARCHAR2 のタスクの ID が返ります。

詳細については、「Amazon S3 バケットから Oracle DB インスタンスにファイルをダウンロードする」を参照してください。

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

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

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

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

Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「ジョブステータスのモニタリング」を参照してください。インポートログの内容は、rdsadmin.rds_file_util.read_text_file の手順を使用して表示できます。詳細については、「DB インスタンスディレクトリ内のファイルの読み取り」を参照してください。

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

SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';

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

データをインポートしたら、保管が不要になったファイルは削除できます。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 Data Pump と Oracle DBMS_FILE_TRANSFER パッケージを使用します。このプロセスでは、ソースの Oracle インスタンス (オンプレミスまたは Amazon EC2 インスタンス、あるいは Amazon RDS for Oracle DB インスタンス) に接続します。次に、DBMS_DATAPUMP パッケージを使用してデータをエクスポートします。次に、DBMS_FILE_TRANSFER.PUT_FILE メソッドを使用して、Oracle インスタンスのダンプファイルを、データベースリンクを使用して接続されているターゲットの Amazon RDS for Oracle DB インスタンスの DATA_PUMP_DIR ディレクトリにコピーします。最後のステップでは、 DBMS_DATAPUMP パッケージを使用して、コピーしたダンプファイルのデータを Amazon RDS for Oracle DB インスタンス内にインポートします。

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

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

  • 移行元の DB インスタンスの DATA_PUMP_DIR ディレクトリに対する書き込み権限が必要です。

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

注記

このプロセスでは、DATA_PUMP_DIR ディレクトリ (すべての Oracle DB インスタンスで事前に設定されているディレクトリ) にダンプファイルをインポートします。このディレクトリはデータファイルと同じストレージボリュームにあります。ダンプファイルをインポートした場合、既存の Oracle データファイルのスペース占有率は高くなります。そのため、DB インスタンスではスペースの追加占有に対応できることを確認する必要があります。インポートしたダンプファイルは、DATA_PUMP_DIR ディレクトリから自動的に削除またはパージされることはありません。インポートしたダンプファイルを削除するには、Oracle ウェブサイトにある UTL_FILE.FREMOVE を使用します。

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

ステップ 1: ターゲットの Amazon RDS インスタンスのユーザーに特権を付与する

ターゲットの 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 を付与します。インポートするデータベースオブジェクトによっては、特権とロールの追加が必要になる場合があります。

    注記

    schema_1 を、このステップおよび次のステップのスキーマ名に置き換えます。

ステップ 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 for Oracle DB インスタンスである場合は、Amazon RDS マスターユーザーとして接続します。次に、Oracle Data Pump ユーティリティを使用してダンプファイルを作成します。

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

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'EXPORT', job_mode => 'SCHEMA', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_exp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'EXCLUDE_NAME_EXPR', q'[IN (SELECT NAME FROM sys.OBJ$ WHERE TYPE# IN (66,67,74) AND OWNER# IN (SELECT USER# FROM SYS.USER$ WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')))]','PROCOBJ'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
注記

Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「ジョブステータスのモニタリング」を参照してください。エクスポートログの内容は、rdsadmin.rds_file_util.read_text_file の手順を使用して表示できます。詳細については、「DB インスタンスディレクトリ内のファイルの読み取り」を参照してください。

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

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

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

同じ 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 v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_copied.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file ); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'sample_imp.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')'); DBMS_DATAPUMP.START_JOB(v_hdnl); END; /
注記

Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「ジョブステータスのモニタリング」を参照してください。インポートログの内容は、rdsadmin.rds_file_util.read_text_file の手順を使用して表示できます。詳細については、「DB インスタンスディレクトリ内のファイルの読み取り」を参照してください。

DB インスタンスでユーザーのテーブルを表示することで、データのインポートを検証できます。例えば、次のクエリでは、schema_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/enterprise-edition/downloads/index.html に移動します。

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

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/enterprise-edition/downloads/index.html に移動します。

  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 インスタンスで、データの読み込みに使用する移行先テーブルを作成します。WHERE 1=2 句を使用すると、ALL_OBJECTS の構造体がコピーされますが、どの行もコピーされません。

    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);
  6. ターゲットの Amazon RDS インスタンスで、マテリアライズドビューを更新します。

    EXEC DBMS_MV.REFRESH('CUSTOMER_0', 'f');
  7. マテリアライズドビューを削除し、PRESERVE TABLE 句を含めて、マテリアライズドビューコンテナテーブルとその内容を保持します。

    DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;

    保持したテーブル名は、削除したマテリアライズドビューと同じです。