Amazon Web Services ブログ

Ora2pg と AWS DMS を使用して BLOB および CLOB テーブルを Oracle から PostgreSQL に移行する方法

多くの企業は、Oracle データベースを PostgreSQL に移行することを検討しています。プラットフォームと企業間の互換性が高く、またライセンスコストを削減するためです。Amazon RDS for PostgreSQLAmazon Aurora with PostgreSQL の互換性により、コスト効率の高い方法で PostgreSQL のデプロイメントをクラウドに簡単にセットアップ、運用、拡張できます。

AWS は、AWS 環境またはオンプレミスデータセンターのいずれかで実行されている Oracle データベースを移行する 2 つのサービスを提供します。AWS Schema Conversion Tool (AWS SCT) は、既存のデータベーススキーマをターゲットデータベーススキーマに変換するのに役立ちます。AWS SCT がスキーマを自動的に変換できない場合は、ターゲットデータベースに同等のスキーマを作成する方法を示す評価レポートが表示されます。AWS Database Migration Service (AWS DMS) は、ソースデータベースからターゲットデータベースに実際のデータを移行するのに役立ちます。

AWS DMS の外部で大きな BLOB および CLOB を移行したいとお考えかもしれません。オープンソースツール Ora2Pg を既によく知っている場合は、このツールを使用してデータを一括読み込みし、AWS DMS を変更データキャプチャ (CDC) に使用できます。

このブログ記事では、Amazon RDS for Oracle データベースを Amazon RDS for PostgreSQL に移行する方法について説明します。これは、CLOB 列データを持つテーブルの初期ロードにはオープンソースの Ora2Pg ツールを使用し、進行中のレプリケーションには AWS DMS の CDC 機能を使用して行います。Ora2Pg と AWS DMS を併用すれば、移行を行い、進行中のレプリケーションのステージをセットアップできます。

Amazon RDS for Oracle から Amazon RDS for PostgreSQL へのデータの移行をテストするのにお使いいただけるように、Amazon RDS for Oracle のスナップショットを提供します。このスナップショットには 1 つのスキーマとユーザー (どちらの名前も awsorauser) に加えて、5 つのテーブルが含まれています。このスキーマの 2 つのテーブル (CUSTOMER および PART) には、それぞれ CLOB 列があります。各 CLOB 列には XML コンテンツがあり、各行の CLOB 列のサイズは約 5 MB です。2 つのテーブルにはそれぞれ 5,000 行あります。さらに、SUPPLIER テーブルには 110,000 行ありますが、CLOB 列はありません。他の 2 つのテーブル、NATION および REGION は非常に小さい表です。

移行の概要

この記事では、高いレベルで次のことを行います。

  1. 2 つのサブネットとセキュリティグループを持つ Amazon VPC に基づいて Virtual Private Cloud (VPC) を作成すること。
  2. 公開されているスナップショットから Amazon RDS for Oracle データベースをプロビジョニングすること。
  3. Amazon EC2 インスタンスをプロビジョニングして構成し、Amazon RDS for Oracle データベースにテストデータをロードすること。
  4. Amazon RDS for PostgreSQL データベースをプロビジョニングすること。
  5. ソース Oracle データベースでアーカイブログモード、補助ログ、および自動バックアップを有効にすること。
  6. Ora2Pg ツールをインストールするための Amazon EC2 インスタンスをプロビジョニングすること。
  7. Ora2Pg ツールをインストールして設定すること。
  8. 新しいデータをソース Oracle データベースにロードして、変更データキャプチャ (CDC) をテストすること。
  9. ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへのレプリケーションを有効にするため、CDC を使用して AWS DMS タスクを作成すること。

前提条件および仮定

このエクササイズを実行するには、次のものが必要です。

  1. Oracle クライアントパッケージをダウンロードする Oracle アカウント。
  2. AWS のサービスへのアクセスを提供する AWS アカウント。
  3. AWS CLI を設定するためのアクセスキーとシークレットアクセスキーを持つ AWS Identity and Access Management (IAM) ユーザー。
  4. テストのため、この投稿で扱うサービスを、us-east-1 リージョンの us-east-1a アベイラビリティゾーンに作成する必要があります。

さらに、次のことに注意してください。

  1. 同じ VPC 内のすべてのサービスを設定して、ネットワーキングの考慮事項を簡素化します。
  2. ソース RDS for Oracle データベースの定義済みデータベーススキーマ名とパスワードは、いずれも awsorauser です。
  3. Oracle データベースのソース RDS の事前定義されたルートユーザー名は、adminです。
  4. Oracle データベースのソース RDS の事前定義されたルートパスワードは、admin123 です。
  5. RDS for PostgreSQL データベースを作成するときは、データベース名、マスターユーザー名、およびスキーマ名に小文字を使用します。
  6. 重要: 提供される AWS CloudFormation テンプレートは、ハードコードされたユーザー名とパスワードとオープンなセキュリティグループを使用します。これらは単にテストの目的のためのものであり、何ら変更を加えることなく実稼働に使用することを意図していません。

移行に使用する AWS コンポーネント

この移行のテストを完了するには、以下の AWS コンポーネントが必要です。

コンポーネント 目的
1 Amazon RDS for Oracle インスタンス 提供されたスナップショットから復元するソース Oracle DB インスタンス。
2 Amazon RDS for PostgreSQL インスタンス ターゲット PostgreSQL インスタンス。ソース Oracle データベースは、この RDS for PostgreSQL インスタンスに移行します。
3 Amazon EC2 マシン (m4.xlarge)、タグ名 Ora2pg-blog-EC2InstanceFor-SourceDataLoading この EC2 マシンは、ソース RDS for Oracle データベースからターゲット PostgreSQL データベースへの最初の移行を実行する際、ソース Oracle データベースに新しいデータを追加するために使用します。このマシンは Oracle クライアントバージョン 12.2 を使用します。Oracle SQL Loader ツール sqlldr にはこのバージョンが付属しており、ソース RDS for Oracle データベースに新しいデータを追加するために必要となるからです。
4 2 番目の Amazon EC2 マシン (m4.4xlarge)、タグ名Ora2pg-blog-EC2InstanceFor-Ora2pg-Configuration この EC2 マシンは、Ora2pg により、RDS for Oracle データベースから RDS for PostgreSQL データベースにデータを移動するために使用します。この EC2 インスタンスに Ora2pg をインストールして設定します。また、12.2 バージョンではなく、11.2 バージョンの Oracle クライアントをこのマシンにインストールする必要があります。したがって、2 つの別々の EC2 インスタンスが必要です。
5 AWS DMS インスタンス この DMS インスタンスは、ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへの進行中のレプリケーションを有効にするために必要です。

移行を実行する

このセクションでは、移行を実行する方法について説明します。

1.初期設定に AWS CloudFormation テンプレートを使用する

このステップでは、VPC、2 つのサブネット、およびセキュリティグループを設定します。スナップショットから RDS for Oracle データベースを復元します。ターゲット RDS for PostgreSQL データベースを作成します。2 つの EC2 インスタンスを作成します。1 つはテストデータのロードに使用し、もう 1 つは Ora2pg ツールとソフトウェアの設定に使用します。
このダウンロード可能な CloudFormation テンプレートを使用して、VPC セキュリティグループ、ソース RDS for Oracle データベース、ターゲット RDS for PostgreSQL データベース、および 2 つの EC2 インスタンスを設定できます。コンソールから直接起動するには、次の [Launch Stack] ボタンをクリックします。

 

CloudFormation テンプレートには、次のパラメータがあります。パラメータのいくつかはあらかじめ定義されており、編集することはできません。一部のパラメータでは、値を指定する必要があります。テーブルに詳細が示されています。

このパラメータには この 事前定義済みエントリを使用しますか、それとも手動エントリを行いますか?
スタック名 ora2pg-dms-stack-1 など、固有のスタック名を指定します 手動エントリ
OracleDatabaseName AWSORA 事前定義済み
OracleInstanceType db.m4.xlarge 事前定義済み
DBSnapshotIdentifier aws-blogs-oracle2postgres-migration-using-ora2pg-dms-source-data 事前定義済み
OracleDBAllocatedStorage 500 GB 事前定義済み
OracleDBInstanceIdentifier awsorains 事前定義済み
PostgreSQLDBInstanceIdentifier awspgins 事前定義済み
PostgreSQLDBInstanceClass db.m4.xlarge 事前定義済み
PostgreSQLDBName awspgdb 事前定義済み
PostgreSQLDBUserName Root 事前定義済み
PostgreSQLDBPassword Rootroot123 事前定義済み
PostgreSQLDBAllocatedStorage 500 GB 事前定義済み
KeyName 既存の EC2 キーペアの名前を指定する 手動エントリ
ClientIP ローカルマシンから RDS および EC2 インスタンスへの接続に使用する IP アドレスの範囲を指定します。これは、x.x.x.x/x という形式の有効な IP CIDR 範囲でなければなりません。checkip.amazonaws.com または whatsmyip.org を使用してアドレスを入手してください。 手動エントリ
DataLoadingIntoOracleEC2InstanceType m4.xlarge 事前定義済み
Ora2PGEC2InstanceType m4.4xlarge 事前定義済み

テンプレートの詳細を指定したら、[次へ] を選択します。[オプション] ページで、[次へ] をもう一度選択します。[レビュー] ページで、[作成] を選択します。

先のテンプレートの出力は次のとおりです。

Key Value
StackName Name
VPCID Vpc-xxxxxxx
Regionname AWS リージョン – 「us-east-1」と表示されていることを確認してください
SourceRDSOracleEndPoint ソース RDS for Oracle エンドポイント
TargetRDSPostgreSQLEndPoint ターゲット RDS for PostgreSQL エンドポイント
EC2InstanceForOra2PgInstanceId Ora2pg ツールをインストールして設定する 2 番目の EC2 インスタンスのインスタンス ID
EC2InstanceForOra2PgAvailabilityZone この EC2 インスタンスが作成されるアベイラビリティゾーン
EC2InstanceForOra2PgPublicDNS Ora2pg ツールをインストールして設定する、2 番目の EC2 インスタンスのパブリック DNS アドレス
EC2InstanceForSourceDataLoadingInstanceId 最初の EC2 インスタンスのインスタンス ID。このインスタンスを使用して、ソース RDS for Oracle データベースにテストデータをロードし、Ora2pg で初期ロードが実行されている間にデータのロードをシミュレートします。
EC2InstanceForSourceDataLoadingPublicDNS 最初の EC2 インスタンスのパブリック DNS アドレス
EC2InstanceForSourceDataLoadingAZ us-east-1a – この EC2 インスタンスを作成する必要があるアベイラビリティゾーン。VPC に対応するサブネットを選択します。
SubnetID1A アベイラビリティゾーン 1A で作成されたサブネットの ID
SubnetID1B アベイラビリティゾーン 1B で作成されたサブネットのID

デプロイが完了するまでに約 15〜16 分かかります。スタックの起動が完了すると、作成されたリソースに関する情報が出力されます。この情報を次のステップで使用するので、出力のメモをとっておいてください。AWS マネジメントコンソールで、または次の AWS CLI コマンドを使用して、スタック出力を表示できます。

$ aws cloudformation describe-stacks --stack-name <stack_name> --region us-east-1 --query 'Stacks[0].Outputs'

2.最初の EC2 インスタンスを設定する

次に、Amazon RDS for Oracle データベースにテストデータをロードするための最初の EC2 インスタンスを設定します。この EC2 インスタンスのタグ名は、Ora2pg-blog-EC2InstanceFor-SourceDataLoading です。この設定では、次の操作を行います。

  1. Oracle インスタントクライアント .rpm ファイルを、Oracle ウェブサイトの Linux x86-64 (64-bit) の Instant Client ダウンロードページから、CloudFormation テンプレートを使用して作成した最初の EC2 インスタンスにダウンロードします。ダウンロードプロセスでは、自分の OTN ネットワークにログインし、使用許諾契約書に同意する必要があります。ダウンロードするファイルは、oracle-instantclient12.2-tools-12.2.0.1.0-1.x86_64.rpm、oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm、および oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm です。この最初の EC2 インスタンスでは、12.2 バージョンの Oracle クライアント .rpm ファイルをダウンロードしていることを確認してください。12.2 バージョンのクライアントには Oracle SQL ローダーツール sqlldr が付属しているからです。
  2. .rpm ファイルを、最初の Amazon EC2 インスタンス (タグ名が Ora2pg-blog-EC2InstanceFor-SourceDataLoading のインスタンス) の /tmp ディレクトリにコピーします。このインスタンスはテストデータをロードするためのものです。CloudFormation テンプレートの出力テーブルのキー EC2InstanceForSourceDataLoadingPublicDNS を参照することによって、EC2 インスタンスのパブリック DNS 値を取得できます。場合によっては、Secure Shell (SSH) を使用してクラスタに接続できない場合もあるかもしれません。その場合は、クラスタのセキュリティグループを調べて、クライアントの IP アドレスからインバウンド SSH 接続が行える (TCP ポート 22 経由で) ことを確認します。
  3. aws configure を使用して AWS CLI を設定するには、AWS CLI Getting Started のトピックに記載されている手順に従ってください。この設定のユーザーは、ec2-user にする必要があります。
    ec2-user@ip-172-31-2-77 tmp]$ aws configure
    AWS アクセスキー ID [None]: XXXXXXXXXXXXXXXXXXXXX
    AWS シークレットアクセスキー [None]: xxxxxxxxxxxxxxxxxxxxxxxxx
    デフォルトのリージョン名 [None]: us-east-1
    デフォルトの出力形式 [None]:
  4. Amazon S3 バケット setting_oracle_client_host.sh からラッパースクリプトをダウンロードします。ユーザー ec2-user として、次のコマンドを実行して設定のためのスクリプトをダウンロードします。
    cd; aws s3 cp s3://aws-bigdata-blog/artifacts/awsora2pgblogfiles/data-loading/scripts/setting_oracle_client_host.sh . 
  5. 次のコマンドを使用してスクリプトを実行します。
    cd; sh -x ./setting_oracle_client_host.sh <RDS_ORACLE_END_POINT> <EC2_INSTANCE_AVAILABILTY_ZONE> <DB_NAME>

    ポート番号とコロンなしで、前に作成した Amazon RDS for Oracle エンドポイントを指定します。アベイラビリティゾーンには、us-east-1a と、RDS for Oracle スナップショットを復元するときに選択したデータベース名も指定します。次に例を示します。

    cd; sh -x ./setting_oracle_client_host.sh awsorains.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com us-east-1a AWSORA

    ラッパースクリプトを実行すると、テーブルの作成に必要な追加のスクリプト、sqlldr 制御ファイルなどもダウンロードされます。さらに、Amazon EBS ボリュームを接続し、/local/mnt6 にマウントされます。EBS ボリュームには、Ora2pg ジョブの実行中に ソース RDS for Oracle データベースに行をロードするために必要な CLOB ファイルが含まれています。また、このスクリプトを使用すると、ソース RDS for Oracle データベースのアーカイブログモードと補足ログを有効にすることができます。注意: スクリプトの実行が完了すると、ボリュームのサイズが 25 GB のディスクがマウントされます。このディスクには、テストデータをロードするためのデータセットを生成するために必要なファイルが含まれています。コマンド df -hを実行することで、これを確認することができます。エクササイズの最後にクリーンアップすると、この EBS ボリュームが手動で削除されます。

3.2 番目の EC2 インスタンスを設定する

次に、2 番目の Amazon EC2 インスタンスに Ora2pg ツールをインストールして構成します。この EC2 インスタンスには、タグ名 Ora2pg-blog-EC2InstanceFor-Ora2pg-Configuration があります。

Ora2pg をインストールするには、Oracle インスタントクライアント、Comprehensive Perl Archive Network (CPAN)、Perl-DBI モジュール、Perl-YAML モジュール、および PostgreSQL クライアント (psql 接続のテスト用) を設定する必要があります。これらを設定するために、スクリプトを提供しています。これらのスクリプトは、PostgreSQL データベースにスキーマ、ユーザ、ロールも作成します。

Instant Client Downloads for Linux x86-64 (64-bit) ページから Oracle インスタントクライアント .rpm ファイルをダウンロードします。ダウンロードプロセスでは、自分の OTN ネットワークにログインする必要があります。ダウンロードするファイルは、oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm、oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm、および oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm です。ダウンロードする .rpm ファイルは 11.2.0.4 バージョンであることを確認してください。

この設定では、次の操作を行います。

  1. Oracle クライアント .rpm ファイルを、CloudFormation テンプレートを使用して作成した 2 番目の Amazon EC2 インスタンスの /tmp ディレクトリにコピーします。前のテンプレート出力テーブルのキー EC2InstanceForOra2PgPublicDNS を参照して、2 番目の EC2 インスタンスのパブリック DNS 値を取得できます。
  2. aws configure を使用して AWS CLI を設定するには、AWS CLI Getting Started に記載されている手順に従ってください。この設定のユーザーは、ec2-userにする必要があります。
    [ec2-user@ip-172-31-2-77 tmp]$ aws configure
    AWS アクセスキー ID [None]: XXXXXXXXXXXXXXXXXXXXX
    AWS シークレットアクセスキー [None]: xxxxxxxxxxxxxxxxxxxxxxxxx
    デフォルトのリージョン名 [None]: us-east-1
    デフォルトの出力形式 [None]:
  3. Amazon S3 から Ora2pg 設定スクリプトをダウンロードします。スクリプト名は、setting_ora2pg_host_step1.sh および setting_ora2pg_host_step2.sh です。setting_ora2pg_host_step1.sh。setting_ora2pg_host_step1.sh スクリプトは、Oracle 11.2 クライアントの .rpm ファイルをインストールし、Oracle 環境変数を設定し、PERL-CPAN リポジトリ、Perl Database Interface (PERL-DBI)、Perl-Yaml モジュール、PostgreSQL クライアント、および Perl DBD::Pg モジュールをインストールします。これらは、Ora2pg ソフトウェアの正常な設定に必要です。setting_ora2pg_host_step2.sh スクリプトは、GitHub から Ora2pg バージョン 18.1 をダウンロードしてインストールします。次に、ソースとターゲットへのデータベース接続をチェックし、各テーブル用の Ora2pg 設定ファイルを作成し、ターゲットスキーマ構造を生成します。ユーザとロールを作成し、RDS for PostgreSQL データベースにスキーマ構造を作成します。その後、最新の Oracle システム変更番号 (SCN) を取得し、ミリ秒単位の Unix 時間に変換します。Unix 時間は、DMS タスクを作成するときに CDC 開始時刻の値として使用します。最後に、スクリプトは、ソース RDS for Oracle テーブルのデータをターゲットRDS for PostgreSQL データベースにコピーします。
    ec2-user ユーザーとして、次のコマンドを実行して 2 つのスクリプトをダウンロードし、Ora2pg ツールを設定します。

    cd; aws s3 cp s3://aws-bigdata-blog/artifacts/awsora2pgblogfiles/data-loading/scripts/setting_ora2pg_host_step1.sh .
    cd; aws s3 cp s3://aws-bigdata-blog/artifacts/awsora2pgblogfiles/data-loading/scripts/setting_ora2pg_host_step2.sh .
  4. 次のコマンドを使用して最初のスクリプトを実行し、これらのパラメータをスクリプトに渡します。
    • 前に作成した RDS for Oracle データベースエンドポイント。この値は、最初の CloudFormation テンプレートの出力セクションから取得します。
    • RDS for Oracle データベースの復元の一部として選択した Amazon RDS for Oracle DB 名。
    cd; 
    chmod 755 setting_ora2pg_host_step1.sh
    ./setting_ora2pg_host_step1.sh <RDS_ORACLE_END_POINT> <ORA_DB_NAME> 

    次に例を示します。

    ./setting_ora2pg_host_step1.sh awsorains.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com AWSORA

    awsorains.xxxxxxxxxxx.us-east-1.rds.amazonaws.com を正しい RDS for Oracle エンドポイントに変更します。

  5. CPAN Test::MoreDBD::Pg、およびDBD::Oracle モジュールを取得し、以下で示すようにインストールしてコンパイルします。DBD::Oracle および DBD::Pg モジュールは、ソース RDS for Oracle インスタンスおよび RDS for PostgreSQL インスタンスへのアクセスを提供するためにデータベースインターフェイス (DBI) インスタンスと作用する、Perl モジュールです。Oracle および Pg モジュールを正常にインストールするには、Test::More が必要です。これらのモジュールをインストールしてコンパイルするには、次のコマンドを実行します。
    1. Unix シェルプロンプトでコマンド cpan を実行します。最初に cpan コマンドを実行すると、いくつかの質問に答えるように求められます。キーボードの [Enter] キーを押してデフォルト値を受け入れます。cpan が設定されると、cpan シェルに移動します。cpan シェルで、次のコマンドを実行します。
      look Test::More

      このコマンドは、DBD::Pg および DBD::Oracle のインストールに必要な Test::More モジュールをインストールします。このコマンドが正常に実行されると、 cpan シェルを終了し、Unix シェルプロンプトに移動します。そのプロンプトで、次のコマンドを実行してモジュールを構築します。

      perl Makefile.PL
      sudo make
      sudo make install
      

      これらのコマンドが完了したら、cpan シェルを完全に終了するまで exit コマンドを必要な回数実行してシェルを終了します。

    2. cpan プロンプトで次のコマンドを使用して、DBD::Pg モジュールをインストールします。
      1. cpan コマンドを使用して cpan シェルにログインします。
      2. cpan プロンプトでコマンド look DBD::Pg を実行します。このコマンドを実行すると、Unix シェルプロンプトに戻ります。
      3. そのプロンプトで、コマンド perl Makefile.PL を実行します。
      4. 次に、コマンド sudo make を実行します。このコマンドを実行すると、次のような警告メッセージが表示されることがあります。
        “/usr/lib64/perl5/vendor_perl/auto/DBI/DBIXS.h:491:25: warning: ‘dbi_get_state’ defined but not used [-Wunused-function]” 

        このメッセージは無視してください。

      5. コマンド sudo make install を実行します。
      6. このコマンドが完了したら、exit コマンドを実行してシェルを終了します。
    3. cpan プロンプトで次のコマンドを使用して、DBD::Oracleモジュールをインストールします。
      1. cpan コマンドを使用して cpan シェルにログインします
      2. cpan プロンプトでコマンド look DBD::Oracle を実行します。このコマンドを実行すると、Unix シェルプロンプトに戻ります。
      3. そのプロンプトで、コマンド perl Makefile.PL を実行します。
      4. 次に、コマンド sudo make を実行します。このコマンドを実行すると、警告メッセージが表示されることがあります。このメッセージは無視してください。
      5. コマンド sudo make install を実行します。
      6. このコマンドが完了したら、cpan シェルを完全に終了するまで exit コマンドを必要な回数実行してシェルを終了します。
    4. 以下で示すように 2 番目のスクリプトを実行します。2 番目のスクリプトに進む前に、最初のスクリプトを完了していることを確認してください。まず、次のコマンドを実行します。
      cd; 
      chmod 755 setting_ora2pg_host_step2.sh
      ./setting_ora2pg_host_step2.sh <RDS_ORACLE_END_POINT> <ORA_DB_NAME> <PG_RDS_END_POINT> <PG_MASTER_USERNAME> <PG_MASTER_PASSWORD> <PG_DATABASE_NAME> <PG_MIGRATION_USER> <PG_MIGRATION_PASSWORD> <PG_MIGRATION_SCHEMA> <PG_CONTROL_SCHEMA> 

      このスクリプトに渡すパラメータについては、次のテーブルで説明します。

        スクリプトパラメータ コメント
      1 <RDS_ORACLE_END_POINT> awsorains.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com ソース RDS for Oracle データベースのエンドポイント。この値を適切なエンドポイントに変更します。
      2 <ORA_DB_NAME> AWSORA ソース RDS for Oracle データベースのデータベース名。この値は、データベースの復元の一部として提供されました。
      3 <PG_RDS_END_POINT> awspgins.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com PostgreSQL エンドポイントのターゲット RDS。この値を適切なエンドポイントに変更します。
      4 <PG_MASTER_USERNAME> root RDS for PostgreSQL データベース作成の一部として選択した管理者ユーザー名。
      5 <PG_MASTER_PASSWORD> Rootroot123 RDS for PostgreSQL データベース作成の一部として選択した管理者ユーザーのパスワード。
      6 <PG_DATABASE_NAME> awspgdb RDS for PostgreSQL データベース作成の一部として選択したデータベース名。
      7 <PG_MIGRATION_USER> miguser PostgreSQL データベースで作成され、データの移行に使用するユーザー名。
      8 <PG_MIGRATION_PASSWORD> migpasswd 移行ユーザーのパスワード。
      9 <PG_MIGRATION_SCHEMA> awspgschema PostgreSQL データベースで作成されたスキーマの名前。すべてのテーブルがこのスキーマに移行されます。スキーマ名には小文字を使用してください。
      10 <PG_CONTROL_SCHEMA> awspgctrlschema PostgreSQL データベースで作成された制御スキーマの名前。このスキーマ名は、AWS DMS セットアップの一部として作成される制御テーブルにより使用されます。制御スキーマ名には小文字を使用してください。

      次に例を示します。

      ./setting_ora2pg_host_step2.sh awsorains.xxxxxx.us-east-1.rds.amazonaws.com AWSORA awspgins.xxxxxx.us-east-1.rds.amazonaws.com root Rootroot123 awspgdb miguser migpasswd awspgschema awspgctrlschema

      スクリプトを実行すると、最後に nohup モードで Ora2pg ジョブが実行されます (バックグラウンドで実行されます)。プログラムを終了するには、キーボードの [Enter] キーを押してください。

      注意: 2 番目のスクリプトは、RDS for PostgreSQL データベースにスキーマと必須テーブルを作成します。また、ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへのデータコピーを開始します。Ora2pg を使用してデータをコピーする前に、RDS for Oracle データベースから最新の SCN 番号とタイムスタンプを取得します。この情報は、DMS タスクを開始するときに必要になります。この情報は、この EC2 インスタンスの ec2-user ユーザーのホームディレクトリにある名前 scn_information_from_source.out を持つファイルに保存されます。EC2 インスタンスは、タグ名 Ora2pg-blog-EC2InstanceFor-Ora2pg-Configuration を持つインスタンスです。

      このログファイルの出力例は次のとおりです。

      -bash-4.2$ cat scn_information_from_source.out
      ||******************************* Current SCN Number from RDS Oracle is : 666311 ***********||
      ||************Timestamp value after subtracting 15 minutes is : 2018-04-18 16:58:43 *******||
      ||******************************************************************************************||
      ||******************************************************************************************||
      ||********* TIME STAMP VALUE IN MILLISECONDS TO USE FOR DMS TASKS IS  : 1524070723000 ******||
      ||******************************************************************************************||
      CUSTOMER TABLE COPY PID IS : 6933
      PART TABLE COPY PID IS : 6934
      SUPPLIER TABLE COPY PID IS : 6935
      REGION AND NATION TABLE COPY PID IS : 6935
      -bash-4.2$

      このスクリプトは、CUSTOMER、PART、および SUPPLIER テーブルの 4 つの独立した Ora2pg ジョブまたはタスクを実行するのに加えて、REGION と NATION テーブルの単一のジョブを実行します。これらのジョブは、nohup モードで実行されます (バックグラウンドで実行されます)。

      CUSTOMER および PART テーブルにはそれぞれ CLOB データ列があります。データをターゲット RDS for PostgreSQL データベースに移行する際、SUPPLIER および CUSTOMER テーブルにさらに多くのトランザクションをロードし、これらのテーブルに対して別々のジョブを実行することをシミュレートします。その PART テーブルには CLOB 列があるため、このテーブルに対して別のジョブも実行します。NATION および REGION テーブルには新しい挿入がないので、それらを単一の Ora2pg ジョブにグループ化します。

      これらの別々のジョブについては、別々のログファイルを生成します。ログファイル名は、ora2pg_aws_rds_oracle_to_pg_customer_blog.outora2pg_aws_rds_oracle_to_pg_part_blog.outora2pg_aws_rds_oracle_to_pg_region_nation_blog.out、および ora2pg_aws_rds_oracle_to_pg_supplier_blog.out です。これらはホームディレクトリに格納されます。

      このテストでは、このスクリプトの実行に約 1 時間 20 分かかりました。スクリプトの実行中に、これらのログファイルをチェックして、コピーがまだ実行中かどうかを確認できます。スクリプトが完了すると、次のようなメッセージが表示されます。5080.91user 55.69system 1:18:57elapsed。ソース RDS for Oracle データベースからターゲット PostgreSQL データベースにコピーする CLOB 列データがあるため、CUSTOMER および PART テーブルのジョブは完了するまでに時間がかかります。

4.ソース Oracle データベースに新しいデータをロードする

ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへのコピーが開始されたら、ソース RDS for Oracle データベースへの新しいデータのロードをシミュレートします。

  1. テストデータをロードするため、タグ名 Ora2pg-blog-EC2InstanceFor-SourceDataLoading を使用して最初の Amazon EC2 インスタンスにログインします。CloudFormation テンプレートの出力テーブルのキー、EC2InstanceForSourceDataLoadingPublicDNS を参照することによって、EC2 インスタンスのパブリック DNS 値を取得できます。
  2. 新しいデータを CUSTOMER テーブルにロードするには、次のコマンドを実行します。このコマンドは、ソース Oracle データベースの CUSTOMER テーブルに新しい 100 行をロードします。EC2InstanceForSourceDataLoadingPublicDNS インスタンスでこのコマンドを実行してください。
    cd; date; nohup time sh -x /home/ec2-user/data-loading/scripts/load_tables.sh customer /home/ec2-user/data-loading/input-files/customer/customer.tbl.1.100rows awsorauser awsorauser AWSORA > load_tables_customer_tbl.100rows.log &

    ここで、AWSORA は、ソース RDS for Oracle データベースで作成されたデータベースの名前です。

  3. 新しいデータを SUPPLIER テーブルにロードするには、次のコマンドを実行します。このコマンドにより、追加の 1,000,000 行を SUPPLIER テーブルにロードします。最初の EC2 インスタンスでこのコマンドを実行してください。
    cd; date; nohup time sh -x /home/ec2-user/data-loading/scripts/load_tables_supplier.sh supplier /home/ec2-user/data-loading/input-files/supplier/only_supplier_files_tbl.3.lst awsorauser awsorauser AWSORA > only_supplier_files_tbl.2.log &

5.これが存在しない場合は、dms-vpc-role IAM ロールを作成し、IAM ポリシーを追加します

先の CloudFormation テンプレートを使用して AWS::DMS::ReplicationSubnetGroup リソースを作成する際、AWS DMS を過去に使用したことがない AWS アカウントで障害が発生します。この障害は、dms-vpc-role が存在しないために発生するものです。また、dms-vpc-role が存在しないか、正しく構成されていないと、次のステップで CloudFormation スタックの作成に失敗します。

この IAM ロールが存在するかどうかを確認し、存在しない場合は次の AWS CLI コマンドを使用して作成できます。

  1. 次の CLI コマンドを使用して dms-vpc-role IAM ロールが存在するかどうかを確認します。
    aws iam get-role --role-name dms-vpc-role
  2. 存在しない場合は、次の CLI コマンドを使用して dms-vpc-role を作成します。
    aws iam create-role --role-name dms-vpc-role --assume-role-policy-document "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"dms.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"

次に、以下の手順を実行するには、次の CLI コマンドを使用して、AWS 管理ポリシー AmazonDMSVPCManagementRoledms-vpc-role IAM ロールにアタッチします。

aws iam attach-role-policy --role-name dms-vpc-role --policy-arn arn:aws:iam::aws:policy/service-role/AmazonDMSVPCManagementRole

6.AWS DMS ソースおよびターゲットエンドポイントと DMS インスタンスを作成する

この CloudFormation テンプレートを使用して、ソース DMS ソースエンドポイント、ターゲットエンドポイント、および DMS レプリケーションインスタンスをセットアップします。コンソールからテンプレートを直接起動するには、[Launch Stack] ボタンをクリックします。

 

このテンプレートには次のパラメータがあります。パラメータのいくつかはあらかじめ定義されており、編集することはできません。一部のパラメータでは、値を指定する必要があります。テーブルに詳細が示されています。

このパラメータには この 事前定義済みエントリを使用しますか、それとも手動エントリを行いますか?
スタック名 ora2pg-dms-stack-1 など、固有のスタック名を指定します 手動エントリ
DMSInstanceType dms.c4.4xlarge 手動エントリ
SourceRDSOracleEndpointID RDS for Oracle ソースエンドポイントを指定する 手動エントリ
SourceRDSOracleDatabaseName AWSORA 事前定義済み
SourceRDSOracleUserName awsorauser 事前定義済み
SourceRDSOracleDBPassword awsorauser 事前定義済み
SourceRDSOracleDBPort 1521 事前定義済み
TargetRDSPostgreSQLEndpointID RDS for PostgreSQL エンドポイントを指定する 手動エントリ
TargetRDSPostgreSQLDatabaseName awspgdb 事前定義済み
TargetRDSPostgreSQLUserName root 事前定義済み
TargetRDSPostgreSQLDBPassword Rootroot123 事前定義済み
TargetPostgreSQLDBPort 5432 事前定義済み
VPCID 前述の CloudFormation テンプレートで作成された VPC を選択します 手動エントリ
VPCSecurityGroupId 最初の CloudFormation テンプレートを使用して作成されたセキュリティグループの ID を指定します。最初の CloudFormation テンプレートの出力セクションから値を取得できます。 手動エントリ
DMSSubnet1 VPC に対応する最初のサブネット ID を指定しますこのサブネットは、最初の CloudFormation テンプレートの一部として作成されました。最初の CloudFormation テンプレートの出力セクションから値を取得します。 手動エントリ
DMSSubnet2 VPC に対応する第 2 のサブネット ID を指定します。このサブネットは、最初の CloudFormation テンプレートの一部として作成されました。最初の CloudFormation テンプレートの出力セクションから値を取得します。 手動エントリ
DMSCDCTaskStartTime Ora2pg ツールのフルコピーから生成された scn_information_from_source.out ログファイルのタイムスタンプ値の 15 分前に CDC 開始時刻を指定します。この時間は次の形式でなければなりません: YYYY-MM-DD HH:MI:SS 手動エントリ

テンプレートの詳細を指定したら、[次へ] を選択します。[オプション] ページで、[次へ] をもう一度選択します。[レビュー] ページで、[AWS CloudFormation がカスタム名で IAM リソースを作成する可能性があることを確認します] チェックボックスをオンにして、[作成] を選択します。

スタックの起動が完了すると、作成されたリソースに関する情報が出力されます。この情報を次のステップで使用するので、出力のメモをとっておいてください。AWS マネジメントコンソールで、または次の AWS CLI コマンドを使用して、スタック出力を表示できます。

$ aws cloudformation describe-stacks --stack-name <stack_name> --region us-east-1 --query 'Stacks[0].Outputs'

先のテンプレートの出力は次のとおりです。

Key Value
DMSRepulicationInstance Name
DMSPostgreSQLEndpoint us-east1
DMSOracleEndpoint Oracle エンドポイントの出力

7.スクリプトが完了したことを確認する

レプリケーションを続行する前に、まず setting_ora2pg_host_step2.sh スクリプトが完了していることを確認してください。

これを確認するには、ログファイル ora2pg_aws_rds_oracle_to_pg_part_blog.outora2pg_aws_rds_oracle_to_pg_customer_blog.out を確認します。これらのファイルは、最初の CloudFormation テンプレートを使用して作成された識別子 EC2InstanceForOra2PgPublicDNS を持つ EC2 インスタンスにあります。スクリプトが完了すると、ログファイルの最後に 5080.91user 55.69system 1:18:57 elapsed のようなメッセージが表示されます。

また、スクリプトがターゲット RDS for PostgreSQL データベースにコピーした行数を確認することで、これを検証することもできます。行数を確認するには、次のコマンドを実行して EC2InstanceForOra2PgPublicDNS インスタンスから PostgreSQL データベースに接続します。

  1. 次のコマンドで PostgreSQL データベースに接続します。
    psql --host=<RDS_Postgresql_EndPoint> --port=5432 --username=root --password --dbname=awspgdb

    このコマンドでは、<RDS_Postgresql_EndPoint> の値を正しい RDS for PostgreSQL エンドポイントに変更します。ルートユーザーのパスワードを入力するよう促されたら、Rootroot123 を入力します。

  2. ログインしたら、次のコマンドを使用してスキーマのパスを変更します。
    SET search_path = awspgschema;
  3. 次の選択コマンドを実行して、PostgreSQL データベースの行数を確認します。
    select count(*) from customer;
    select count(*) from part;

    ソース RDS for Oracle データベースの CUSTOMER および PART テーブルから 5000 行をターゲット RDS for PostgreSQL へ移行したため、CUSTOMER および PART の表に 5000 と表示されているはずです。

  4. psql シェルを終了するには、\q コマンドを使用します。

8.レプリケーションを有効にするために CDC を使用して DMS タスクを作成する

RDS for Oracle から RDS for PostgreSQL への最初のデータの移行が完了したので、残りのデータをレプリケートする準備が整い、進行中のレプリケーションを有効にすることができます。そうするには、AWS DMS を CDC オプションとともに使用します。移行プロセスを 4 つのタスクに分けたので、ソース RDS for Oracle データベースの変更を ターゲット RDS for PostgreSQL データベースにレプリケートするための 4 つの AWS DMS タスクを作成します。

タスクを作成する前に、エンドポイントを使用して DMS レプリケーションインスタンスからソースおよびターゲット RDS データベースへの接続をテストしてください。これを行うには、まず、DMS コンソールの [エンドポイント] セクションに移動し、ソースエンドポイントを選択したら、[接続のテスト] を選択します。次に、リストから正しいレプリケーションインスタンスを選択し、[テストの実行] を選択します。次に、[エンドポイント] セクションに戻って、ターゲットエンドポイントを選択したら、[接続のテスト] を選択します。同じ手順に従って、両方の接続が正常に行われていることを確認します。

次に、この CloudFormation テンプレートを使用して、ソース DMS タスクをセットアップします。コンソールから直接起動するには、次の [Launch Stack] ボタンをクリックします。

 

このテンプレートには次のパラメータがあります。パラメータのいくつかはあらかじめ定義されており、編集することはできません。一部のパラメータでは、値を指定する必要があります。テーブルに詳細が示されています。

このパラメータには この 事前定義済みエントリを使用しますか、それとも手動エントリを行いますか?
DMSCDCTaskStartTimeInMilliSeconds scn_information_from_source.out ログファイルの出力からタイムスタンプ値を指定します。 手動エントリ
DMSRepulicationInstanceARN レプリケーションインスタンスの Amazon リソースネーム (ARN) を指定します。前のテンプレートの出力からこの値を取得できます。 手動エントリ
DMSSourceOracleEndpointARN DMS ソース Oracle インスタンスのエンドポイント ARN を指定します。前のテンプレートの出力からこの値を取得できます。 手動エントリ
DMSTargetSPostgreSQLEndpointARN PostgreSQL エンドポイントのエンドポイント ARN を指定します。前のテンプレートの出力からこの値を取得できます。 手動エントリ

テンプレートの詳細を指定したら、[次へ] を選択します。[オプション] ページで、[次へ] をもう一度選択します。[レビュー] ページで、[作成] を選択します。

先の CloudFormation テンプレートでタスクを作成すると、Ready 状態になります。スタックの起動が完了したら、DMS タスクを手動で開始します。

これを行うには、DMS コンソールにサインインし、タスクページに移動します。一度に 1 つのタスクを選択し、それぞれに対して [開始/再開] を選択します。これにより、指定された時刻から、ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへの変更データキャプチャが開始されます。

現実のシナリオでは、DMS タスクによりすべてのデータ変更を RDS for PostgreSQL データベースにレプリケートすると、ソース Oracle データベースへのすべての接続が停止します。残りのトランザクションがあれば、それがすべてターゲットデータベースに追いつくのを待ちます。ある場合、DMS コンソールの DMS タスクを停止することができます。

プロセスを終了するには、ターゲットデータベースのトリガー、索引、および外部キー制約を再作成します。PostgreSQL データベースの既存の配列を削除し、Ora2pg を使用して CACHE の値 1 で配列を個別に移行します。データ検証が実行されていることを確認し、PostgreSQL を指すようにアプリケーションを切り替え、再起動します。

移行後のクリーンアップ

このソリューションを完了してテストした後、タスクを停止し CloudFormation スタックを削除してリソースをクリーンアップします。

  1. DMS コンソールに移動し、[タスク] ページに移動して、手動でタスクを 1 つずつ停止します。
  2. CloudFormation ウェブ UI に移動し、スタックを作成したときと逆の順序でスタックを削除します。
  3. このブログ記事の一部として作成した Amazon EBS ボリュームを削除します。
    1. EC2 ウェブコンソールに移動し、Elastic Block Storeで [ボリューム] を選択します。
    2. oracle-client-for-rds-oracle-restored-volume1 という名前の EBS ボリュームを選択します。
    3. [アクション] で、[ボリュームの削除] を選択します。
    4. また、これらのデータベース用に作成した RDS スナップショットも削除します。

結論

この記事では、オープンソースツールの Ora2pg と AWS DMS を使用して、Amazon RDS for Oracle データベースを Amazon RDS for PostgreSQL に移行する方法の概要を説明しました。同様の手順を使用して、オンプレミスの Oracle データベースを Amazon RDS for PostgreSQL データベースまたは Amazon Aurora PostgreSQL データベースへ移行することもできます。これを実現するには、本ブログで示したように、さまざまな方法を使用して初期データのロードを移行し、AWS DMS で使用可能なカスタム CDC 開始時間オプションを使用して残りのデータを移行することができます。切り替えが完了するまで、進行中のレプリケーションを有効にします。


著者について

Srikanth Kodali の写真Srikanth Kodali の写真Srikanth Kodali はアマゾン ウェブ サービスのビッグデータコンサルタントです。 AWS を使用している場合にソリューションの価値を向上させるサポートができるように、AWS の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。