Oracle(오라클) RAC to clonedb(singledb) - 오라클 복제(clone)

Share

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


0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x