Last Updated on 10월 24, 2021 by Jade(정현호)
포스팅 환경 정보
포스팅에서 사용하는 테스트 환경은 아래와 같습니다.
Test Date : 2011-12-04
CPU : VCPUx4
Memory : 2GB
OS : RHEL 5.5
Hostname : test1, test2
ORACLE_SID : testdb1, testdb2
Oracle Version : 10.2.0.5
Test Scenario
1) 현재 testdb1 , testdb2 의 SID로 RAC(10.2.0.5) 에서 HOT Backup을 이용하여 clonedb를 생성
2) 복제 되는 instance의 SID는 copydb 로 할 것이며, single 로 복구를 시도
3) RAC 는 /oradata/testdb , single 은 /oradata3/copydb 로 복구를 진행
HOT BACKUP
■ 테스트를 간편하게 하기 위해 alter database begin backup; 으로 백업 진행합니다.
SQL> alter database begin backup;
■ Redo와 Temp Tablespace 파일을 제외한 모든 datafile 을 복사 합니다.
$ cp system01.dbf /oradata3/copydb/
$ cp sysaux01.dbf /oradata3/copydb/
$ cp undotbs01.dbf /oradata3/copydb/
$ cp undotbs02.dbf /oradata3/copydb/
$ cp users01.dbf /oradata3/copydb/
■ 복사 후 end backup 을 실행합니다.
SQL> alter database end backup;
END Backup 을 실행한 시간을 확인합니다.
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') "Time" from dual;
Time
-------------------
2011-12-04:12:10:09
Test Table 생성
복사 후 복구 테스트를 위해서 테이블과 데이터를 입력합니다.
■ 테이블 생성
SQL> create table test01 (no number) tablespace users;
■ 데이터 입력
BEGIN
for i in 1..1000 loop
insert into test01 values(i);
end loop;
commit;
END;
/
■ log switch 및 checkpoint 발생
SQL> alter system switch logfile; -- 수회 실행
■ test table삭제
SQL> drop table test01 purge;
■ 삭제 시간 확인
SQL> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') "Time" from dual;
Time
-------------------
2011-12-04:12:26:00
Ready to CloneDB
■ spfile 로 pfile을 생성
SQL> create pfile='$ORACLE_HOME/dbs/initCOPYDB.ora' from spfile;
■ controlfile 재생성을 위해 trace 파일 생성
SQL> alter database backup controlfile to trace as '/oradata3/copydb/recon.sql';
■ pfile 수정
아래 파라미터를 clonedb 환경에 맞게 수정 합니다. 물론 디렉토리도 생성을 해야 합니다.
*.audit_file_dest=
*.background_dump_dest=
*.control_files='
*.user_dump_dest='
*.db_name='testdb'
RAC 파라미터 변경, 아래와 같이 변경
*.instance_number=1
*.cluster_database=false
*.thread=1
*.undo_tablespace='UNDOTBS1'
■ pfile 수정
create controlfile 절을 수정 합니다
CREATE CONTROLFILE SET DATABASE "COPYDB" RESETLOGS NOARCHIVELOG
REUSE => SET
NORESETLOGS => RESETLOGS
그 외 경로를 clonedb에 맞게 수정 합니다.
복구 하고 open 후 temp tablespace를 생성 함으로 temp tablespace 생성 절을 별도로 백업을 합니다.
ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata3/copydb/temp01.dbf'
SIZE 524288000 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
아래와 같이 CHARACTER SET KO16MSWIN949; 까지 유지해서 파일을 작성 합니다.
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "COPYDB" RESETLOGS NOARCHIVELOG
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
MAXINSTANCES 32
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/oradata3/copydb/redo01a.log',
'/oradata3/copydb/redo01b.log' ) SIZE 300M,
GROUP 2 ( '/oradata3/copydb/redo02a.log',
'/oradata3/copydb/redo02b.log' ) SIZE 300M,
GROUP 3 ( '/oradata3/copydb/redo03a.log',
'/oradata3/copydb/redo03b.log' ) SIZE 300M,
GROUP 4 ( '/oradata3/copydb/redo04a.log',
'/oradata3/copydb/redo04b.log' ) SIZE 300M
-- STANDBY LOGFILE
DATAFILE
'/oradata3/copydb/system01.dbf',
'/oradata3/copydb/undotbs01.dbf',
'/oradata3/copydb/sysaux01.dbf',
'/oradata3/copydb/undotbs02.dbf',
'/oradata3/copydb/users01.dbf'
CHARACTER SET KO16MSWIN949;
Create CloneDB
■ sid를 변경하고 컨트롤 파일을 재생성 하도록 하겠습니다.
$ export ORACLE_SID=COPYDB
SQL*Plus: Release 10.2.0.5.0 - Production on Sun Dec 4 12:48:19 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
Connected to an idle instance
SQL> @recon.sql
■ 시간 기반으로 복구를 합니다.
복구를 진행할 세션에서 복구하기 편한 방식으로 시간 설정을 합니다.
SQL> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
삭제한 시간이 2011-12-04:12:26:00 이기 때문에 24 분으로 복구 하겠습니다.
SQL> recover database until time '2011-12-04:12:24:00' using backup controlfile;
복구를 실시하면 아래와 같이 아카이브 파일을 필요로 하는 메세지가 확인 됩니다.
ORA-00279: change 565796 generated at 12/04/2011 12:01:54 needed for thread 2
ORA-00289: suggestion : /oracle/product/102/db/dbs/arch2_14_768267462.dbf
ORA-00280: change 565796 for thread 2 is in sequence #14
위에서 알 수 있는 것은 thread 2(RAC에서 2번째 노드) 의 시퀀스 14번 을 가진 아카이브가 필요로한 것 입니다
테스트 환경에서는 파일명이 arc_2_14_768267462.arc 이며, 경로 및 파일을 입력합니다.
파일명 입력
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oradata/arch_testdb/arc_2_14_768267462.arc
이번에는 thread 1의 change 565796 을 포함 한 아카이브 파일을 입력 해야 합니다.
ORA-00279: change 565796 generated at needed for thread 1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
RAC 로 접속해서 쿼리를 수행하여 THREAD1의 565796 변경본이 포함된 아카이브 파일을 찾습니다.
SQL> set lines 500 SQL> col name for a50 SQL> SELECT THREAD# ,SEQUENCE# , FIRST_CHANGE#, NEXT_CHANGE#, NAME, TO_CHAR(FIRST_TIME,'YYYY-MM-DD:HH24:MI:SS') FIRST_TIME FROM V$ARCHIVED_LOG; THREAD# SEQUENCE # FIRST_CHANGE # NEXT_CHANGE# NAME FIRST_TIME ---------- ---------- ------------- ------------ ----------------------------------------------------------------------- 2 14 553454 567190 /oradata/arch_testdb/arc_2_14_768267462.arc 2011-12-04:05:52:04 2 15 567190 567247 /oradata/arch_testdb/arc_2_15_768267462.arc 2011-12-04:12:20:05 2 16 567247 567249 /oradata/arch_testdb/arc_2_16_768267462.arc 2011-12-04:12:20:09 1 11 553456 567252 /oradata/arch_testdb/arc_1_11_768267462.arc 2011-12-04:05:52:05 2 17 567249 567254 /oradata/arch_testdb/arc_2_17_768267462.arc 2011-12-04:12:20:12 2 18 567254 567274 /oradata/arch_testdb/arc_2_18_768267462.arc 2011-12-04:12:20:15 2 19 567274 567279 /oradata/arch_testdb/arc_2_19_768267462.arc 2011-12-04:12:21:12 1 12 567252 567293 /oradata/arch_testdb/arc_1_12_768267462.arc 2011-12-04:12:20:14
확인 해 보면 arc_1_11_768267462.arc 파일인 것을 알 수 있습니다. 아래와 같이 경로와 파일명을 입력합니다.
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oradata/arch_testdb/arc_1_11_768267462.arc
ORA-00279: change 567190 generated at 12/04/2011 12:20:05 needed for thread 2
ORA-00289: suggestion : /oracle/product/102/db/dbs/arch2_15_768267462.dbf
ORA-00280: change 567190 for thread 2 is in sequence #15
ORA-00278: log file '/oradata/arch_testdb/arc_2_14_768267462.arc' no longer
needed for this recovery
change 567190 for thread 2 is in sequence #15 메세지를 보면
THREAD2의 15 시퀀스 아카이브 파일을 필요로 하다는 것을 알 수 있습니다. 경로 및 파일명을 입력 합니다.
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oradata/arch_testdb/arc_2_15_768267462.arc
위와 같은 패턴으로 요청하는 아카이브 파일을 계속 적용을 진행하며 운영중인 RAC에 생성 된 아카이브 보다 더 높은 시퀀스를 요구 시에는 로그 스위치를 발생 하여 생성한 아카이브를 반영하도록 합니다.
계속 적용 시키면 아래와 같이 recovery가 되었다는 메세지를 볼 수 있습니다
Log applied.
Media recovery complete.
resetlogs 로 instance를 open 을 합니다.
SQL> alter database open resetlogs;
Temp Tablespace 를 추가합니다.
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata3/copydb/temp01.dbf'
SIZE 524288000 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
■ 예외 처리
아래와 같이 ORA-38856 가 나오게 되면 Unpulbished Bug- 4355382 로 써 오라클 문서ID: 334899.1 를 참조합니다.
ERROR at line 1:
ORA-38856: cannot mark instance UNNAMED_INSTANCE_2 (redo thread 2) as enabled
pfile 에 _no_recovery_through_resetlogs=TRUE 를 추가한 후 다시 resetlogs 로 open 합니다.
open 후 test01 테이블이 복구 되었는지 확인해 보도록 합니다.
slect count(*) from test01;
COUNT(*)
----------
1000

Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io