Amazon Web Services ブログ
AWS DMS を使用してほぼゼロのダウンタイムで Oracle データベースを移行する
ダウンタイムを許容できない重要な Oracle OLTP データベースが組織にございますか? 最小限のダウンタイムで、またはダウンタイムなしで Oracle データベースを AWS に移行したいとお考えですか? 24 時間年中無休でアプリケーションとデータベースが利用できることが求められる今日のペースの速い世界では、アプリケーションによっては、オンプレミスデータベースをクラウドに移行する際に大幅なダウンタイムを許容できないものもあるでしょう。
この記事では、AWS Database Migration Service (AWS DMS) とその変更データキャプチャ (CDC) 機能を使用してダウンタイムを最小限に抑えるために、オンプレミスの Oracle データベースを Oracle の Amazon Relational Database Service (RDS) に移行するソリューションについて説明します。
AWS DMS の概要
AWS DMS は、データベースを AWS に移行するのに役立つクラウドサービスです。AWS DMS は、リレーショナルデータベース、データウェアハウス、NoSQL データベース、およびその他の種類のデータストアを AWS クラウドに移行できます。AWS DMS は、異なるデータベースプラットフォーム間の同種および異種の移行をサポートしています。1 回限りの移行を実行し、進行中の変更をレプリケートして、ソースデータベースとターゲットデータベースを継続的に同期することができます。AWS DMS を使用するには、少なくともソースデータベースまたはターゲットデータベースのいずれか 1 つのデータベースエンドが AWS にある必要があります。
AWS DMS のみを使用してデータ変更をレプリケートする場合、AWS DMS がデータベースログから変更の読み取りを開始する時刻またはシステム変更番号 (SCN) を指定する必要があります。AWS DMS がこのような変更にアクセスできるようにするために、ログをサーバー上で一定期間利用できるようにすることが重要です。
LOB の移行
ソースデータベースに大きなバイナリオブジェクト (LOB) があり、それをターゲットデータベースに移行する必要がある場合、AWS DMS は次のオプションを提供します。
- フル LOB モード – AWS DMS は、サイズに関係なく、すべての LOB をソースからターゲットデータベースに移行します。移行は遅くなりますが、利点はデータが切り捨てられないことにあります。パフォーマンスを向上させるには、新しいレプリケーションインスタンスで個別のタスクを作成して、数メガバイトを超える LOB を持つテーブルを移行する必要があります。
- 制限付き LOB モード – LOB 列データの最大サイズを指定します。これにより、AWS DMS はリソースを事前に割り当てて、LOB を一括で適用できます。LOB 列のサイズがタスクで指定されたサイズを超えると、AWS DMS はデータを切り捨て、AWS DMS ログファイルに警告を送信します。LOB データサイズが制限された LOB サイズ内に収まる場合、制限された LOB モードを使用することでパフォーマンスを改善できます。
- インライン LOB モード – 小さい LOB と大きい LOB の両方をレプリケートすることで、データを切り捨てたり、タスクのパフォーマンスを低下させたりせずに LOB を移行できます。最初に、InlineLobMaxSize パラメータの値を指定します。これは、フル LOB モードが true に設定されている場合にのみ使用できます。AWS DMS タスクは小さな LOB をインラインで転送するため、より効率的です。次に、AWS DMS はソーステーブルからルックアップを実行することで大きな LOB を移行します。ただし、インライン LOB モードは、完全なロードフェーズでのみ機能します。
ソリューションの概要
この記事では、オンプレミスデータベースとターゲットデータベースとして Amazon RDS for Oracle データベースを想定して、ソースデータベースとして Amazon EC2 for Oracle DB インスタンスを使用しています。この記事では、Oracle Data Pump を使用して、ソース Oracle データベースからターゲット Amazon RDS for Oracle データベースにデータをエクスポートおよびインポートし、AWS DMS を使用して、ソース Oracle データベースから Amazon RDS for Oracle データベースに CDC の変更をレプリケートします。この記事では、AWS Cloud 環境で Amazon RDS for Oracle データベースをターゲットデータベースとしてすでにプロビジョニングしていることを前提としています。
次の図は、このソリューションのアーキテクチャを示しています。
このソリューションには、以下の手順が含まれます。
- ソースエンドポイントとターゲットエンドポイントを使用して AWS DMS レプリケーションインスタンスをプロビジョニングする
- オンプレミスの Oracle データベースから Oracle Data Pump を使ってスキーマをエクスポートする
- Oracle Data Pump を使用して、Amazon RDS for Oracle データベースにスキーマをインポートする
- CDC を使用して AWS DMS レプリケーションタスクを作成し、ライブレプリケーションを実行する
- ターゲットの Amazon RDS for Oracle データベースでデータベーススキーマを検証する
前提条件
アプリケーションに基づいて、どの Oracle データベーススキーマを Amazon RDS for Oracle データベースに移行するかを決定したら、移行を開始する前に、スキーマサイズ、オブジェクトタイプに基づくオブジェクトの総数、無効なオブジェクトなど、いくつかのスキーマの詳細を収集しておく必要があります。
AWS DMS CDC 機能を使用するには、ソース Oracle データベースでデータベースレベルおよびテーブルレベルのサプリメンタルロギングを有効にします。前提条件を満たしたら、AWS DMS インスタンスをプロビジョニングできます。
AWS DMS インスタンスのプロビジョニング
DMS_instance.yaml AWS CloudFormation テンプレートを使用して、AWS DMS レプリケーションインスタンスとそのソースおよびターゲットエンドポイントをプロビジョニングします。次の手順を完了します。
- AWS マネジメントコンソールの [サービス] で、[CloudFormation] を選択します。
- [スタックの作成] を選択します。
- [テンプレートの指定] では、[テンプレートファイルのアップロード] を選択します。
- [ファイルの選択] をクリックします。
DMS_instance.yaml
ファイルを選択します。- [次へ] を選択します。
- [スタックの詳細の指定] ページで、必要に応じて事前定義されたパラメータを編集します。
- [スタック名] には、スタック名を入力します。
- [AWS DMS インスタンスパラメータ] で、次のパラメータを入力します。
- DMSInstanceType – AWS DMS レプリケーションインスタンスに必要なインスタンスを選択します。
- DMSStorageSize – AWS DMS インスタンスのストレージサイズを入力します。
- ソース Oracle データベース設定で、次のパラメータを入力します。
- SourceOracleEndpointID – Oracle データベースのソースデータベースサーバー名
- SourceOracleDatabaseName – 該当するソースデータベースサービス名または SID
- SourceOracleUserName – ソースデータベースのユーザー名。デフォルトはシステムです
- SourceOracleDBPassword – ソースデータベースのユーザー名のパスワード
- SourceOracleDBPort – ソースデータベースポート
- Target RDS for Oracle データベース設定で、次のパラメータを入力します。
- TargetRDSOracleEndpointID – ターゲット RDS データベースエンドポイント
- TargetRDSOracleDatabaseName – ターゲット RDS データベース名
- TargetRSOracleUserName – ターゲット RDS ユーザー名
- TargetRDSOracleDBPassword – ターゲット RDS パスワード
- TargetOracleDBPort – ターゲット RDS データベースポート
- VPC、サブネット、セキュリティグループの設定で、次のパラメータを入力します。
- VPCID – レプリケーションインスタンスの VPC
- VPCSecurityGroupId – レプリケーションインスタンスの VPC セキュリティグループ
- DMSSubnet1 –アベイラビリティーゾーン 1 のサブネット
- DMSSubnet2 –アベイラビリティーゾーン 2 のサブネット
- [次へ] を選択します。
- [スタックオプションの設定] ページの [タグ] に任意の値を入力します。
- [次へ] を選択します。
- [レビュー] ページで、[AWS CloudFormation がカスタム名で IAM リソースを作成する可能性があることを確認します] のチェックボックスをオンにします。
- [スタックの作成] を選択します。
プロビジョニングは約 5〜10 分で完了します。AWS CloudFormation Stacks コンソールに作成が完了
と表示されたら完了です。 - AWS マネジメントコンソールから、[サービス] を選択します。
- [データベース移行サービス] を選択します。
- [リソース管理] で、[レプリケーションインスタンス] を選択します。
次のスクリーンショットは、出力を確認するために使用できる [レプリケーションインスタンス] ページを示しています。
- [リソース管理] で、[エンドポイント] を選択します。
次のスクリーンショットは、[エンドポイント] ページを示しています。このページでは、ソースとターゲットの両方のエンドポイントを確認できます。
ソースとターゲットのエンドポイントのステータスがアクティブと表示されたら、接続をテストする必要があります。各エンドポイントに対して [テストの実行] を選択して、ステータスが [成功
] と表示されることを確認します。
ソースとターゲットのエンドポイントとともに AWS DMS レプリケーションインスタンスを作成し、エンドポイント接続テストを実行して、それらが正常に接続できることを確認しました。
ソースデータベーススキーマのターゲットデータベースへの移行
Oracle Data Pump を使用して、Oracle データベーススキーマを Amazon RDS for Oracle データベースに移行できるようになりました。Oracle Data Pump は、Oracle データベース間でのデータおよびメタデータの高速移動のためのサーバー側インフラストラクチャを提供します。高性能なデータを移動させることで、データベース管理者が大幅に時間を節約できる大規模なデータベースに最適です。Data Pump は、最大のスループットを実現するために、アンロードとロードの複数のパラレルストリームを自動的に管理します。
データのエクスポート
ソースデータベースがオンラインで、アプリケーションによってアクティブに使用されている場合、ソースオンプレミス Oracle データベースから Oracle Data Pump を使用してデータエクスポートを開始します。また、ソースデータベースから SCN を生成して、データの一貫性を保つためにデータポンプエクスポートで、また変更データキャプチャの開始点として AWS DMS で、SCN を使用する必要があります。
データベーススキーマをエクスポートするには、次の手順を実行します。
- 次の SQL 文を入力して、ソースデータベースから現在の SCN を生成します。
- 生成された SCN を記録して、データをエクスポートするときに、また AWS DMS で使用します。
- スキーマをエクスポートするパラメータファイルを作成します。次のパラメータファイルの内容を参照してください。
expdp
ユーティリティを使用してエクスポートを実行します。次のコードを参照してください。
ダンプファイルをターゲットインスタンスに転送する
Oracle Data Pump エクスポートファイルを Amazon RDS for Oracle インスタンスに転送する方法は複数あります。Oracle DBMS_FILE_TRANSFER
ユーティリティまたは Amazon S3 統合機能を使用して、ファイルを転送できます。
DBMS_FILE_TRANSFER を使用してダンプファイルを転送する
DBMS_FILE_TRANSFER
ユーティリティを使用して、データポンプファイルを RDS インスタンスに直接転送できます。オンプレミスと Amazon RDS for Oracle データベースインスタンスの間にデータベースリンクを作成する必要があります。
次のコードは、ターゲット DB インスタンスの RDS マスターユーザーに接続するデータベースリンク ORARDSDB を作成します。
データベースリンクをテストして、sqlplus を使用して接続できることを確認します。次のコードを参照してください。
ダンプファイルを Amazon RDS for Oracle データベースにコピーするには、デフォルトの DATA_PUMP_DIR ディレクトリを使用するか、次のコードを使用して独自のディレクトリを作成できます。
次のスクリプトは、export_dms_sample_data_01.dmp
という名前のダンプファイルを、orardsdb
という名前のデータベースリンクを使用して、ソースインスタンスからターゲット Oracle RDS for Oracle データベースにコピーします。
上記の PL/SQL プロシージャが完了したら、次のコードを使用して、Amazon RDS for Oracle データベースのデータダンプファイルを直接一覧表示できます。
S3 統合でダンプファイルを転送する
S3 統合により、Oracle Data ダンプファイルを Amazon RDS for Oracle インスタンスに直接転送できます。ソース DB インスタンスからデータをエクスポートした後、データポンプファイルを S3 バケットにアップロードし、S3 バケットから Amazon RDS for Oracle インスタンスにファイルをダウンロードして、インポートを実行できます。この統合機能を使用して、Oracle DB インスタンスの Amazon RDS からオンプレミスのデータベースサーバーにデータダンプファイルを転送することもできます。
Oracle インスタンスの Amazon RDS は、S3 バケットにアクセスし、Amazon RDS for Oracle の S3 統合と S3 と連携できるようにする必要があります。IAM ポリシーと IAM ロールを作成します。IAM ポリシーを GetObject
、ListBucket
、および PutObject
で付与します。IAM ロールを作成し、ロールにポリシーをアタッチします。
Amazon RDS for Oracle の S3 との統合を使用するには、Amazon RDS for Oracle インスタンスを S3_INTEGRATION
オプションを含むオプショングループに関連付ける必要があります。
Amazon RDS オプショングループを作成するには、次の手順を実行します。
- Amazon RDS コンソールの [オプショングループ] で、[作成] を選択します
- [オプショングループ] の詳細の [名前] に、オプショングループの名前を入力します。
この記事ではrds-oracle12r2-option-group
を入力します。 - [説明] には、グループの説明を入力します。
- [エンジン] には、Oracle データベースが移行するターゲット Amazon RDS のエンジンを選択します。
この記事では、[oracle-ee] を選択します。 - メジャーエンジンバージョンでは、エンジンバージョンを選択します。
この記事では、[12.2] を選択します。 - [作成] をクリックします。
オプショングループを作成したら、オプショングループに S3_Integration
オプションを追加する必要があります。次の手順を完了します。
- RDS コンソールで、[オプショングループ] を選択します。
- 作成したグループを選択します。
- [オプションの追加] を選択します。
- [オプション] では、[S3_INTEGRATION] を選択します。
- [バージョン] では、[1.0] を選択します。
- [すぐに適用] では、[はい] を選択します。
- [オプションの追加] を選択します。
S3_Integration
をオプショングループに追加したら、Amazon RDS for Oracle データベースを変更して、新しいオプショングループを使用する必要があります。以下の手順を実行して、オプションデータベースを既存の Amazon RDS for Oracle データベースに追加します。
- RDS コンソールの [データベース] で、変更する DB インスタンスを選択します。
- [変更] を選択します。
[DB インスタンスの変更] ページが表示されます。 - [データベースオプション] の [オプショングループ] で、新しく作成したオプショングループを選択します。
- [続行] を選択します。
- [変更のスケジュール] で、[すぐに適用] を選択します。
- [DB インスタンスの変更] を選択します。
Amazon RDS for Oracle データベースに新しいオプショングループが反映されたら、IAM ロールと S3_Integration
機能を DB インスタンスに関連付ける必要があります。次の手順を完了します。
- RDS コンソールで、DB インスタンスを選択します。
- [接続性と安全性] タブで、[IAM ロールの管理] を選択します。
- [このインスタンスに IAM ロールを追加] では、RDS_S3_Integration_Role (作成したロール) を選択します。
- [機能] では、[S3_INTEGRATION] を選択します。
- [ロールの追加] を選択します。
IAM ロールと S3 統合機能が Amazon RDS for Oracle データベースに関連付けられたら、S3 と Amazon RDS for Oracle データベースの統合が完了します。これで、次のコードを使用して、オンプレミスの Oracle データベースインスタンスから S3 にデータダンプファイルをアップロードできるようになりました。
データダンプファイルを S3 バケットにアップロードした後、ターゲットデータベースインスタンスに接続し、データポンプファイルを S3 からターゲットインスタンスの DATA_PUMP_DIR
にアップロードします。次のコードを参照してください。
これにより、タスク ID 1572302128132-3676
が得られます。次の SQL クエリを使用して、Amazon RDS for Oracle インスタンスにアップロードしたファイルのステータスを確認します。
上記の SQL クエリ出力にファイルが正常にダウンロードされたことが示されたら、次のコードを使用して、Amazon RDS for Oracle データベースのデータポンプファイルを一覧表示できます。
インポートを開始する
データダンプファイルが使用可能になったら、インポートを開始する前に、ターゲット Amazon RDS for Oracle データベースにロール、スキーマ、テーブルスペースを作成します。
RDS マスターユーザーアカウントでターゲット Amazon RDS for Oracle データベースに接続し、インポートを実行します。Amazon RDS for Oracle データベース tns-entry を tnsnames.ora に追加し、接続文字列の名前を使用してインポートを実行します。
別のテーブルスペースにインポートする場合、または別のスキーマ名でインポートする場合は、それに応じてテーブルスペースとスキーマのリマップを追加できます。
次のコードに示すように、接続文字列名を使用して、オンプレミスから Amazon RDS for Oracle へのインポートを開始します。
インポート後のチェックと検証
インポートが正常に完了したことを検証するには、インポートログファイルでエラーを確認します。また、ソースおよびターゲットデータベースオブジェクト、行数、無効なオブジェクトなどの詳細を比較し、無効なオブジェクトがある場合は再コンパイルします。
インポートが正常に完了したら、データの不整合を回避するために、関連するスキーマのターゲット Amazon RDS for Oracle データベースのトリガーと外部キーを無効にし、AWS DMS レプリケーション向けのターゲットデータベースを準備します。
AWS DMS 移行タスクを作成する
次の手順で AWS DMS 移行タスクを作成します。
- AWS DMS コンソールの [変換と移行] で、[データベース移行タスク] を選択します。
- [タスクの設定] の [タスク識別子] に、タスク識別子を入力します。
- [レプリケーションインスタンス] では、作成した DMS レプリケーションインスタンスを選択します。
- [ソースデータベースエンドポイント] では、ソースエンドポイントを選択します。
- [ターゲットデータベースエンドポイント] では、ターゲット Oracle Amazon RDS for Oracle データベースを選択します。
- [移行タイプ] では、[データ変更のみをレプリケート] を選択します。
- [タスク設定] では、[ログシーケンス番号の指定] を選択します。
- [システム変更番号] には、ソース Oracle データベースから生成した Oracle データベース SCN を入力します。
- [検証の有効化] を選択します。
- [CloudWatch Logs の有効化] を選択します。
これにより、データと Amazon CloudWatch Logs を検証して、AWS DMS レプリケーションインスタンスのログを確認できます。
- [選択ルール] で、以下を実行します。
- [スキーマ] では、[スキーマの入力] を選択します。
- [スキーマ名] には、DMS_SAMPLE と入力します。
- [テーブル名] には、「%」と入力します。
- [アクション] では、[含める] を選択します。
- [変換ルール] では、以下を実行します。
- [ターゲット] では、[テーブル] を選択します。
- [スキーム名] では、[スキーマの入力] を選択します。
- [スキーマ名] には、DMS_SAMPLE と入力します。
- アクションでは、[変更後の名前] を選択します。
- [タスクの作成] を選択します。
タスクを作成すると、CDC を CDC 開始モードで指定した SCN から Amazon RDS for Oracle データベースインスタンスに移行します。CloudWatch Logs を確認して検証することもできます。次のスクリーンショットは、移行のログの詳細を示しています。
データ検証
AWS DMS はデータ検証を実行して、データがソースデータベースからターゲットに正常に移行したことを確認できます。[テーブルの統計] ページを確認して、AWS DMS タスクの開始後に発生した DML の変更を確認できます。データの検証中に、AWS DMS はソースの各行をターゲットの対応する行と比較し、それらの行に同じデータが含まれていることを確認します。これを実現するために、AWS DMS は適切なクエリを発行してデータを取得します。
次のスクリーンショットは、[テーブルの統計] ページとその関連エントリーを示しています。
また、ソースデータベースとターゲットデータベースのレコード数をカウントおよび比較して、CDC データがソースデータベースからターゲットデータベースにレプリケートされていることを確認できます。
計画されたメンテナンス期間中に、ソースデータベースを指すすべてのアプリケーションをオフにし、次のコードを使用してトリガーと外部キー制約を有効にできます。
DMS はソースデータベースから CDC 中に増分シーケンス番号をレプリケートしないため、すべてのシーケンスのソースから最新のシーケンス値を生成し、それをターゲット Amazon RDS for Oracle データベースに適用して、シーケンス値の不整合を回避する必要があります。
次に、接続の詳細を変更して、Amazon RDS for Oracle データベースをアプリケーションに向けます。アプリケーションを立ち上げた後、すべてのアプリケーション接続がターゲット Amazon RDS for Oracle データベース上で確立されたことを確認できるはずです。接続がソースデータベースに存在しないことを確認したら、ソースデータベースを停止できます。
まとめ
この記事では、Oracle Data Pump と AWS DMS を使用して、ダウンタイムを最小限またはゼロで、オンプレミスの Oracle データベースを Amazon RDS for Oracle データベースに移行する方法を説明しました。AWS DMS とその CDC 機能を使用して、重要なデータベースを Amazon RDS にシームレスに移行およびレプリケートできます。
このソリューションを試して、Oracle データベースで AWS DMS を使用する際に得られるすべての利点をぜひご活用ください。詳細については、「AWS Database Migration Service の使用開始」と「AWS Database Migration Service のベストプラクティス」を参照してください。 Oracle データベースの移行の詳細については、「Oracle データベースの AWS クラウドへの移行」ガイドを参照してください。
質問やリクエストがある場合は、コメント欄よりお気軽に送信してください。移行作業が無事完了しますように!
著者について
Sagar Patel は、アマゾン ウェブ サービスのプロフェッショナルサービスチームのデータベーススペシャリストアーキテクトです。彼はデータベース移行のスペシャリストとして、技術的なガイダンスを提供し、Amazon のお客様がオンプレミスのデータベースを AWS に移行するのを支援しています。
Sharath Lingareddy は、アマゾン ウェブ サービスのプロフェッショナルサービスチームのデータベースアーキテクトです。彼は、Oracle、PostgreSQL、Amazon RDS を使用したソリューションを提供しています。オンプレミスデータベースの Amazon RDS と Aurora PostgreSQL への同種および異種の移行に、重点的に取り組んでいます。
Jeevith Anumalla は Oracle データベースクラウドアーキテクトで、アマゾン ウェブ サービスのプロフェッショナルサービスチームに所属しています。彼は、データベース移行のスペシャリストとして、社内外の Amazon のお客様がオンプレミスのデータベース環境を AWS データストアに移行するのを支援しています。