今回は、オンプレミス環境で稼働しているOracle DatabaseをAWS RDS for Oracleに移行する手順について解説します。
AWS DMSとData Pumpという2つの主要な移行方法の違いや、セキュリティ設定の考慮事項、実際に起こりがちなトラブルとその対処法まで、実践的な内容を記載しました。
なぜRDS for Oracleへの移行を検討するのか?
オンプレミスのOracleデータベースをAWS RDS for Oracleに移行することで、以下のようなメリットが得られます。
- 運用負荷の軽減:バックアップ、パッチ適用、ハードウェア障害対応などがAWS側で自動化されます
- 可用性の向上:Multi-AZ構成により、自動フェイルオーバーが可能になります
- スケーラビリティ:需要に応じてスペックを柔軟に変更できます
- 災害対策:リージョン間でのレプリケーションやスナップショット機能が利用できます
移行前の準備・確認事項
移行作業に入る前に、以下の項目を必ず確認しておきましょう。
1. データベースのバージョン確認
RDS for Oracleがサポートしているバージョンを確認します。2024年1月時点では、Oracle Database 19cおよび21cがサポートされています。
2. データベースサイズの確認
移行するデータ量を把握し、適切なRDSインスタンスタイプを選定します。
SUM(bytes)/1024/1024/1024 AS size_gb
FROM dba_segments;
3. 使用している機能の確認
RDSでは一部のOracle機能が制限されています。以下の機能を使用している場合は、代替策を検討する必要があります。
- データベースリンク(一部制限あり)
- Oracle RACは使用不可(Multi-AZで代替)
- ASM(Automatic Storage Management)は使用不可
- RMAN(Recovery Manager)の一部機能制限
⚠ 注意事項
移行前に必ず本番環境のフルバックアップを取得してください。また、移行作業は必ず検証環境で事前テストを実施しましょう。
移行方法の選択:AWS DMSとData Pumpの比較
オンプレミスのOracle DBをRDSに移行する際、主に2つの方法があります。それぞれの特徴を理解して、自社の要件に合った方法を選択しましょう。
| 比較項目 | AWS DMS | Oracle Data Pump |
|---|---|---|
| ダウンタイム | 最小化可能(継続的レプリケーション対応) | ダウンタイムが必要(データ量に比例) |
| データ量 | 大規模データに対応 | 中小規模に適している |
| 移行速度 | 中程度(ネットワーク帯域に依存) | 高速(直接ファイル転送) |
| 複雑さ | 設定がやや複雑 | シンプルで理解しやすい |
| コスト | DMSインスタンス料金が発生 | インスタンス料金なし(転送料金のみ) |
| 適しているケース | 本番稼働中で停止できない場合 | メンテナンスウィンドウがある場合 |
💡 選択のポイント
AWS DMSを選択する場合:本番環境で継続稼働が必要、ダウンタイムを最小限にしたい、異種間移行も視野に入れている
Data Pumpを選択する場合:データ量が比較的少ない、メンテナンスウィンドウを確保できる、シンプルな移行を希望する
方法1:AWS DMSを使った移行手順
AWS Database Migration Service(DMS)は、データベースの移行を支援するマネージドサービスです。継続的なレプリケーションにも対応しており、ダウンタイムを最小化できます。
Step 1: レプリケーションインスタンスの作成
まず、データ移行を実行するためのレプリケーションインスタンスを作成します。
–replication-instance-identifier oracle-migration-instance \
–replication-instance-class dms.c5.xlarge \
–allocated-storage 100 \
–vpc-security-group-ids sg-xxxxxxxxx \
–replication-subnet-group-identifier my-subnet-group \
–publicly-accessible false
Step 2: ソースエンドポイントの設定
オンプレミスのOracle DBへの接続情報を設定します。
–endpoint-identifier source-oracle-db \
–endpoint-type source \
–engine-name oracle \
–username admin \
–password YourPassword123 \
–server-name 192.168.1.100 \
–port 1521 \
–database-name ORCL \
–extra-connection-attributes “useLogminerReader=N;useBfile=Y”
Step 3: ターゲットエンドポイントの設定
RDS for Oracleへの接続情報を設定します。
–endpoint-identifier target-rds-oracle \
–endpoint-type target \
–engine-name oracle \
–username admin \
–password YourRDSPassword123 \
–server-name mydb.xxxxxx.ap-northeast-1.rds.amazonaws.com \
–port 1521 \
–database-name ORCL
Step 4: レプリケーションタスクの作成
実際のデータ移行を実行するタスクを作成します。
–replication-task-identifier oracle-migration-task \
–source-endpoint-arn arn:aws:dms:ap-northeast-1:123456789012:endpoint:source-oracle-db \
–target-endpoint-arn arn:aws:dms:ap-northeast-1:123456789012:endpoint:target-rds-oracle \
–replication-instance-arn arn:aws:dms:ap-northeast-1:123456789012:rep:oracle-migration-instance \
–migration-type full-load-and-cdc \
–table-mappings file://table-mappings.json
table-mappings.jsonの例:
“rules”: [
{
“rule-type”: “selection”,
“rule-id”: “1”,
“rule-name”: “1”,
“object-locator”: {
“schema-name”: “MYSCHEMA”,
“table-name”: “%”
},
“rule-action”: “include”
}
]
}
Step 5: タスクの開始と監視
aws dms start-replication-task \
–replication-task-arn arn:aws:dms:ap-northeast-1:123456789012:task:oracle-migration-task \
–start-replication-task-type start-replication# タスクの状態確認
aws dms describe-replication-tasks \
–filters “Name=replication-task-arn,Values=arn:aws:dms:ap-northeast-1:123456789012:task:oracle-migration-task”
方法2:Oracle Data Pumpを使った移行手順
Oracle Data Pumpは、Oracleネイティブのデータ移行ツールです。シンプルで高速な移行が可能ですが、ダウンタイムが発生します。
Step 1: ディレクトリオブジェクトの作成(ソースDB)
CREATE DIRECTORY export_dir AS ‘/backup/export’;
GRANT READ, WRITE ON DIRECTORY export_dir TO system;
Step 2: Data Pumpエクスポートの実行
オンプレミス環境でデータをエクスポートします。
DIRECTORY=export_dir \
DUMPFILE=mydb_export_%U.dmp \
LOGFILE=export.log \
SCHEMAS=MYSCHEMA \
PARALLEL=4 \
COMPRESSION=ALL \
FILESIZE=2G
💡 パラメータ説明
- PARALLEL=4:並列度を4に設定(CPUコア数に応じて調整)
- COMPRESSION=ALL:全データを圧縮してファイルサイズを削減
- FILESIZE=2G:ダンプファイルを2GBごとに分割
Step 3: ダンプファイルのS3へのアップロード
エクスポートしたファイルをAmazon S3にアップロードします。
aws s3 cp /backup/export/ s3://my-migration-bucket/oracle-dump/ \
–recursive \
–storage-class STANDARD_IA
Step 4: RDS for OracleでS3統合の設定
RDSからS3にアクセスできるようにIAMロールを設定します。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: {
“Service”: “rds.amazonaws.com”
},
“Action”: “sts:AssumeRole”
}
]
}# S3アクセスポリシー
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:GetObject”,
“s3:ListBucket”
],
“Resource”: [
“arn:aws:s3:::my-migration-bucket”,
“arn:aws:s3:::my-migration-bucket/*”
]
}
]
}
RDS DBインスタンスにIAMロールを関連付けます。
–db-instance-identifier mydb \
–feature-name S3_INTEGRATION \
–role-arn arn:aws:iam::123456789012:role/rds-s3-integration-role
Step 5: Data Pumpインポートの実行
RDS for Oracleでインポートを実行します。
BEGIN
rdsadmin.rdsadmin_s3_tasks.download_from_s3(
p_bucket_name => ‘my-migration-bucket’,
p_directory_name => ‘DATA_PUMP_DIR’,
p_s3_prefix => ‘oracle-dump/’
);
END;
/– インポート実行
DECLARE
v_hdnl NUMBER;
BEGIN
v_hdnl := DBMS_DATAPUMP.OPEN(
operation => ‘IMPORT’,
job_mode => ‘SCHEMA’,
job_name => ‘IMPORT_JOB’
);DBMS_DATAPUMP.ADD_FILE(
handle => v_hdnl,
filename => ‘mydb_export_01.dmp’,
directory => ‘DATA_PUMP_DIR’,
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
);
DBMS_DATAPUMP.ADD_FILE(
handle => v_hdnl,
filename => ‘import.log’,
directory => ‘DATA_PUMP_DIR’,
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE
);
DBMS_DATAPUMP.METADATA_FILTER(
handle => v_hdnl,
name => ‘SCHEMA_EXPR’,
value => ‘IN (”MYSCHEMA”)’
);
DBMS_DATAPUMP.START_JOB(handle => v_hdnl);
DBMS_DATAPUMP.DETACH(handle => v_hdnl);
END;
/
セキュリティ設定の考慮事項
データベースの移行において、セキュリティは非常に重要な要素です。以下の項目を必ず確認しましょう。
🔒 1. ネットワークセキュリティ
VPC設定
- RDSインスタンスはプライベートサブネットに配置する
- パブリックアクセスは無効化する(Publicly accessible: No)
- 適切なセキュリティグループを設定する
# アプリケーションサーバーからのみ接続許可
aws ec2 authorize-security-group-ingress \
–group-id sg-xxxxxxxxx \
–protocol tcp \
–port 1521 \
–source-group sg-app-servers
🔒 2. 暗号化の設定
保管時の暗号化
- RDS作成時に必ず暗号化を有効にする
- AWS KMS(Key Management Service)でカスタマーマネージドキーを使用することを推奨
aws rds create-db-instance \
–db-instance-identifier mydb \
–db-instance-class db.r5.xlarge \
–engine oracle-ee \
–master-username admin \
–master-user-password YourPassword123 \
–allocated-storage 100 \
–storage-encrypted \
–kms-key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxx
転送時の暗号化
- SSL/TLS接続を必須にする
- オプショングループでSSL設定を有効化
🔒 3. アクセス制御
IAM Database Authentication
パスワードではなくIAM認証を使用することで、セキュリティを強化できます。
aws rds modify-db-instance \
–db-instance-identifier mydb \
–enable-iam-database-authentication \
–apply-immediately
最小権限の原則
- アプリケーション用ユーザーには必要最小限の権限のみを付与
- 管理用アカウントとアプリケーション用アカウントを分離
- パスワードポリシーを厳格に設定
🔒 4. 監査とログ
- CloudWatch Logsへのログ出力を有効化
- 監査ログ(AUDIT_TRAIL)を有効にする
- 定期的にログを確認し、異常なアクセスパターンを検知
BEGIN
rdsadmin.rdsadmin_util.set_configuration(
name => ‘audit trail’,
value => ‘DB,EXTENDED’
);
END;
/
トラブルシューティング事例
実際の移行作業でよく発生するトラブルと、その対処法をご紹介します。
ケース1: AWS DMSでレプリケーションが遅延する
症状
CDC(Change Data Capture)モードでレプリケーションを開始したが、ソースDBの変更がターゲットに反映されるまでに大きな遅延が発生する。
原因:
- レプリケーションインスタンスのスペック不足
- ネットワーク帯域の制約
- ソースDBのアーカイブログの生成速度が速すぎる
対処法:
- レプリケーションインスタンスのサイズを大きくする(例:c5.xlargeからc5.2xlargeへ)
- BatchApplyEnabled設定を有効にする
- ParallelApplyThreads数を増やす
{
“TargetMetadata”: {
“BatchApplyEnabled”: true,
“ParallelApplyThreads”: 8,
“ParallelApplyBufferSize”: 1000
}
}
ケース2: Data Pumpインポート時に表領域エラーが発生
症状
インポート実行時に「ORA-00959: tablespace does not exist」エラーが発生する。
原因:
ソースDBとターゲットRDSで表領域の構成が異なっている。
対処法:
- 事前にRDSで必要な表領域を作成する
- または、REMAP_TABLESPACE オプションを使用してデフォルト表領域にマッピング
DBMS_DATAPUMP.METADATA_REMAP(
handle => v_hdnl,
name => ‘REMAP_TABLESPACE’,
old_value => ‘USERS_OLD’,
value => ‘USERS’
);
ケース3: 接続タイムアウトエラー
症状
DMSエンドポイント接続テストで「Test connection failed」というエラーが発生する。
原因:
- セキュリティグループの設定不備
- ネットワークACLの制限
- ソースDBのファイアウォール設定
対処法:
- DMSレプリケーションインスタンスのセキュリティグループを確認
- ソースDBへの接続元IPアドレスをホワイトリストに追加
- VPCピアリングまたはVPN/Direct Connect経由の接続を確認
aws ec2 describe-security-groups \
–group-ids sg-xxxxxxxxx# ネットワーク接続のテスト(EC2から実行)
telnet source-db-server.example.com 1521
ケース4: 文字コード変換エラー
症状
日本語データが文字化けする、または「ORA-12899: value too large for column」エラーが発生。
原因:
ソースDBとターゲットRDSの文字コード(NLS_CHARACTERSET)が異なる。
対処法:
- 移行前に文字コードを統一する
- RDS作成時に正しい文字コードを指定
- データ移行後に文字コード変換を実施(最終手段)
SELECT value FROM nls_database_parameters WHERE parameter = ‘NLS_CHARACTERSET’;– RDS作成時の文字コード指定例
aws rds create-db-instance \
–db-instance-identifier mydb \
–engine oracle-ee \
–character-set-name AL32UTF8 \
…
💡 予防策
文字コード問題を避けるため、移行前に必ずソースDBとターゲットRDSの文字コードを確認し、統一しておきましょう。一般的には「AL32UTF8」(UTF-8)を推奨します。
移行後の検証と切り替え
データ移行が完了したら、以下の検証を必ず実施しましょう。
データ整合性の確認
SELECT
table_name,
num_rows
FROM dba_tables
WHERE owner = ‘MYSCHEMA’
ORDER BY table_name;– チェックサム比較(重要テーブル)
SELECT
COUNT(*),
SUM(ORA_HASH(column1 || column2 || column3)) as checksum
FROM important_table;
パフォーマンステスト
- 主要なSQLクエリの実行時間を測定
- アプリケーションからの接続テスト
- 負荷テストツール(JMeter等)での検証
切り替え手順
- メンテナンスモードへの移行を通知
- アプリケーションの停止
- 最終データ同期(DMSの場合は自動)
- 接続文字列の変更(RDSエンドポイントへ)
- アプリケーションの起動
- 動作確認
- 監視体制の確立
まとめ
オンプレミスのOracle DatabaseをAWS RDS for Oracleに移行する方法として、AWS DMSとOracle Data Pumpの2つの手法を詳しく解説してきました。
AWS DMSは、ダウンタイムを最小化したい場合や継続的なレプリケーションが必要な場合に適しており、Data Pumpは、メンテナンスウィンドウを確保できる場合にシンプルで高速な移行を実現できます。
どちらの方法を選択する場合でも、以下のポイントを忘れずに:
- 必ず検証環境で事前テストを実施する
- 本番環境のフルバックアップを取得しておく
- セキュリティ設定を適切に構成する
- 移行後のデータ整合性確認を徹底する
- ロールバック手順を事前に準備しておく
クラウドリフトは一見複雑に見えますが、適切な準備と手順を踏めば、安全かつ確実に実施できます。本記事が皆さんのAWS移行プロジェクトの一助となれば幸いです。
