환경
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;