Amazon Web Services ブログ

RMANのduplicationを用いてOracle databaseを Amazon RDS Customに物理コピーで移行する方法

本投稿は、Yamuna PalasamudramとNitin Saxena による記事 Physical migration of Oracle databases to Amazon RDS Custom using RMAN duplicationを翻訳したものです。

アプリケーションのモダナイズとクラウドサービスの活用を進めるため、各企業・組織は自己管理型のOracle DatabaseからAWSのマネージド・データベースサービスに移行しています。Amazon RDS Custom を用いることにより、お客様のOracle DatabsaeをAmazon Relational Database Service (Amazon RDS)に物理コピー移行するにあたっての必要な権限を用いられます。この記事ではマイグレーションに必要な重要要素をご紹介し、RMAN duplicationを用いて自己管理型のOracle DatabaseからAmazon RDS Customにマイグレーションする例についてご紹介します。

Amazon RDS Custom for Oracleは、オペレーティングシステムやデータベース環境へのアクセスが必要な、レガシー・カスタマイズ・パッケージアプリケーションのためのマネージド・データベースサービスです。本サービスにより、データベース環境やオペレーティングシステムをカスタマイズすることを可能としつつ、データベース管理タスクや運用が自動化されます。

Amazon RDS Customによって、お客様が保有するインストール・メディアの利用やカスタマイズされたパッチの適用や高可用性の構築が可能になります。また、自動的なプロビジョニングや、監視、バックアップ・リストア、スケーリング、自動化によってマネージドな運用が可能になります。

マイグレーションを検討するための重要要素

AWSへのデータベースは多くの要素が影響しますが、例として以下が挙げられます。

  • アプリケーションが許容可能なダウンタイム時間
  • ソースデータベースのサイズ
  • ネットワーク接続(パブリックのインターネットか、VPNか、AWS Direct Connect か)と、ソースデータベースとターゲットデータベースの間の帯域
  • ソースとターゲットのOracle DatabaseのバージョンとOSの種類
  • 利用可能なレプリケーション・ツール、例えばAWS Database Migration Service (AWS DMS)、Oracle GoldenGate、もしくはその他の3rd Partyレプリケーション・ツール

これらの要素に基づき、オフライン移行するのか、物理マイグレーションあるいは論理レプリケーション、もしくは物理と論理マイグレーションの組み合わせを用いたオンライン移行をするのかを選択します。次のセクションでは、RMAN duplicateツールを用いたOracle DatabaseからAmazon RDS Customへの移行手順をご案内します。

ソリューション概要

本投稿では、RMAN duplicationを用いてAmazon Elastic Compute Cloud (Amazon EC2)上のOracle DatabaseをAmazon RDS Customにマイグレーションする方法についてご紹介します。本シリーズの次の投稿ではOracle Data Guardを用いて自己管理型のOracle DatabaseをAmazon RDS Customに移行する方法についてご紹介します。

RMANはデータベースのバックアップを元にしたデータベース複製と、運用中のデータベースを元にしたデータベース複製をサポートしています。運用中のデータベースを元にしたデータベース複製を行う場合、ソースデータベースのバックアップは必要ありません。運用中のデータベースからデータベース・ファイルをネットワーク経由で転送し、補助データベースを構築することにより、データベースの複製を行います。RMANのduplicate database機能は必要なファイル群をイメージ・コピー / バックアップ・セットのいずれの形でもコピーできます。本投稿では運用中のデータベースを元にしたデータベース複製の手順について解説します。

まず、ソースデータベース側で以下の手順を実行します:

  1. パスワードファイルの作成
  2. ソースデータベース側からターゲットデータベース側で必要になるパラメータファイルを作成します
  3. パスワードファイルとパラメータファイルをターゲットデータベースにコピーします
  4. ソースデータベースがアーカイブログ運用になっていることを確認します
  5. ソースデータベース側のtnsnames.oraファイルを、ターゲット側と通信可能な設定にします

次に、RDS Customのデータベースインスタンスで以下の手順を実行します:

  1. ソースデータベースからコピーしてきたパラメータファイルを元に、パラメータの編集を行います
  2. ソース側と通信可能な設定にするためtnsnames.oraの編集を行います
  3. RDS Customのデータベース環境の設定を行います
  4. Amazon RDS Custom automation 機能を停止します
  5. Amazon RDS Custom環境に構成されたORCLデータベースを削除します
  6. 編集済のパラメータファイルを用いてAmazon RDS Custom上のORCLデータベースをnomountモードで起動します
  7. RMANのactive duplicationを実行します
  8. RDS CustomのDBインスタンスの状態を確認します
  9. RDSADMINユーザーを作成し、必要な権限を付与します
  10. Amazon RDS Custom automation機能を再開します

前提条件

この投稿では以下の環境が構成されていることを前提としています。

  • ソースデータベースはAmazon EC2上のOracle Linuxで稼働しているOracle Database
  • ソースデータベースの名前はORCL
  • ターゲットデータベースはRDS Custom for OracleのDBインスタンス
  • 本手順はソースデータベースがオンプレミス上にあったとしても、適切なネットワーク接続がオンプレミスとAmazon Virtual Private Cloud (Amazon VPC)の間で構築されていれば適用可能

マイグレーションを行う前に以下の前提条件を満たす必要があります。

  1. RDS Custom for OracleのDBインスタンスをORCL(ソースデータベースのデータベース名と同じ名前)というデータベース名で作成します。手順については、Working with Amazon RDS Custom を参照してください。この初期構築のデータベースは、ターゲットデータベースとして構築したいカスタムの名前を用いて作成します。
  2. Amazon Simple Storage Service (Amazon S3)のバケットをrds-rmanbackupという名前で作成します。このバケットはソースデータベースからRDS Customへパラメータファイルやパスワードファイルをコピーする際に用います。もし既存のバケットがある場合、それを利用できます。また、ソースデータベースからRDS Custom環境にSSHポートが空いている場合、直接SSH転送を行うことも可能です。
  3. ソースデータベースのホスト上でAWS Command Line Interface (AWS CLI)の導入を行います。手順についてはGetting started with the AWS CLI を参照してください。
  4. ソースデータベースのサーバーとRDS Customのサーバーでネットワーク通信が確立されており、1521のポートで通信可能なことを確認します。

ソースデータベースの手順

このセクションでは、ソースデータベースインスタンスで行う手順について解説します。

パスワードファイルの作成

  1. Oracle Databaseのインストールユーザーで、ソースデータベース環境にログインします。
  2. ソースデータベース環境の適切な権限を設定します。
    -bash $ echo $ORACLE_HOME
    	/u01/app/oracle/
    	-bash $  echo $ORACLE_SID
    	ORCL
  3. orapwdユーティリティを用いてパスワードファイルを作成します。
    bash> $ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/orapwORCL
  4. ファイルの確認を行います。
    ls -r $ORACLE_HOME/dbs/orapwORCL

ソースデータベース上でターゲットデータベース用のパラメータファイルを作成

  1. sysdba権限でデータベースに接続しpfileを作成します。
    $ sqlplus / as sysdba 
        SQL> create pfile='/tmp/initORCL.ora' from spfile;
  2. 作成されたpfileの確認を行います。
    ls -r /tmp/initORCL.ora

パラメータファイルとパスワードファイルをターゲットデータベースにコピー

VPCの設定に準じ、S3バケットあるいはSSHを用いて、ファイル群をRDS Customのデータベースサーバーにコピーします。以下の手順では、Amazon S3経由でファイル群をコピーする方法を示します。

  1. ファイル群をAmazon S3にコピーします。
    $ aws s3 cp /tmp/initORCL.ora  s3://rds-rmanbackup
    $ aws s3 cp $ORACLE_HOME/dbs/orapwORCL s3://rds-rmanbackup
  2. バケットとバケット内のオブジェクトをリスト化しファイル群の確認を行います。
    -bash-4.2$ aws s3 ls rds-rmanbackup
    2021-10-26 20:36:21 initORCL.ora
    2021-10-26 20:36:21 orapwORCL

    もしS3バケットへの接続に関する問題が発生した場合、バケットの権限とAmazon S3への接続性を確認してください。AWS CLIに関する問題が発生した場合、Troubleshooting AWS CLI errors を参照してください。

  3. Amazon S3からRDS Customインスタンスにファイル群をコピーします。
    $ aws s3 cp s3://rds-rmanbackup/initORCL.ora $ORACLE_HOME/dbs/
    $ aws s3 cp s3://rds-rmanbackup/orapwORCL /rdsdbdata/config/
  4. RDS Customインスタンス上のファイル群を確認します。
    -bash-4.2$ ls -r $ORACLE_HOME/dbs/initORCL.ora
    /rdsdbbin/bin initORCL.ora
    
    -bash-4.2$ ls -r /rdsdbdata/config/orapwORCL
    /rdsdbdata/config/orapwORCL
  5. シンボリック・リンクを作成します。
    $ ln -sf /rdsdbdata/config/orapw /rdsdbbin/oracle/dbs/orapwORCL

ソースデータベースがアーカイブログモードで運用されていること確認します

ソースデータベースがアーカイブログモードでであることを確認します。

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

もしソースデータベースがアーカイブログモードになっていない場合、アーカイブログモードに変換するためにChanging the Database Archiving Mode を参照してください。

ソースデータベース・サーバーのtnsnames.oraを編集

ターゲットと通信するためにソースデータベース・サーバー上のtnsnames.oraを編集するには、以下の手順を実施します。

  1. $ORACLE_HOME/network/admin ディレクトリに移動します。
    cd $ORACLE_HOME/network/admin
  2. tnsnames.oraファイルに以下の追記を行います。
    DB_SOURCE =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <source_instance_IP>)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
    )
    )
    DB_TARGET =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <RDS_Custom_instance_IP>)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
    )
    )
  3. ソースデータベース・インスタンスからtnspingを用いてネットワーク接続を確認します。構成に問題がなければOKが返されます。
    $ tnsping DB_TARGET
    OK

RDS Customのデータベースインスタンスの手順

このセクションでは、RMAN duplicateの手順を用いてソースデータベースからRDS Customのデータベースインスタンスにマイグレーションする手順を示します。RMANを実行する前に、初期構築されたORCLインスタンスを削除し、NOMOUNTモードで空のデータベースを起動します。

ソースデータベース・ホストからコピーされたパラメータファイルの編集

ソース・データベースサーバーからコピーされたinitORCL.oraファイルを開き、db_file_name_convertlog_file_name_convert変数を含むよう編集します。別のデータベース名に変更したい場合、db_nameを変更することが可能です。この例では、ソースデータベースと同じデータベース名を用いています。環境に応じてメモリー関連のパラメータを変更することが可能です。以下の例を参考にしてください。

ORCL.__data_transfer_cache_size=0
ORCL.__db_cache_size=6039797760
ORCL.__inmemory_ext_roarea=0
ORCL.__inmemory_ext_rwarea=0
ORCL.__java_pool_size=0
ORCL.__large_pool_size=33554432
ORCL.__oracle_base='/rdsdbbin'#ORACLE_BASE set from environment
ORCL.__pga_aggregate_target=4966055936
ORCL.__sga_target=7449083904
ORCL.__shared_io_pool_size=134217728
ORCL.__shared_pool_size=1207959552
ORCL.__streams_pool_size=0
ORCL.__unified_pga_pool_size=0
*.archive_lag_target=300
*.audit_file_dest='/rdsdbdata/admin/ORCL/adump'
*.compatible='19.0.0'
*.control_files='/rdsdbdata/db/ORCL/controlfile/control-01.ctl'
*.db_block_checking='MEDIUM'
*.db_create_file_dest='/rdsdbdata/db'
*.db_name='ORCL'
*.db_recovery_file_dest_size=1073741824
*.db_unique_name='ORCL'
*.dbfips_140=FALSE
*.diagnostic_dest='/rdsdbdata/log'
*.filesystemio_options='setall'
*.heat_map='OFF'
*.job_queue_processes=50
*.local_listener='(address=(protocol=tcp)(host=)(port=8200))'
*.log_archive_dest_1='location="/rdsdbdata/db/ORCL/arch/redolog", valid_for=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_format='-%s-%t-%r.arc'
*.max_string_size='STANDARD'
*.memory_max_target=12385852416
*.memory_target=12385852416
*.open_cursors=300
*.pga_aggregate_target=0
*.processes=1673
*.recyclebin='OFF'
*.sga_target=0
*.undo_tablespace='UNDO_T1'
*.use_large_pages='FALSE'
*.DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/',' /rdsdbdata/db/ORCL/datafile/'
*.LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/DB11G/',' /rdsdbdata/db/ORCL/onlinelog/'

ソースデータベースと接続できるようにtnsnames.oraを編集

ソースデータベースのインスタンスと接続できるようにtnsnames.oraの編集を行います。以下の手順を実行してください。

  1. $ORACLE_HOME/network/adminディレクトリに移動します。
    $ cd /rdsdbbin/oracle/network/admin/
    
    -bash-4.2$ ls -ltr
    total 4
    -rw-r--r-- 1 rdsdb database 1536 Feb 14  2018 shrept.lst
    lrwxrwxrwx 1 rdsdb database   30 Oct 26 22:11 listener.ora -> /rdsdbdata/config/listener.ora
    lrwxrwxrwx 1 rdsdb database   28 Oct 26 22:11 sqlnet.ora -> /rdsdbdata/config/sqlnet.ora
    lrwxrwxrwx 1 rdsdb database   30 Oct 26 22:11 tnsnames.ora -> /rdsdbdata/config/tnsnames.oracd $ORACLE_HOME/network/admin
  2. tnsnames.oraファイルを編集し、以下のエントリを追加してください。
    DB_SOURCE =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <source_instance_IP>)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
    )
    )
    DB_TARGET =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <RDS_Custom_instance_IP>)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
    )
    )
  3. RDS Customのデータベースインスタンスで以下のコマンドを発行し、ネットワーク接続とTNSエントリの確認を行います。構成に問題がなければOKが返されます。
    $ tnsping DB_SOURCE
    OK

RDS CustomのORCLデータベースインスタンスで環境変数を設定

RDS CustomのデータベースでORCLインスタンスの環境変数が設定されていることを確認するため、$ORACLE_SID, $ORACLE_HOME, $PATHを確認します。

Amazon RDS Custom automationを停止します

RDS CustomのautomationがRMANの実行を妨げないように、RDS Customインスタンスでautomation modeを停止する必要があります。
以下のAWS CLIコマンドを用いてautomationの停止を行います:

aws rds modify-db-instance --db-instance-identifier custom-ORCL --automation-mode all-paused --resume-full-automation-mode-minute 120 --region us-east-2

RDS Customの監視設定とマスターユーザー作成のスクリプトを準備します

データベースの作成後にRDSADMINとRDS Customマスターユーザー、表領域、プロファイルの作成を行うSQLスクリプトを準備します。再作成が必要となるマスターユーザーのユーザー名を確認します。(マスターユーザーのユーザー名はRDS consoleの設定タブの配下にあります。) マスターユーザーのユーザー名がADMINと異なる場合、スクリプトの中の以下の行の置換を行ってください。

define v_username = "'RDSADMIN','ADMIN'"

作業ディレクトリで以下のスクリプトをrecreate_custom_resources_input.sqlとしてコピーし、実行してください。これはRDSADMINやRDS Customのマスターユーザー、表領域・プロファイルを再作成するSQLスクリプトであり、プライマリインスタンスで後ほど実行します。

************************ COPY FROM NEXT LINE ******************
1. set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off
2. verify off trimspool on
3. column ddl format a1000
4. begin
5. dbms_metadata.set_transform_param (dbms_metadata.session_transform,
6. 'SQLTERMINATOR', true);
7. dbms_metadata.set_transform_param (dbms_metadata.session_transform,
8. 'PRETTY', true);
9. end;
10. /
11. define v_username = "'RDSADMIN','ADMIN'"
12. spool recreate_custom_resources_output.sql
13. select dbms_metadata.get_ddl('DIRECTORY','OPATCH_INST_DIR') as ddl from dual;
14. select dbms_metadata.get_ddl('DIRECTORY','OPATCH_LOG_DIR') as ddl from dual;
15. select dbms_metadata.get_ddl('DIRECTORY','OPATCH_SCRIPT_DIR') as ddl from
16. dual;
17. select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
18. from dba_users u
19. where u.profile='RDSADMIN';
20. select dbms_metadata.get_ddl('TABLESPACE','RDSADMIN' ) AS ddl from dual;
21. select dbms_metadata.get_ddl('TABLESPACE','TEMP' ) AS ddl from dual;
22. select dbms_metadata.get_ddl('TABLESPACE','USERS' ) AS ddl from dual;
23. select dbms_metadata.get_ddl('USER', u.username) AS ddl
24. from dba_users u
25. where u.username in (&v_username)
26. union all
27. select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
28. from dba_ts_quotas tq
29. where tq.username in (&v_username)
30. union all
31. select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
32. from dba_role_privs rp
33. where rp.grantee in (&v_username)
34. union all
35. select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
36. from dba_sys_privs sp
37. where sp.grantee in (&v_username)
38. union all
39. select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
40. from dba_tab_privs tp
41. where tp.grantee in (&v_username)
42. union all
43. select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
44. from dba_role_privs rp
45. where rp.grantee in (&v_username)
46. andrp.default_role = 'YES'
47. /
48. set linesize 80 pagesize 14 feedback on trimspool on verify on
49. spool off
*******************COPY UNTIL PREVIOUS LINE ******************

RDS Custom環境上で初期構築されたORCLインスタンスを削除

DROP DATABASEコマンドを発行する前にRDS Custom上の初期構築されたデータベースに接続されていることを確認してください:

$ sqlplus / as sysdba
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT EXCLUSIVE RESTRICT
SQL> DROP DATABASE;

NOMOUTの状態でAmazon RDS Custom上のORCLデータベースをオープン

編集されたパラメータファイルを用いてNOMOUNT状態でAmazon RDS Custom環境のORCLデータベースをオープンします:

SQL> startup nomount pfile='/rdsdbbin/oracle/dbs/initORCL.ora';
ORACLE instance started.

RMANのactive duplicationを実行

SYSユーザーのパスワードを入力し、RMAN duplicateコマンドを実行します:

-bash $ rman target sys/<password>@DB-SOURCE auxiliary sys/<password>
Recovery Manager: Release 19.0.0.0.0 - Production on Mon Oct 25 21:36:08 2021
Version 19.10.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

connected to target database: ORCL (DBID=4089929259)
connected to auxiliary database: ORCL (not mounted)

RMAN> duplicate database to 'ORCL' from active database NOFILENAMECHECK;

Starting Duplicate Db at 25-OCT-21
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=10 device type=DISK
current log archived
…
…
…
contents of Memory Script:
{
Alter clone database open resetlogs;
}
executing Memory Script

database opened
Cannot remove created server parameter file
Finished Duplicate Db at 25-OCT-21

RDS Customのデータベース・インスタンスの状態を確認

以下のSQLコマンドを用いてデータベースインスタンスの状態を確認します。

SQL> select name,open_mode from v$database;

NAME OPEN_MODE
--------- --------------------
ORCL READ WRITE

RDSADMINとマスターユーザーを作成し、権限を付与

RDSADMINはRDS Customデータベース・インスタンスの監視と運用で用いられるデータベース・ユーザーです。初期構築されたデータベースは削除され、RMANを用いてターゲットデータベースがリストアされているため、RDS Customの監視が期待通りに動作するためにはリストア作業の後にこれらのユーザーの再作成が必要です。また、RDSADMINユーザー用の独自のプロファイルと表領域も必要です。

  1. データベースにログインして、以下のようにdefaultプロファイルを変更します。
    SQL>set echo on feedback on serverout on
    SQL>@?/rdbms/admin/utlpwdmg.sql
    SQL>ALTER PROFILE DEFAULT
    LIMIT
    FAILED_LOGIN_ATTEMPTS UNLIMITED
    PASSWORD_LIFE_TIME UNLIMITED
    PASSWORD_VERIFY_FUNCTION NULL;
  2. 初期構築されたデータベースを削除する前に作成したrecreate_custom_resources_output.sqlスクリプトを実行します。
    SQL>@recreate_custom_resources_output.sql
  3. SYS, SYSTEM, DBSNMPユーザーのプロファイルをRDSADMINに設定します:
    SQL>set echo on feedback on serverout on
    SQL>alter user SYS profile RDSADMIN;
    SQL>alter user SYSTEM profile RDSADMIN;
    SQL>alter user DBSNMP profile RDSADMIN;
    
    SQL> @?/rdbms/admin/userlock.sql
    SQL> @?/rdbms/admin/utlrp

Amazon RDS Customのautomationを再開

全ての手順の実行後、以下のAWS CLIコマンドを用いてautomationを再開します:

aws rds modify-db-instance --db-instance-identifier custom-ORCL --automation-mode full --region us-east-2

RMAN duplicateを用いたAmazon EC2上のOracle DatabaseをAmazon RDS Custom環境へのマイグレーションが完了しました。

結論

本投稿では、ネイティブのRMAN duplicateツールを用いて自己管理型のOracle DatabaseデータベースからAmazon RDS Custom for Oracleに物理マイグレーションを行うことにより、データベース移行をするための重要な点について解説しました。次の投稿では、Data Guardのスタンバイ作成の手法を用いてOracle DatabaseからAmazon RDS Customに物理移行する手順をご説明します。本投稿へのご意見はコメント欄にお願いします。


翻訳はソリューションアーキテクトの 矢木 覚 が担当しました。原文はこちらです。