第14回:オンプレOracle DBからRDS for Oracle(AWS)への移行

技術者向け・データベースの技術情報発信

はじめに

皆様、こんにちは。マルチDBソリューション部の望月です。
今まではオンプレミス環境での設計構築作業が主でしたが、最近ではクラウド環境のDB業務も増えてきました。
設計構築作業を行っている中で、システム更改が発生した時に欠かせない作業がデータ移行作業です。
今回は、RDS for Oracle利用時のデータ移行についてお話します。

今回、お客様から頂いたのは、オンプレミス環境でOracleのexpdp機能を使って抽出したデータのダンプファイル。このデータを新AWS環境に移行したいとのこと。
お客様のご希望は。。。

  1. 仕組みを作るために時間を掛けたくない。
  2. 新たな製品の購入など追加費用を掛けたくない。
  3. 影響調査の時間が無いため、なるべく既存環境の変更をしたくない。

オンプレミス環境での移行

オンプレミス環境であれば以下の方法でデータをエクスポート、ダンプファイルを転送しimpdpでインポートできますが、AWSでは直接サーバにファイルを転送できません。

dbexpt14_01.jpg

AWSで提供されるデータ移行方式

AWSでは以下のようなデータ移行の方式が提供されています。

AWS Database Migration Service

事実上ダウンタイムなしでデータベースを AWS に移行できます。移行中でも、ソースデータベースに対して発生するすべてのデータ変更はターゲットに継続的にレプリケートされて、ソースデータベースは完全に動作しています。

AWS Snowball

AWS Import/Export で使用できる機能であり、ネットワークコストが高い、転送時間が長い、セキュリティに懸念があるなど、大規模データを転送するときの一般的な課題を解決するのに役立ちます。Snowball を使用するとデータを簡単、迅速、安全に転送でき、コストは高速インターネットの 5 分の 1 ほどで済みます。

Oracle RMAN のバックアップおよび復元

AWS Snowball を介して AWS にバックアップファイルを送信したり、VPN またはAWS Direct Connect を使用して AWS にデータベースを復元したりできます。

Oracle Data Pump

ダンプファイルを Oracle コンピュータまたは Amazon S3 へインポートオペレーション用に送信したりできます。

提供されている方式を調査しましたが、いずれの方式でも追加費用が発生します。また、今回は抽出されたダンプファイルを元に作業を行うため、方法も限定されます。

詳しくは以下のWebサイト。

『AWSウェブサイト‐AWS へのデータの移行』
https://docs.aws.amazon.com/ja_jp/quickstart/latest/oracle-database/data-migration.html

Perlを使ったデータ転送

追加費用を掛けずにダンプファイルを転送できないだろうか、事例などを調査していた時に見つけたのがPerlを使ったダンプファイルの転送方法です。

前提条件としてEC2サイトが必要ですが、すでに構築されているお客様のEC2サイトが利用可能であることが分かりました。(EC2にはOracle Clientのインストールが必要です!)
実行イメージは以下の通りです。

dbexpt14_02.jpg

実行に使用したPerlのソースはホワイトペーパに記載があります。

『Strategies for Migrating Oracle Databases to AWS』(P24から記載があります)
https://d0.awsstatic.com/whitepapers/strategies-for-migrating-oracle-database-to-aws.pdf

Perlソースの修正と実行イメージ

ソースの修正はPerlが詳しくわからない人でも修正可能なものでした。
赤字部分を環境に沿って修正してください。

my $RDS_PORT=4080; 
my $RDS_HOST="myrdshost.xxx.us-east-1-devo.rds-dev.amazonaws.com"; 
my $RDS_LOGIN="orauser/orapwd"; 
my $RDS_SID="myoradb"; 
my $dirname = "DATA_PUMP_DIR"; 
my $fname   = $ARGV[0]; 
my $data  = ‘‘dummy’’; 
my $chunk = 8192; 

my $sql_open   = "BEGIN perl_global.fh  := utl_file.fopen(:dirname, :fname, 'wb', :chunk); END;"; 
my $sql_write  = "BEGIN utl_file.put_raw(perl_global.fh, :data, true); END;"; 
my $sql_close  = "BEGIN utl_file.fclose(perl_global.fh); END;"; 
~ 略 ~

修正が完了したら、ダンプファイルとPerlスクリプトをEC2サイトに配置して実行です。

[oracle@testser01:/home/oracle]
[oracle@testser01:/home/oracle] perl putdata.pl oradata20191010.dmp
[oracle@testser01:/home/oracle] perl <スクリプト名> <ダンプファイル名> で実行
[oracle@testser01:/home/oracle]

エラー無く実行できれば”DATA_PUMP_DIR”で指定したパスにダンプファイルが転送されているはずです!

ストレス無しの転送!

Perlを使ったファイル転送のメリットはなんといっても無料という点。参考にしたソースから数か所の修正で実現が可能です。また、EC2 to DBサーバの転送はクラウド内で完結するため、数GBのファイルでもストレスなく転送出来ます。

おススメです!