상세 컨텐츠

본문 제목

2024년 1월 9일 5교시 시나리오 4. 특정 dbf 손상 + 백업 X + 리두 O

오라클 백업 리커버리

by 병아리 엔지니어 2024. 1. 9. 15:21

본문

 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ 시나리오 4 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

특정한 테이블스페이스가 손상되었는데 + 백업 없고 + 리두 정보는 있을 때 = 시나리오 4

 

select tablespace_name, file_name from dba_data_files;

테이블스페이스 확인하기

 

/u01/app/oracle/oradata/ora11g/users01.dbf

/u01/app/oracle/oradata/ora11g/sysaux01.dbf

/u01/app/oracle/oradata/ora11g/system01.dbf

/u01/app/oracle/oradata/ora11g/example01.dbf

/u01/app/oracle/oradata/ora11g/undotbs01.dbf

 

1. 실습용 테이블스페이스 (나중에 손상시킬) 생성하기

SQL> create tablespace insa_tbs datafile '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf' size 10m;

 

 

select tablespace_name, file_name from dba_data_files;

새로 만든 테이블스페이스 확인하기

 

/u01/app/oracle/oradata/ora11g/users01.dbf

/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf

/u01/app/oracle/oradata/ora11g/sysaux01.dbf

/u01/app/oracle/oradata/ora11g/system01.dbf

/u01/app/oracle/oradata/ora11g/example01.dbf

/u01/app/oracle/oradata/ora11g/undotbs01.dbf

 

select * from v$log;

리두로그 정보 확인

 

 

방금 만든 테이블스페이스 안에 테이블 생성하기

 

SQL>

create table hr.new(id number) tablespace insa_tbs;

insa_tbs 테이블스페이스 안에 hr.new 라는 테이블 만들어주기

 

SQL>

insert into hr.new(id) values(1);

hr.new 테이블 안에 인서트 작업 1건

 

SQL>

commit;

커밋

 

SQL>

select * from hr.new;

확인

 

그러면 이 시점에서 insa 라는 테이블스페이스는 백업되어있지 않지만

그래도 저 테이블스페이스 안에 있는 hr.new 라는 테이블에 대한

create, insert, commit 작업 이력은 리두에 기록되어 있게 된다.

 

2. 데이터파일 지워서 장애 유발하기

 

SQL> ! rm /u01/app/oracle/oradata/ora11g/insa_tbs01.dbf

insa 테이블스페이스 삭제

 

 

SQL> ! ls /u01/app/oracle/oradata/ora11g/insa_tbs01.dbf
ls: cannot access /u01/app/oracle/oradata/ora11g/insa_tbs01.dbf: No such file or directory

파일을 확인해보면 : 없다고 나온다.

 

 

하지만 어쨌든 리두는 있다.

 

SQL>

select * from v$log;

리두로그 정보 확인

 

 

SQL>

select name, status from v$datafile;

데이터파일의 이름과 상태를 보면: 파일들 중에서

/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf ONLINE

얘가 문제되는 파일이므로

 

3. 데이터파일 오프라인 상태로 떨어뜨리기

 

SQL>

alter database datafile '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf' offline drop;

오프라인 상태로 떨어뜨려놓고

 

이제 쟤를 복구해야 되는데

복구하자니 껍데기가 없다. (지워버렸으니 당연)

 

4. 데이터파일의 껍데기 만들기

 

SQL>

alter database create datafile '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf';

껍데기(아무것도 없는, 텅 비어있는 파일) 만들어주기

 

 

[oracle@oracle ora11g]$ ls
control01.ctl   redo01.log  sysaux01.dbf  undotbs01.dbf
example01.dbf   redo02.log  system01.dbf  users01.dbf
insa_tbs01.dbf redo03.log  temp01.dbf

만든 껍데기 확인

 

 

5. 빈 껍데기에 리두 적용하기

 

SQL>

alter database recover datafile '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf';

Database altered.

 

6. 오프라인 상태 온라인으로 올리기

 

SQL> select name, status from v$datafile;

데이터파일들 확인하기

 

 

문제되는 파일을 확인해보면: 오프라인 상태로 떨어져 있는데

alter database datafile '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf' online;

온라인 상태로 바꾸기

 

 

select * from hr.new;

저 테이블스페이스 안에 있는 테이블 확인해보기

 

 

조회되면: 테이블스페이스가 제대로 복구된 것...!

너무 기뻐... ㅠㅠ

 

백업받지 않은 테이블스페이스가 지워지면
테이블스페이스를 오프라인 상태로 바꾼 다음
아무것도 없는 빈 껍데기를 만들고 (테이블스페이스가 지워졌으니까)
그 껍데기 안에 리두를 적용하면 된다. (recover datafile)

 

여기까지가 4번째 시나리오

 

drop tablespace insa_tbs including contents and datafiles;

테이블스페이스 및 그 안에 들어있는 세그먼트 지우기

 

 

이번 복구는 리두가 있었기 때문에 가능했다.

(리두가 없었다면 시나리오 3 처럼 테이블스페이스를 지우는 수밖에는 없었을 것)

관련글 더보기