위로 아래

환경

source oracle host : 192.168.1.195 ohsora01 (SID=wms)

target oracle host : 192.168.1.210 ohsora04 (SID=wms)

networker server : 192.168.1.192 ohsnw19

 

 

 

 


사전 준비

각자 hosts 넣어주기

ohsora01의 DB 백업 받기

ohsora02에 ohsora01과 같은 인스턴스 네임의 DB 생성해두기

* SID가 같아야 한다

 

source를 백업할 때 구문에 PLUS ARCHIVELOG가 있는지 확인

 

 

target 호스트에서 AUTOBACKUP이 ON 되어 있는지 확인 (ON 되어 있어야한다)

 

 

소스 클라이언트 Remote access에 *@* 입력해두기

 



 


NMC에 깡통 클라이언트 생성

hosts에 깡통 클라이언트 넣어주기

넷워커 서버와 타겟 둘 다 넣어주기

 

넷워커 통신 확인

타겟에서 nsradmin -s ohsnw03

 

NMC에서 타겟 호스트 이름을 알아야 한다

 

아무것도 입력 안 하고 이름만 넣어주기

 

생성 완료

 

 

 

 


control file 확인

mminfo로 확인

mminfo -s ohsnw19 -avot -q "client=ohsora01"

컨트롤 파일 이름 : c-617472139-20240812-02

 

 

 

 


control file 복구

컨트롤파일 복구 받을 디렉토리 생성

mkdir /ora_recover

chown -R oracle:oinstall /ora_recover

 

 

 

컨트롤파일 복구

RMAN>
run {
allocate channel ch1 type 'SBT_TAPE' parms 'ENV=(NSR_CLIENT=ohsora01, NSR_SERVER=ohsnw19)';
restore controlfile to '/ora_recover/ohsconrol01.ctl' from "c-617472139-20240812-02";
release channel ch1;
}

 

controlfile 복원 성공

 

+ 경로를 지정해주지 않으면 /data/oradata/[database 이름]에 저장된다

 

+ controlfile이 2개 추출되었으면 다중화되어 있는 것. 둘 중에 하나만 써주면 된다

 

 

 

 


control file 지정 DB mount

DB nomount 상태 변경

SQL> shutdown immediate;

SQL> startup nomount;

 

DB가 nomount 상태여야 controlfile을 변경해 mount 할 수 있다

 

 

DB가 spfile인지 pfile인지 확인하기

SQL> show parameter spfile;

spfile의 VALUE 값이 있으면 spfile 사용 중이다

 

 

DB에 controlfile 지정해주기 (spfile)

spfile의 경우 파일 수정 없이 명령어로 controlfile 지정이 가능하다

SQL> ALTER SYSTEM SET CONTROL_FILES='/ora_recover/ohscontrol01.ctl' SCOPE=SPFILE;

 

 

 

DB 재기동 후 mount 시키기

SQL> shutdown immediate;

SQL> startup mount;

 

mount 확인

SQL> select status from v$instance;

 

 

control file 지정 확인

둘 중 하나

SQL> select name from v$controlfile;

SQL> show parameter control;

 

 

 


Datafile 복구

datafile 확인

RMAN> report schema;

File 넘버와 Datafile Name을 적는다

 

 

datafile 복구

원하는 경로 지정해서 datafile 복원(restore) 후 복구(recover)

RMAN>
run {
allocate channel ch1 type 'SBT_TAPE' parms 'ENV=(NSR_CLIENT=ohsora01, NSR_SERVER=ohsnw19)';
SET NEWNAME FOR DATAFILE 1 to '/ora_recover/system01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/ora_recover/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 4 to '/ora_recover/undotbs01.dbf';
SET NEWNAME FOR DATAFILE 5 to '/ora_recover/ohs.dbf';
SET NEWNAME FOR DATAFILE 7 to '/ora_recover/users01.dbf';
restore datafile 1, 3, 4, 5, 7;
switch datafile all;
recover database;
RELEASE CHANNEL ch1;
}

 

 

restore 결과

 

recover 결과

 

 

데이터 파일 복원 확인

 

 

 

 

+ catalog가 없어서 복구가 안 될 시

 

카탈로그 파일 확인

mminfo에서 controlfile 외의 모든 파일을 복원해줘야한다 (어떤 것이 필요한 catalog 파일인지 알 수 없어서)

 

카탈로그 복원

RMAN>
run {
allocate channel ch1 type 'SBT_TAPE' parms 'ENV=(NSR_CLIENT=ohsora01, NSR_SERVER=ohsnw19)';
catalog	backuppiece	'WMS_4b32941o_1_1';	
catalog	backuppiece	'WMS_4c329427_1_1';	
catalog	backuppiece	'WMS_4d32942a_1_1';	
catalog	backuppiece	'WMS_4e32942d_1_1';	
catalog	backuppiece	'WMS_4f32942h_1_1';	
catalog	backuppiece	'WMS_4g32942o_1_1';	
catalog	backuppiece	'WMS_4h32942v_1_1';	
catalog	backuppiece	'WMS_4i329436_1_1';	
catalog	backuppiece	'WMS_4j32943b_1_1';		
RELEASE CHANNEL ch1;
}

 

 

결과

 

 

+ redo로그 때문에 복구가 안 될 시 

 

 

redo log 파일 clear

redo log 파일 group 이름 확인

SQL> select group#, member from v$logfile;

 

redo log 파일 clear

SQL> alter database clear unarchived logfile group 1;

alter database clear unarchived logfile group 2;

alter database clear unarchived logfile group 3;

 

 

 

 

+ DBID가 달라서 복구가 안 될 시 

DBID 설정

RMAN> set DBID=617472139;

DBID는 controlfile 이름의 첫 번째 숫자

(c-617472139-20240811-00 에서 617472139가 DBID)

 

DBID 변경 확인

SQL> select DBID from v$database;

 

DBID를 지정해주면 RMAN 실행 시에도 출력된다 (mount 이상이어야 표시되는 것 같다)

 

 

 

+ Archive Log가 없어서 복구가 안 될 시

sequence 50의 archive log가 필요하다는 문구가 떨어졌다

 

 

아카이브 로그 확인

RMAN> list backupset of archivelog logseq=50;

 

LOW SCN이 2483048인 Sequence 50 아카이브 로그 파일이 조회된다

 

 

필요한 아카이브 로그 복원

RMAN>
run {
allocate channel ch1 type 'SBT_TAPE' parms 'ENV=(NSR_CLIENT=ohsora01, NSR_SERVER=ohsnw19)';
RESTORE ARCHIVELOG SEQUENCE=50;
RELEASE CHANNEL ch1;
}

 

 

 

+ 없는 sequence의 archivelog를 요구할 경우

소스 오라클에서 RMAN> list backupset of archivelog all;를 이용해  실제로 archivelog 파일이 있는지 확인하라.

소스에도 없는 것이 맞다면, 에러를 무시하고 SQL에서 alter database open resetlogs; 해버려라.

무시된 아카이브 로그만큼 데이터 손실이 있을 수 있으나, 실제로 소스에서도 해당 아카이브 로그가 없었다면 데이터 손실도 없을 것이다.

 

 

 

 

 


DB open

데이터베이스 오픈

SQL> alter database open resetlogs;

 

 

 

오라클 상태 확인

SQL> select status from v$instance;

 

테이블스페이스 복구 확인

SQL> select tablespace_name from dba_tablespaces;

 

 

테이블 복구 확인

SQL> select * from ohs;