[Oracle 11gR2] RMAN DUPLICATE 명령어를 사용하여 운영DB를 개발DB로 이관하기
개발 환경에서 신규 프로세스나 제품을 테스트할 때, 데이터 부족으로 인해 실무적인 검증이 어려운 경우가 많습니다. 특정 스키마(사용자)나 일부 테이블만 옮길 때는 Data Pump Utility를 사용하는 것이 효율적이지만, DB 전체를 마이그레이션해야 할 때는 RMAN DUPLICATE 명령어를 사용하는 것이 훨씬 안정적이고 편리합니다.
- 운영DB와 개발DB의 운영현황(파라미터 등)을 확인합니다.
파라미터(명령어) 운영DB 개발DB Hostname
(SELECT host_name FROM v$instance;)cmain cdev SID
(show parameter instance_name;)CMAIN CDEV Datafile 경로
(show parameter db_create_file_dest;)/u02/app/oracle/oradata/CMAIN /u02/app/oracle/oradata/CDEV Redo 경로
(show parameter db_create_online_log_dest_;)/u04/app/oracle/redo/CMAIN/ /u02/app/oracle/redo/CMAIN/ Control files
(show parameter control_files;)/u04/app/oracle/redo/CMAIN/CMAIN/controlfile/o1_mf_jhgxljgz_.ctl /u02/app/oracle/redo/CDEV/CDEV/controlfile/o1_mf_jhgxd8gn_.ctl - TNS 이름을 설정합니다. 관리의 편리성을 위해 운영DB와 개발DB를 동일하게 설정합니다. 설정이 완료된 이후
tnsping 명령어를 사용해서 접속되는지 확인합니다.CMAIN = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = camin)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = CMAIN) ) ) CDEV = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = cdev)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = CDEV) ) ) - 개발DB의 listener.ora 파일에 아래와 같이 등록합니다.
lsnrctl status 명령어로 확인합니다.LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = cdev)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) # static listener: DB가 NOMOUNT 상태여도 RMAN이 찾아올 수 있게 합니다. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = CDEV) # 서비스 이름으로 접속 시 매칭 (ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/dbhome_1) (SID_NAME = CDEV) # 인스턴스 식별자 ) ) ADR_BASE_LISTENER = /u01/app/oracle - 개발DB를 NOMOUNT 상태로 재기동합니다. 복제 중에 발생하는 내부 DDL 에러를 무시하고 진행하고 싶다면
"ALTER SYSTEM SET "_system_trig_enabled" = FALSE SCOPE=MEMORY;"를 추가 실행합니다.SQL> shutdown immediate; SQL> startup nomount;
- 운영DB의 비밀번호 파일(orapwCMAIN)을 개발DB로 복사한 후 이름을 변경(orapwCDEV)로 변경합니다.
scp $ORACLE_HOME/dbs/orapwCMAIN oracle@cdev:$ORACLE_HOME/dbs/orapwCDEV
- 아래 RMAN DUPLICATE 스크립트를 작성후 실행합니다.
#!/bin/bash #nohup ./duplicate.sh & export ORACLE_SID=CDEV TAR_CONN="sys/password@CMAIN" AUX_CONN="sys/password@CDEV" BASE_DIR=$(cd "$(dirname "$0")" && pwd) SCRIPT_NAME=$(basename "$0" .sh) DATE=$(date +%Y%m%d%H%M%S) LOG_FILE=${BASE_DIR}/${SCRIPT_NAME}_${DATE}.log echo "***********************************************************" echo " WARNING: This script will OVERWRITE data using REPLACE." echo " Be careful: You should run this script under NONE PROD DB." echo "***********************************************************" echo -n "Are you sure? (Type 'YES' to continue): " read USER_INPUT if [ "$USER_INPUT" != "YES" ]; then echo "Action canceled by user. Exiting..." exit 1 fi #show parameter db_create_file_dest; rm -rf /u02/app/oracle/oradata/CDEV/CDEV/datafile/* #show parameter db_create_online_log_dest_1; rm -rf /u02/app/oracle/redo/CDEV/CDEV/onlinelog/* #show parameter control_files; rm -rf /u02/app/oracle/redo/CDEV/CDEV/controlfile/*.ctl # You can check duplication process by running 'tail -f ${LOG_FILE}' and/or 'watch -n 5 du -sh .' command rman target ${TAR_CONN} auxiliary ${AUX_CONN} log=${LOG_FILE} append <<EOF RUN { ALLOCATE CHANNEL t1 DEVICE TYPE DISK; ALLOCATE CHANNEL t2 DEVICE TYPE DISK; ALLOCATE AUXILIARY CHANNEL c1 DEVICE TYPE DISK; ALLOCATE AUXILIARY CHANNEL c2 DEVICE TYPE DISK; DUPLICATE TARGET DATABASE TO CDEV FROM ACTIVE DATABASE DB_FILE_NAME_CONVERT=('/u02/app/oracle/oradata/CMAIN/CMAIN/datafile/','/u02/app/oracle/oradata/CDEV/CDEV/datafile/') NOFILENAMECHECK; } EXIT; EOF - 개발DB를 재기동할 필요는 없으며 SPFILE을 확인하고 없으면 생성합니다.
SQL> SHOW PARAMETER SPFILE; -- $ORACLE_HOME/dbs/spfileCDEV.ora 경로가 떠 있고, 실제 파일이 존재한다면 OK입니다. ---- 만약 비어 있거나 파일이 없다면, 아래 명령어를 사용해서 spfile을 생성한 후, ---- 재기동하기 전에 파일명을 spfileCDEV.ora로 변경한 다음에 재기동합니다. SQL> CREATE SPFILE='?/dbs/spfileCDEV_new.ora' FROM MEMORY; -- 텍스트 파일로 백업받아둡니다. ---- /u01/app/oracle/product/11.2.0.4/dbhome_1/dbs/initCDEV.ora 파일이 존재한다면 기존 파일을 백업합니다. SQL> CREATE PFILE='/u01/app/oracle/product/11.2.0.4/dbhome_1/dbs/initCDEV.ora' FROM MEMORY;
- 혹시 재기동할 때 “ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance” 오류가 발생한다면, [diagnostic_dest]/diag/rdbms/[db_name]/[instance_name]/trace/alert_[SID].log 파일에서 오류 메시지를 찾아서
ALTER SYSTEM RESET명령어로 더 이상 사용하지 않는 파라미터들을 초기화합니다.SQL> show parameter diagnostic_dest; SQL> ALTER SYSTEM RESET parameter_name SCOPE=SPFILE;
