rman을 이용한 특정 tablespace 복구

####RMAN 이용하여 특정 tablespace만 복구 하기 



참고) 해당 시나리오는 새로운 경로로 원하는 tablespace 만 복구하는 경우를 가정하여 진행.

rman 백업본은 /oracle/app/oracle/bak 디렉토리에 저장되어 있다고 가정.



###1안

※ redo 경로가 변경 될 경우 아래와 같이 파라미터 셋팅 후 진행한다.

alter system set log_file_name_convert='/oracle/app/oracle/oradata/RES','/oracle/app/oracle/dir' scope=spfile;

또는

log_file_name_convert='/oracle/app/oracle/oradata/RES','/oracle/app/oracle/dir'


- nomount 진행

startup nomount


- 복구 진행

$ rman auxiliary /


run{

ALLOCATE AUXILIARY CHANNEL CH01 TYPE disk;

ALLOCATE AUXILIARY CHANNEL CH02 TYPE disk;

SET NEWNAME FOR DATAFILE 1 TO '/oracle/app/oracle/dir/system01.dbf';

SET NEWNAME FOR DATAFILE 2 TO '/oracle/app/oracle/dir/sysaux01.dbf';

SET NEWNAME FOR DATAFILE 3 TO '/oracle/app/oracle/dir/undotbs01.dbf';

SET NEWNAME FOR datafile 5 TO '/oracle/app/oracle/dir/ts_res01.dbf';

set newname for tempfile 1 to '/oracle/app/oracle/dir/temp01.dbf';

duplicate database to 'res' 

nofilenamecheck

until time="to_date('2020-03-01 16:55:43','yyyy-mm-dd hh24:mi:ss')"

tablespace SYSTEM,SYSAUX,UNDOTBS1,TS_RES_TEST

backup location '/oracle/app/oracle/bak' 

;

}




※ 넷백업의 경우 아래와 같이 SEND 절을 넣어서 진행


RUN

{

ALLOCATE AUXILIARY CHANNEL CH01 TYPE 'SBT_TAPE';

SEND 'NB_ORA_SERV=bserver,NB_ORA_CLIENT=uc4db';

SET NEWNAME FOR DATAFILE 1 TO '/oracle/app/oracle/dir/system01.dbf';

SET NEWNAME FOR DATAFILE 2 TO '/oracle/app/oracle/dir/sysaux01.dbf';

SET NEWNAME FOR DATAFILE 3 TO '/oracle/app/oracle/dir/undotbs01.dbf';

SET NEWNAME FOR datafile 5 TO '/oracle/app/oracle/dir/ts_res01.dbf';

set newname for tempfile 1 to '/oracle/app/oracle/dir/temp01.dbf';

duplicate database to 'res'

nofilenamecheck

until time="to_date('2020-03-01 16:55:43','yyyy-mm-dd hh24:mi:ss')"

tablespace SYSTEM,SYSAUX,UNDOTBS1,TS_RES_TEST

;

}




참고) archivelog가 없고 순수 백업본만 가지고 진행하는 경우에 에러가 발생 할 경우 run 명령어 맨 끝에 NOREDO 를 넣어서 진행한다.NOREDO 옵션을 사용 한 경우 OPEN 후 NOARCHIVELOG로 변경되어 올라온다.



###2안

※ log_file_name_conver 파라미터 셋팅을 하지 않고 새로운 경로에 redolog를 생성 할 경우 아래와 같이 진행 하면 된다.


- nomount 진행

startup nomount


- 복구 진행

$ rman auxiliary /


run{

SET NEWNAME FOR DATAFILE 1 TO '/oracle/app/oracle/dir/system01.dbf';

SET NEWNAME FOR DATAFILE 2 TO '/oracle/app/oracle/dir/sysaux01.dbf';

SET NEWNAME FOR DATAFILE 3 TO '/oracle/app/oracle/dir/undotbs01.dbf';

SET NEWNAME FOR datafile 5 TO '/oracle/app/oracle/dir/ts_res01.dbf';

set newname for tempfile 1 to '/oracle/app/oracle/dir/temp01.dbf';

duplicate database to 'res'

nofilenamecheck

until time="to_date('2020-03-01 16:55:43','yyyy-mm-dd hh24:mi:ss')"


  LOGFILE

      GROUP 1 ('/oracle/app/oracle/dir/redo01a.log', 

               '/oracle/app/oracle/dir/redo01b.log') SIZE 4M REUSE, 

      GROUP 2 ('/oracle/app/oracle/dir/redo02a.log', 

               '/oracle/app/oracle/dir/redo02b.log') SIZE 4M REUSE

tablespace SYSTEM,SYSAUX,UNDOTBS1,TS_RES_TEST

backup location '/oracle/app/oracle/bak' ;

}



참고) archivelog가 없고 순수 백업본만 가지고 진행하는 경우에 에러가 발생 할 있음. 그럴 땐 run 명령어 맨 끝에 NOREDO 를 넣어서 진행한다. 





###3안 

★ duplicate를 이용하여 진행하는게 가장 깔끔한 방법이지만 다음과 같은 방법으로도 복구가 가능하다.

0) controlfile restore 및 mount 단계로 진행 

rman target / 

restore controlfile from '/oracle/app/oracle/bak/con1.ctl';

alter database mount;


--백업본을 rman에서 인식시키기 위하여 아래와 같이 진행

catalog start with '/oracle/app/oracle/bak';




1) 복구

- 복구 스크립트 실행


run{

set until time="to_date('2020-03-01 16:55:43','yyyy-mm-dd hh24:mi:ss')";

SET NEWNAME FOR DATAFILE 1 TO '/oracle/app/oracle/dir/system01.dbf';

SET NEWNAME FOR DATAFILE 2 TO '/oracle/app/oracle/dir/sysaux01.dbf';

SET NEWNAME FOR DATAFILE 3 TO '/oracle/app/oracle/dir/undotbs01.dbf';

SET NEWNAME FOR datafile 6 TO '/oracle/app/oracle/dir/rec01.dbf';

set newname for tempfile 1 to '/oracle/app/oracle/dir/temp01.dbf';

alter database rename file '/oracle/app/oracle/oradata/RES/redo01.log' to '/oracle/app/oracle/dir/redo01.log';

alter database rename file '/oracle/app/oracle/oradata/RES/redo02.log' to '/oracle/app/oracle/dir/redo02.log';

alter database rename file '/oracle/app/oracle/oradata/RES/redo03.log' to '/oracle/app/oracle/dir/redo03.log';

restore database skip forever tablespace 'USERS','TS_RES_TEST';

switch datafile all;

recover database skip tablespace 'USERS','TS_RES_TEST'; 

}


참고) HOT 백업본의 경우도 위와 같이 rman을 이용하여 복구 가능하다.

참고) RESTORE 시 FOREVER 명령어를 사용하면 복구 할 필요 없는 DATAFILE들의 경우 자동으로 OFFLINE 시켜 준다.



---참고


####RECOVER table을 이용하여 복구(12c이상)


====RECOVER TABLE 명령어====================================================================

RECOVER TABLE res.RES_TEST_1 UNTIL TIME  "to_date('2020-03-01 23:20:12','yyyy-mm-dd hh24:mi:ss')" AUXILIARY DESTINATION '/oracle/app/oracle/bak' DATAPUMP DESTINATION '/home/oracle' DUMP FILE 'RES_TEST_1' NOTABLEIMPORT;

=========================================================================================


- NOTABLEIMPORT : 운영 DB에 바로 IMPORT 하지 않고 DUMPFILE을만 생성 할 때 사용하는 옵션

- AUXILIARY DESTINATION : 임시로 table 복구를 위해 사용하는 공간

※ table이 여러개라면 res.RES_TEST_1, res.RES_TEST_2, ... 해서 지정하여 실행하면 된다.






'기술이야기 > 전문가 기술기고' 카테고리의 다른 글

ORA-4031 관련  (0) 2020.05.15
RMAN TSPITR 테이블 DROP 복구하기  (0) 2020.03.27
MySQL Replication 구성  (0) 2020.02.12
Oracle Diskgroup Move 작업 관련  (0) 2020.02.11
MySQL 5.5 설치 및 세팅  (0) 2020.02.10
TAGS.

Comments