이 글에서는 Red Hat® Enterprise Linux® 서버 환경에서 Recovery Manager(RMAN) 핫 백업을 활용해 온프레미스 Oracle® E-Business Suite®(EBS) R12.2를 버전 19c 데이터베이스와 함께 단계별로 복제(Clone)하는 전체 과정을 다룹니다. 소개하는 절차는 다른 운영체제에서도 동일하게 적용할 수 있습니다.
EBS 복제 개요
EBS 복제를 수행하려면 다음과 같은 상위 단계를 순서대로 완료해야 합니다.
- 소스 데이터베이스 노드와 애플리케이션 노드에서 사전 복제(Pre-clone) 유틸리티를 실행합니다.
- RMAN 핫 백업으로 아카이브 로그를 포함한 전체 컨테이너 데이터베이스(CDB)를 백업한 뒤 타깃 노드로 복사합니다.
- 타깃 데이터베이스 및 애플리케이션 노드를 정리(Clean-up)합니다.
- 소스의 애플리케이션 바이너리와 데이터베이스 바이너리를 타깃 노드로 복사합니다.
- 타깃 데이터베이스 노드에서 $ORACLE_HOME을 구성합니다.
- 데이터베이스를 복원(Restore)하고 복구(Recover)합니다.
- 타깃 데이터베이스 노드에서 복원 후 작업을 수행합니다.
- 타깃 애플리케이션 노드에서 애플리케이션을 구성합니다.
- 애플리케이션 노드에서 사후 복제(Post-clone) 작업을 수행합니다.
- 타깃 애플리케이션 서비스를 시작합니다.
이제 각 단계를 자세히 살펴보겠습니다.
1. 사전 복제(Pre-clone) 유틸리티 실행
소스 데이터베이스 노드와 애플리케이션 노드에서 사전 복제 유틸리티를 실행하여 드라이버와 구성 파일을 생성합니다. 이 유틸리티는 데이터베이스 및 애플리케이션 바이너리를 타깃 노드로 복사하기 전에 해당 바이너리가 타깃 환경에 맞도록 준비하는 역할을 합니다.
a. 데이터베이스 노드의 $ORACLE_HOME에서 다음 명령어로 플러거블 데이터베이스(PDB) 환경 파일을 소싱(Source)합니다.
cd $ORACLE_HOME
. <PDB_NAME>_hostname.env
cd $ORACLE_HOME/appsutil/scripts/$CONTEXT_NAME
perl adpreclone.pl dbTier
b. 애플리케이션 노드에서는 다음 명령어를 실행합니다.
. EBSApps run (Source RUN FS)
cd $ADMIN_SCRIPTS_HOME
perl adpreclone.pl appsTier
2. CDB 백업 수행
RMAN 핫 백업을 사용해 아카이브 로그를 포함한 전체 CDB를 백업하고, 백업본을 타깃 노드로 복사합니다.
a. 다음 명령어로 $ORACLE_HOME에서 CDB 환경 파일을 소싱합니다.
cd $ORACLE_HOME
. <CDB_NAME>_hostname.env
connect target /
b. 이어서 다음 명령어로 백업을 진행합니다.
run {
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
BACKUP as compressed backupset FULL FILESPERSET 10 FORMAT '<Backup location>/<SID>_bk_%s_%p_%t.bak' DATABASE;
BACKUP as compressed backupset filesperset 10 FORMAT '<Backup location>/<SID>_arch_%s_%p_%t.bak' ARCHIVELOG ALL skip inaccessible;
BACKUP FORMAT '<Backup location>/<SID>_cntrl_%s_%p_%t.bak' CURRENT CONTROLFILE;
RELEASE CHANNEL d1;
RELEASE CHANNEL d2;
RELEASE CHANNEL d3;
RELEASE CHANNEL d4;
}
백업이 완료되면 백업본을 타깃 위치로 이동하거나, 시간 절약을 위해 네트워크 파일 시스템(NFS)으로 백업 마운트 지점을 타깃 노드에 공유하면 됩니다.
3. 타깃 노드 정리(Clean-up)
타깃 데이터베이스 노드와 애플리케이션 노드를 정리합니다.
데이터베이스 노드에서 수행할 작업:
a. 정리 작업에 앞서 다음과 같은 중요 구성 파일과 디렉터리를 반드시 백업해 둡니다.
- $CONTEXT_FILE
- 환경 파일(Environment files)
- dbs 디렉터리
- $TNS_ADMIN 디렉터리
b. 타깃 ORACLE_HOME(OH)을 제거하고 데이터베이스를 삭제(Drop)합니다.
c. oraInventory의 내용을 모두 제거합니다.
참고로 UTL 디렉터리에는 심볼릭 링크(symbolic link)가 존재해서는 안 됩니다. 심볼릭 링크가 있다면 제거하고 실제 물리적 디렉터리 구조를 새로 생성해야 합니다.
애플리케이션 노드에서 수행할 작업:
a. RUN 및 PATCH $CONTEXT_FILE, 그리고 RUN FS의 $TNS_ADMIN 디렉터리를 백업합니다.
b. 애플리케이션 노드를 정리하기 전에 타깃 노드의 RUN FS 정보를 기록해 둡니다.
c. FS1, FS2, FS_NE, oraInventory 디렉터리를 정리합니다.
4. 바이너리 복사
다음 절차에 따라 소스의 애플리케이션 바이너리와 데이터베이스 바이너리를 타깃 노드로 복사합니다.
a. 데이터베이스 노드에서는 버전 19.0.0(19c) 바이너리를 타깃 데이터베이스 서버로 복사·전송합니다.
b. 애플리케이션 노드에서는 소스 RUN FS의 EBSapps 디렉터리만 타깃 노드의 RUN FS 하위로 전송합니다.
5. $ORACLE_HOME 구성
타깃 데이터베이스 노드에서 $ORACLE_HOME을 구성합니다.
adcfgclone.pl을 실행해 $ORACLE_HOME을 구성하기 전에 oraInventory 디렉터리를 먼저 정리합니다. 새로운 서버에서 처음으로 복제를 수행하는 경우에는 아래 단계만 실행하고 모든 입력값을 직접 제공하면 됩니다.
a. 컨텍스트 파일(Context file)을 생성합니다.
cd $ORACLE_HOME/appsutil/clone/bin
perl adclonectx.pl contextfile=<Source database context file> template=$ORACLE_HOME/appsutil/template/adxdbctx.tmp [pairsfile=<Pairs file Path>]
perl adcfgclone.pl dbTechStack <Full Path of CONTEXT_FILE>
b. listener.ora와 tnsnames.ora를 생성합니다.
cd $ORACLE_HOME/appsutil
./txkSetCfgCDB.env -dboraclehome=<ORACLE_HOME>
cd $ORACLE_HOME/appsutil/bin
perl txkGenCDBTnsAdmin.pl -dboraclehome=$ORACLE_HOME -cdbname=<target CDB NAME> \
-cdbsid=<SID> -dbport=<Target DB port> -outdir=$ORACLE_HOME/appsutil/log \
-israc=<yes/no> [-virtualhostname=<virtual hostname>]
c. 반복 복제 인스턴스인 경우에는 CONTEXT_FILE 백업본을 사용해 타깃 데이터베이스 바이너리를 구성할 수 있습니다.
cd <RDBMS ORACLE_HOME>/appsutil/clone/bin
perl adcfgclone.pl dbTechStack <Full Path of CONTEXT_FILE backup location>
d. 반복 복제 인스턴스라면 dbs와 TNS 파일을 원복(Revert)하여 구성 이후에도 모든 구성 파일과 초기화 파라미터가 그대로 유지되도록 합니다.
e. 리스너(Listener)를 시작합니다.
6. 데이터베이스 복원 및 복구
$ORACLE_HOME 구성이 끝나면 앞서 생성한 백업본을 사용해 타깃 데이터베이스 복원을 시작합니다.
a. 복원에 앞서 타깃 노드에서 다음 파라미터가 올바르게 설정되어 있는지 확인합니다.
- db_file_name_convert
- log_file_name_convert
b. 타깃 데이터베이스를 nomount 상태로 기동한 뒤, 다음 RMAN 명령어로 데이터베이스를 복원합니다.
Rman auxiliary /
run
{
allocate auxiliary channel d1 device type disk;
allocate auxiliary channel d2 device type disk;
allocate auxiliary channel d3 device type disk;
duplicate database to '<CDB NAME>' backup location '<RMAN backup location>' nofilenamecheck;
release channel d1;
release channel d2;
release channel d3;
}
7. 타깃 데이터베이스 복원 후 작업
타깃 데이터베이스 노드에서 복원 후 작업을 수행합니다.
CDB 복원이 완료되고 CDB 인스턴스가 오픈되면 다음 단계를 진행합니다.
a. CDB 환경 파일을 소싱한 뒤 PDB 이름을 변경합니다. 복원 과정에서 소스 PDB 이름으로 복원되기 때문입니다. 다음 명령어로 타깃 PDB 이름을 변경합니다.
sqlplus / as sysdba
SQL> alter pluggable database "<Source PDB Name>" close;
SQL> alter pluggable database "<Source PDB Name>" unplug into '<ORACLE_HOME>/dbs/<Source PDB Name>_PDBDesc.xml';
SQL> drop pluggable database "<Source PDB Name>";
SQL> create pluggable database "<Target PDB Name>" using '<ORACLE_HOME>/dbs/<PDB Name>_PDBDesc.xml' NOCOPY SERVICE_NAME_CONVERT=('ebs_<Source PDB Name>','ebs_<Target PDB Name>','<Source PDB Name>_ebs_patch','<Target PDB Name>_ebs_patch');
SQL> alter pluggable database "<Target PDB Name>" open read write;
SQL> alter pluggable database all save state instances=all;
SQL> sho pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
------ ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 <PDB Name> READ WRITE NO
b. PDB 환경 파일을 소싱한 후 다음 명령어를 실행하여 Oracle Database에 타깃 UTL_FILE_DIR 값을 설정합니다.
perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=$CONTEXT_FILE -oraclehome=$ORACLE_HOME -outdir=$ORACLE_HOME/appsutil/log -mode=getUtlFileDir
c. 다음 명령어로 Oracle_Home/dbs 아래의 <PDB Name>_utlfiledir.txt 파일을 편집하고 UTL 경로를 타깃 환경에 맞게 수정합니다.
perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=$CONTEXT_FILE -oraclehome=$ORACLE_HOME -outdir=$ORACLE_HOME/appsutil/log -mode=setUtlFileDir
d. <PDB Name>_utlfiledir.txt에 등록된 각 경로마다 다음 스크립트를 실행합니다.
perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=$CONTEXT_FILE -oraclehome=$ORACLE_HOME -outdir=$ORACLE_HOME/appsutil/log -mode=createDirObject
perl $ORACLE_HOME/appsutil/bin/txkCfgUtlfileDir.pl -contextfile=$CONTEXT_FILE -oraclehome=$ORACLE_HOME -outdir=$ORACLE_HOME/appsutil/log -mode=syncUtlFileDir -skipautoconfig=yes
cd $ORACLE_HOME/appsutil/install/$CONTEXT_NAME
sqlplus / as sysdba @adupdlib.sql <libext>
clean FND_NODE table
sqlplus apps/<Source Apps password>
EXEC FND_CONC_CLONE.SETUP_CLEAN;
Commit;
e. 다음 명령어로 adautocfg.sh(AutoConfig)를 실행합니다.
cd <$ORACLE_HOME/appsutil/scripts/$CONTEXT_NAME>
sh adautocfg.sh
8. 타깃 애플리케이션 구성
타깃 애플리케이션 노드에서 애플리케이션을 구성합니다.
a. adcfgclone.pl 실행 전에 PATCH FS, FS_NE, oraInventory 디렉터리를 먼저 정리합니다.
b. 다음 명령어를 실행하여 애플리케이션을 구성합니다.
cd <COMMON_TOP>/clone/bin
export TIMEDPROCESS_TIMEOUT=-1
export T2P_JAVA_OPTIONS="-Djava.io.tmpdir=<Temp directory location>"
perl ./adcfgclone.pl appsTier dualfs
c. 이 단계에서 요구되는 모든 입력값을 제공합니다.
d. 반복 복제 인스턴스라면 CONTEXT_FILE 백업본을 활용할 수도 있습니다. 다음 명령어를 실행합니다.
perl ./adcfgclone.pl appsTier <location of CONTEXT_FILE backup> dualfs
9. 애플리케이션 사후 복제(Post-clone) 작업
애플리케이션 노드에서 사후 복제 작업을 수행합니다.
a. 애플리케이션 구성이 완료되면 FNDCPASS 명령어를 사용하여 apps, sysadmin 및 커스텀 스키마(있는 경우)의 비밀번호를 변경합니다.
b. apps 비밀번호 변경 후에는 데이터베이스 노드와 애플리케이션 노드 양쪽에서 Autoconfig를 실행합니다.
c. 복제 인스턴스에 필요한 기타 커스텀 작업이 있다면 추가로 수행합니다.
10. 타깃 애플리케이션 서비스 시작
이제 타깃 복제 인스턴스의 모든 애플리케이션 서비스를 시작하고, 복제된 인스턴스에 대한 전반적인 정상 동작 확인(Sanity check)을 수행할 수 있습니다.
결론
위에서 소개한 절차를 따르면 멀티테넌트 아키텍처가 적용된 19c 데이터베이스 환경에서 PROD 인스턴스를 비운영(Non-prod) 서버로 손쉽게 복제하거나 새로 고침(Refresh)할 수 있습니다.
궁금한 점이나 의견이 있다면 피드백 탭을 통해 남겨 주세요. 언제든지 함께 논의할 준비가 되어 있습니다.