Amazon Web Services ブログ
Ora2pg と AWS DMS を使用して BLOB および CLOB テーブルを Oracle から PostgreSQL に移行する方法
多くの企業は、Oracle データベースを PostgreSQL に移行することを検討しています。プラットフォームと企業間の互換性が高く、またライセンスコストを削減するためです。Amazon RDS for PostgreSQL と Amazon 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
は非常に小さい表です。
移行の概要
この記事では、高いレベルで次のことを行います。
- 2 つのサブネットとセキュリティグループを持つ Amazon VPC に基づいて Virtual Private Cloud (VPC) を作成すること。
- 公開されているスナップショットから Amazon RDS for Oracle データベースをプロビジョニングすること。
- Amazon EC2 インスタンスをプロビジョニングして構成し、Amazon RDS for Oracle データベースにテストデータをロードすること。
- Amazon RDS for PostgreSQL データベースをプロビジョニングすること。
- ソース Oracle データベースでアーカイブログモード、補助ログ、および自動バックアップを有効にすること。
- Ora2Pg ツールをインストールするための Amazon EC2 インスタンスをプロビジョニングすること。
- Ora2Pg ツールをインストールして設定すること。
- 新しいデータをソース Oracle データベースにロードして、変更データキャプチャ (CDC) をテストすること。
- ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへのレプリケーションを有効にするため、CDC を使用して AWS DMS タスクを作成すること。
前提条件および仮定
このエクササイズを実行するには、次のものが必要です。
- Oracle クライアントパッケージをダウンロードする Oracle アカウント。
- AWS のサービスへのアクセスを提供する AWS アカウント。
- AWS CLI を設定するためのアクセスキーとシークレットアクセスキーを持つ AWS Identity and Access Management (IAM) ユーザー。
- テストのため、この投稿で扱うサービスを、
us-east-1
リージョンのus-east-1a
アベイラビリティゾーンに作成する必要があります。
さらに、次のことに注意してください。
- 同じ VPC 内のすべてのサービスを設定して、ネットワーキングの考慮事項を簡素化します。
- ソース RDS for Oracle データベースの定義済みデータベーススキーマ名とパスワードは、いずれも
awsorauser
です。 - Oracle データベースのソース RDS の事前定義されたルートユーザー名は、
admin
です。 - Oracle データベースのソース RDS の事前定義されたルートパスワードは、
admin123
です。 - RDS for PostgreSQL データベースを作成するときは、データベース名、マスターユーザー名、およびスキーマ名に小文字を使用します。
- 重要: 提供される 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 コマンドを使用して、スタック出力を表示できます。
2.最初の EC2 インスタンスを設定する
次に、Amazon RDS for Oracle データベースにテストデータをロードするための最初の EC2 インスタンスを設定します。この EC2 インスタンスのタグ名は、Ora2pg-blog-EC2InstanceFor-SourceDataLoading
です。この設定では、次の操作を行います。
- 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 が付属しているからです。 - .rpm ファイルを、最初の Amazon EC2 インスタンス (タグ名が
Ora2pg-blog-EC2InstanceFor-SourceDataLoading
のインスタンス) の /tmp ディレクトリにコピーします。このインスタンスはテストデータをロードするためのものです。CloudFormation テンプレートの出力テーブルのキーEC2InstanceForSourceDataLoadingPublicDNS
を参照することによって、EC2 インスタンスのパブリック DNS 値を取得できます。場合によっては、Secure Shell (SSH) を使用してクラスタに接続できない場合もあるかもしれません。その場合は、クラスタのセキュリティグループを調べて、クライアントの IP アドレスからインバウンド SSH 接続が行える (TCP ポート 22 経由で) ことを確認します。 - aws configure を使用して AWS CLI を設定するには、AWS CLI Getting Started のトピックに記載されている手順に従ってください。この設定のユーザーは、
ec2-user
にする必要があります。 - Amazon S3 バケット
setting_oracle_client_host.sh
からラッパースクリプトをダウンロードします。ユーザーec2-user
として、次のコマンドを実行して設定のためのスクリプトをダウンロードします。 - 次のコマンドを使用してスクリプトを実行します。
ポート番号とコロンなしで、前に作成した Amazon RDS for Oracle エンドポイントを指定します。アベイラビリティゾーンには、
us-east-1a
と、RDS for Oracle スナップショットを復元するときに選択したデータベース名も指定します。次に例を示します。ラッパースクリプトを実行すると、テーブルの作成に必要な追加のスクリプト、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 バージョンであることを確認してください。
この設定では、次の操作を行います。
- Oracle クライアント .rpm ファイルを、CloudFormation テンプレートを使用して作成した 2 番目の Amazon EC2 インスタンスの /tmp ディレクトリにコピーします。前のテンプレート出力テーブルのキー
EC2InstanceForOra2PgPublicDNS
を参照して、2 番目の EC2 インスタンスのパブリック DNS 値を取得できます。 aws configure
を使用して AWS CLI を設定するには、AWS CLI Getting Started に記載されている手順に従ってください。この設定のユーザーは、ec2-user
にする必要があります。- 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 ツールを設定します。 - 次のコマンドを使用して最初のスクリプトを実行し、これらのパラメータをスクリプトに渡します。
- 前に作成した RDS for Oracle データベースエンドポイント。この値は、最初の CloudFormation テンプレートの出力セクションから取得します。
- RDS for Oracle データベースの復元の一部として選択した Amazon RDS for Oracle DB 名。
次に例を示します。
awsorains.xxxxxxxxxxx.us-east-1.rds.amazonaws.com
を正しい RDS for Oracle エンドポイントに変更します。 CPAN Test::More
、DBD::Pg
、およびDBD::Oracle
モジュールを取得し、以下で示すようにインストールしてコンパイルします。DBD::Oracle
およびDBD::Pg
モジュールは、ソース RDS for Oracle インスタンスおよび RDS for PostgreSQL インスタンスへのアクセスを提供するためにデータベースインターフェイス (DBI) インスタンスと作用する、Perl モジュールです。Oracle および Pg モジュールを正常にインストールするには、Test::More
が必要です。これらのモジュールをインストールしてコンパイルするには、次のコマンドを実行します。- Unix シェルプロンプトでコマンド
cpan
を実行します。最初にcpan
コマンドを実行すると、いくつかの質問に答えるように求められます。キーボードの [Enter] キーを押してデフォルト値を受け入れます。cpan
が設定されると、cpan シェルに移動します。cpan シェルで、次のコマンドを実行します。このコマンドは、
DBD::Pg
およびDBD::Oracle
のインストールに必要なTest::More
モジュールをインストールします。このコマンドが正常に実行されると、 cpan シェルを終了し、Unix シェルプロンプトに移動します。そのプロンプトで、次のコマンドを実行してモジュールを構築します。これらのコマンドが完了したら、cpan シェルを完全に終了するまで
exit
コマンドを必要な回数実行してシェルを終了します。 - cpan プロンプトで次のコマンドを使用して、
DBD::Pg
モジュールをインストールします。cpan
コマンドを使用して cpan シェルにログインします。- cpan プロンプトでコマンド
look DBD::Pg
を実行します。このコマンドを実行すると、Unix シェルプロンプトに戻ります。 - そのプロンプトで、コマンド
perl Makefile.PL
を実行します。 - 次に、コマンド
sudo make
を実行します。このコマンドを実行すると、次のような警告メッセージが表示されることがあります。このメッセージは無視してください。
- コマンド
sudo make install
を実行します。 - このコマンドが完了したら、
exit
コマンドを実行してシェルを終了します。
- cpan プロンプトで次のコマンドを使用して、
DBD::Oracle
モジュールをインストールします。cpan
コマンドを使用して cpan シェルにログインします- cpan プロンプトでコマンド
look DBD::Oracle
を実行します。このコマンドを実行すると、Unix シェルプロンプトに戻ります。 - そのプロンプトで、コマンド
perl Makefile.PL
を実行します。 - 次に、コマンド
sudo make
を実行します。このコマンドを実行すると、警告メッセージが表示されることがあります。このメッセージは無視してください。 - コマンド
sudo make install
を実行します。 - このコマンドが完了したら、cpan シェルを完全に終了するまで
exit
コマンドを必要な回数実行してシェルを終了します。
- 以下で示すように 2 番目のスクリプトを実行します。2 番目のスクリプトに進む前に、最初のスクリプトを完了していることを確認してください。まず、次のコマンドを実行します。
このスクリプトに渡すパラメータについては、次のテーブルで説明します。
スクリプトパラメータ 値 コメント 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 セットアップの一部として作成される制御テーブルにより使用されます。制御スキーマ名には小文字を使用してください。 次に例を示します。
スクリプトを実行すると、最後に
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
を持つインスタンスです。このログファイルの出力例は次のとおりです。
このスクリプトは、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.out
、ora2pg_aws_rds_oracle_to_pg_part_blog.out
、ora2pg_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
テーブルのジョブは完了するまでに時間がかかります。
- Unix シェルプロンプトでコマンド
4.ソース Oracle データベースに新しいデータをロードする
ソース RDS for Oracle データベースからターゲット RDS for PostgreSQL データベースへのコピーが開始されたら、ソース RDS for Oracle データベースへの新しいデータのロードをシミュレートします。
- テストデータをロードするため、タグ名
Ora2pg-blog-EC2InstanceFor-SourceDataLoading
を使用して最初の Amazon EC2 インスタンスにログインします。CloudFormation テンプレートの出力テーブルのキー、EC2InstanceForSourceDataLoadingPublicDNS
を参照することによって、EC2 インスタンスのパブリック DNS 値を取得できます。 - 新しいデータを
CUSTOMER
テーブルにロードするには、次のコマンドを実行します。このコマンドは、ソース Oracle データベースのCUSTOMER
テーブルに新しい 100 行をロードします。EC2InstanceForSourceDataLoadingPublicDNS
インスタンスでこのコマンドを実行してください。ここで、AWSORA は、ソース RDS for Oracle データベースで作成されたデータベースの名前です。
- 新しいデータを
SUPPLIER
テーブルにロードするには、次のコマンドを実行します。このコマンドにより、追加の 1,000,000 行を SUPPLIER テーブルにロードします。最初の EC2 インスタンスでこのコマンドを実行してください。
5.これが存在しない場合は、dms-vpc-role IAM ロールを作成し、IAM ポリシーを追加します
先の CloudFormation テンプレートを使用して AWS::DMS::ReplicationSubnetGroup
リソースを作成する際、AWS DMS を過去に使用したことがない AWS アカウントで障害が発生します。この障害は、dms-vpc-role
が存在しないために発生するものです。また、dms-vpc-role
が存在しないか、正しく構成されていないと、次のステップで CloudFormation スタックの作成に失敗します。
この IAM ロールが存在するかどうかを確認し、存在しない場合は次の AWS CLI コマンドを使用して作成できます。
- 次の CLI コマンドを使用して
dms-vpc-role
IAM ロールが存在するかどうかを確認します。 - 存在しない場合は、次の CLI コマンドを使用して
dms-vpc-role
を作成します。
次に、以下の手順を実行するには、次の CLI コマンドを使用して、AWS 管理ポリシー AmazonDMSVPCManagementRole
を dms-vpc-role
IAM ロールにアタッチします。
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 コマンドを使用して、スタック出力を表示できます。
先のテンプレートの出力は次のとおりです。
Key | Value |
DMSRepulicationInstance | Name |
DMSPostgreSQLEndpoint | us-east1 |
DMSOracleEndpoint | Oracle エンドポイントの出力 |
7.スクリプトが完了したことを確認する
レプリケーションを続行する前に、まず setting_ora2pg_host_step2.sh
スクリプトが完了していることを確認してください。
これを確認するには、ログファイル ora2pg_aws_rds_oracle_to_pg_part_blog.out
と ora2pg_aws_rds_oracle_to_pg_customer_blog.out
を確認します。これらのファイルは、最初の CloudFormation テンプレートを使用して作成された識別子 EC2InstanceForOra2PgPublicDNS
を持つ EC2 インスタンスにあります。スクリプトが完了すると、ログファイルの最後に 5080.91user 55.69system 1:18:57 elapsed
のようなメッセージが表示されます。
また、スクリプトがターゲット RDS for PostgreSQL データベースにコピーした行数を確認することで、これを検証することもできます。行数を確認するには、次のコマンドを実行して EC2InstanceForOra2PgPublicDNS
インスタンスから PostgreSQL データベースに接続します。
- 次のコマンドで PostgreSQL データベースに接続します。
このコマンドでは、
<RDS_Postgresql_EndPoint>
の値を正しい RDS for PostgreSQL エンドポイントに変更します。ルートユーザーのパスワードを入力するよう促されたら、Rootroot123
を入力します。 - ログインしたら、次のコマンドを使用してスキーマのパスを変更します。
- 次の選択コマンドを実行して、PostgreSQL データベースの行数を確認します。
ソース RDS for Oracle データベースの
CUSTOMER
およびPART
テーブルから 5000 行をターゲット RDS for PostgreSQL へ移行したため、CUSTOMER
およびPART
の表に 5000 と表示されているはずです。 - 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 スタックを削除してリソースをクリーンアップします。
- DMS コンソールに移動し、[タスク] ページに移動して、手動でタスクを 1 つずつ停止します。
- CloudFormation ウェブ UI に移動し、スタックを作成したときと逆の順序でスタックを削除します。
- このブログ記事の一部として作成した Amazon EBS ボリュームを削除します。
- EC2 ウェブコンソールに移動し、Elastic Block Storeで [ボリューム] を選択します。
oracle-client-for-rds-oracle-restored-volume1
という名前の EBS ボリュームを選択します。- [アクション] で、[ボリュームの削除] を選択します。
- また、これらのデータベース用に作成した 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 の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。