본문 바로가기

Legacy/Oracle Exadata

[ORACLE] RMAN Backup으로 restore & recover하기

Prod machine : Oracle Exadata X9-2
QA machine : Oracle Exadata X7-2
OS : RHEL 7.9 (Maipo)
Disk : ASM
Database version : 12.2.0.1.0

 

 

QA서버로 사용하고 싶다고 해서

운영기 전체데이터 그대로 복제해달라는 요청을 받았다.

운영기가 DW성이다보니 30T가 넘기 때문에

expdp나 impdp로 하기엔 좀^^....

rman backup본으로 restore & recovery로 QA서버를 생성해주는 방향으로 진행했다.

따라서 DB 이름 변경 작업도 필요했던 상황임. (따로 포스팅 예정) 

QA서버에는 이미 엔진이 깔려있다는 가정하에 복구 하는 과정임.

 

--qa서버 리소스 지우는 작업은 따로 포스팅 예정(25.02.27)

 

 

1. Rman full backup (Prd.) 

--control file backup 1
backup as backupset format '경로/control_%t.ctl' current controlfile;

--채널 할당(원하는 개수만큼 usual하게 8ea)
allocate channel ch01 device type disk format '백업 스토리지/%b';

--backup 수행
backup incremental level 0 as copy tag '백업태그' database reuse;

--control file backup 2
backup as backupset format '경로/control_%t.ctl' current controlfile;

--archive backup 
backup format '백업 스토리지/~~.arc' as copy archivelog like "+RECO" not backuped up reuse;

 

 

여기서 control file 백업이 2번인데 

한 번은 full backup 받기 전, 한 번은 full backup 받은 후이다.

1번을 하게되면 full backup을 하면서 발생한 archivelog에 대해서는 적용안해줘도 되고

(어느정도 적용이 필요하겠지만 많이는 아닐 것. 비교적 간단함)

2번을 하게되면 full backup 하면서 발생한 archivelog까지 적용시켜줘야한다. (비교적 오래걸림)

2번만 해놓은 상황이라 ㅠ.ㅠ.... 오래걸렸음.

 

백업 경로에서 해당 컨트롤파일 확인필요

backup된 control file 이름을 '경로/control_2025020701000000.ctl' 이라고 예시로 들겠습니다.  

 

 

2. 복구 위한 정보 수집  (Prd.) 

SQL> create pfile from spfile;

--QA서버에서 사용할 pfile을 PRD서버에서 백업해준다.

 

 

3. startup nomount후 정보 확인 (QA)

SQL> startup nomount;
SQL> show parameter name
SQL> show parameter spfile
SQL> show parameter control

 

 

4. 컨트롤 파일 복구 with ASM (QA)

$ rman target /

RMAN > restore controlfile to '+DATA1' from '경로/control_2025020701000000.ctl' 
RMAN > restore controlfile to '+RECO1' from '경로/control_2025020701000000.ctl'
RMAN > exit;

$ asmcmd -p
[ASMCMD +] cd +DATA1/DB명/CONTROLFILE
[ASMCMD +DATA1/DB명/CONTROLFILE] ls --ls명령어로 controlfile 생성된 것을 확인
[ASMCMD +DATA1/DB명/CONTROLFILE] current123.456789000
[ASMCMD +DATA1/DB명/CONTROLFILE] cd 
[ASMCMD +] cd +RECO1/DB명/CONTROLFILE
[ASMCMD +RECO1/DB명/CONTROLFILE] current321.098765400

--1번 내용 참조

 

 

5. QA서버의 pfile에 기재 (QA)

SQL> shutdown immediate;
$ vi init$sid.ora

--생성된 controlfile 위치를 pfile에 기재
 *control_files='+DATAC1/DB명/CONTROLFILE/current123.456789000',
 '+RECO1/DB명/CONTROLFILE/current321.098765400'

 

 

6. 컨트롤파일 시점 확인(복구 목표 시점) (QA)

SQL> select to_char(controlfile_time,'yyyy-mm-dd hh24:mi:ss') from v$database;

-- full backup 완료된 시점에 받은 controlfile backup임

해당 시점과 backupfile이 떨어진 시점 비교하여 정상 확인 필요

해당 시점까지 archivelog file이 있어야 복구 후 정상적으로 DB 오픈이 가능하다.

 

 

7. DB restore 시작

 7-1 ) 카탈로그 등록 (QA)

$ rman target /
RMAN > catalog start with '백업스토리지'

-- 카탈로그를 등록하는 시점의 백업스토리지안에 있는 내용만 읽어들임.

(카탈로그 등록하고 난 이후 추가적으로 넣은 파일에 대해서는 인식하지 못함.)

 

 

 7-2 ) Rman restore database (QA)

$ vi 경로/rman_restore.rcv

RUN {
 allocate channel ch1 device type disk;
 allocate channel ch2 device type disk;
 allocate channel ch3 device type disk;
 allocate channel ch4 device type disk;
 allocate channel ch5 device type disk;
 allocate channel ch6 device type disk;
 allocate channel ch7 device type disk;
 allocate channel ch8 device type disk;
 RESTORE DATABASE;
 release channel ch1;
 release channel ch2;
 release channel ch3;
 release channel ch4;
 release channel ch5;
 release channel ch6;
 release channel ch7;
 release channel ch8;
 }

--type disk를 사용하지 않는경우 'RMAN-00558 : error encountered while parsing input commands' 발생

 

 

 

7-3) 백그라운드 수행 (QA)

--backupground 수행
$nohup rman target / cmdfile='경로/rman_restore.rcv' log='경로/rman_restore.log' &

--restore 확인
$tail -f 경로/rman_restore.log

 

 

7-4) restore된 파일 확인 (QA)

$asmcmd -p
[ASMCMD +] lsdg
[ASMCMD +] cd +DATA1/DB명/DATAFILE

 

 

7-5) v$log 확인 (QA)

alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';

select * from v$log order by sequence#;
--thread 1번과 2번 first_time 시점까지 복구되었을 것

-- 아까 확인해둔 controlfile_time보다 v$log의 first_time시점이 낮으면 

아카이브 적용시켜서 controlfile_time 시점을 넘길 수 있도록 해야함.

그렇지 않으면 DB를 open할 수 없음.

 

 

8. DB Recover 시작 

 8-1) 아카이브가 있는 디렉토리 카탈로그 등록 (QA)

$rman target /
RMAN > catalog start with '경로';

--해당 경로에 controlfile_time보다 낮은 아카이브는 굳이 읽지않고,

필요한 아카이브 리스트만 읽어서 보여주게된다.

 

 

 8-2) recover database; (QA)

$ vi 경로/rman_recover.rcv

RUN {
 allocate channel ch1 device type disk;
 allocate channel ch2 device type disk;
 allocate channel ch3 device type disk;
 allocate channel ch4 device type disk;
 allocate channel ch5 device type disk;
 allocate channel ch6 device type disk;
 allocate channel ch7 device type disk;
 allocate channel ch8 device type disk;
 RECOVER DATABASE;
 release channel ch1;
 release channel ch2;
 release channel ch3;
 release channel ch4;
 release channel ch5;
 release channel ch6;
 release channel ch7;
 release channel ch8;
 }

-- 해당 파일도 7-3번 과정처럼 백그라운드로 수행시킨다.

-- 만약에 해당 경로에 너무 많은 아카이브가 떨어져있고, controlfile_time에 적혀있는 시간만 넘기면 되는경우에,

  예) recover database until sequence **** thread 1;

  예) recover database until  time to_char('yyyy-mm-dd hh24:mi:ss', 'yyyy-mm-dd hh24:mi:ss');

 

 

* 하는 과정에 발생했던 문제는 백업해둔 아카이브가 모자라서

ASMDISK에 떨어져있던 아카이브를 다시 추가로 백업받았음.  (Prd.)

RMAN > backup as copy archivelog from sequence 11111 until sequence 11115 thread 1
format '백업장비경로/arch_%h_%e_%a.arc';
       
RMAN > backup as copy archivelog from sequence 22222 until sequence 22226 thread 2
format '백업장비경로/arch_%h_%e_%a.arc';

 

 

9. database open 

 9-1) rename datafile (QA)

SQL> alter database rename file '+DATA1/리두로그경로/리두로그명' to '+DATA1'; 
SQL> alter database rename file '+RECO1/리두로그경로/리두로그명' to '+RECO1';

-- 해당 과정이 필요한 이유는 PRD에서 받아온 리두로그의 이름이기 때문에(실제로는 없음) 

ASM은 OMF(Oracle Managed Files)를 사용하므로 이름이 자동으로 잡힐 수 있도록 변경하는 것!

 

 

9-2 ) block change trancking disable (QA)

SQL> alter database disable block change tracking;

--를 하는 이유는 정확히 모르겠지만,,🤔🤔

BCT를 disable함으로써,,뭘까 ...추가기재예정(25.02.28)

 

 

9-3) open (QA)

SQL> alter database open resetlogs;

-- 경로만 잡혀 있는 redolog를 생성해주면서 db를 오픈

 

 

 

이렇게 복구를 하게되면 운영exa안에 있는 DB의 이름과
QA exa장비에 있는 DB네임이 동일하게 된다.

제목을 우선 rman restore & recover 작업이므로

이름 변경하는 작업은 추후에 포스팅 예정.