상세 컨텐츠

본문 제목

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

오라클 백업 리커버리

by 병아리 엔지니어 2024. 1. 9. 14:34

본문

 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★  ★ 시나리오 3 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

 

시나리오 3. 데이터파일이 깨졌는데 백업받아놓은 것도 없고 리두 정보도 없을 때 어떻게 복구할까?

스포일러: 문제가 되는 테이블을 offline drop 해서 오프라인 상태로 떨어뜨려 놓고

drop tablespace 해서 삭제한다.

 

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

 

백업본 확인해보기

 

[oracle@oracle ~]$ cd /home/oracle/backup/noarch

 

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

 

 

백업파일이 다 있으므로 두려워하지 말고 시나리오대로 하면 된다!


 

<<시나리오 3>> 시작

 

1. 테이블스페이스 만들기

 

(d 102에서 혹은 퍼티 sys 에서)

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

insa_tbs 라는 이름의 테이블스페이스 만들기

 

select tablespace_name, file_name from dba_data_files;

만든 테이블스페이스 확인하기: insa_tbs 가 만들어져 있는 것이 보인다.

 

 

select * from v$log;
리두로그 정보 확인

 

 

select name, checkpoint_change# from v$datafile;

(d 102) 현재 데이터 파일 헤더에 있는 체크포인트 정보 확인하기

 

 

다른 데이터파일들끼리는 SCN 번호가 다 같은데

새로 만든 insa_tbs 라는 테이블스페이스의 체크포인트 SCN 번호만 서로 다르다.

그리고 insa01 은 우리가 따로 백업받지 않았다.

 

2. 테이블스페이스 지워서 장애 유발하기

 

[oracle@oracle noarch]$ rm /u01/app/oracle/oradata/ora11g/insa_tbs01.dbf

[oracle@oracle noarch]$ 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

파일을 확인해보면: 파일이 없다고 나옴

 

(실수로 파일을 날렸을 때 해결방법:

뭘 잘못했는지 먼저 체크해보기, 백업시나리오 참고, 운영DB 말고 다른 DB에서 미리 수행해보고

그 다음에 운영 DB 에 테스트해보자... 침착하게...!)

 

[oracle@oracle noarch]$ exit

 

3. DB 내리기

 

SQL> shutdown immediate

 

ORA-01116: error in opening database file 3
ORA-01110: data file 3: '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

insa_tbs 에 속한 3번 데이터파일이 깨져서 DB 내려가지 못하고 에러 발생

 

SQL> shutdown abort
ORACLE instance shut down.

shutdown abort 는 먹힌다.

shutdown abort 로 DB 내리기

 

(만약 shutdown abort 도 안먹힐 경우: ! 했다가 exit 로 다시 sql+로 가서 shutdown abort 해보기

ORA-24324 오류가 뜬다.

이건 DB가 불완전하게 내려간 것)

 

4. DB 올리기: 있어야 할 위치에 데이터파일이 없어서 DB 가 올라오지 않는다.

 

SQL> startup
ORACLE instance started.

 

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             448791588 bytes
Database Buffers          255852544 bytes
Redo Buffers                5419008 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/u01/app/oracle/oradata/ora11g/insa_tbs01.dbf'

 

그런데 얘는 복구 작업도 못한다. 왜냐하면 백업본이 없기 때문에...

(리두가 있고 없고와는 상관이 없다. 백업본이 없어서 복구 못함)

 

 

여기서 할 수 있는 시나리오가 2가지 있다.

 

첫 번째 시나리오: <<시나리오 3>>

 

이 insa 는 테이블스페이스만 만들어놓았을 뿐 세그먼트 생성한 게 하나도 없다.

그래서 날려버리는 게 더 나을 수 있다.

 

SQL>

select name, status from v$datafile;

데이터파일의 이름과 상태를 보면

 

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

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

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

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

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

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

insa 는 손상되어서 있지도 않은 파일인데 online 상태라고 거짓말하는 것이 보인다.

이때 우리는 문제되는 파일 insa_tbs 만 얼른 오프라인으로 떨어뜨리고 DB 를 열면 된다.

 

시나리오 3-1. 문제되는 데이터파일을 오프라인 상태로 떨어뜨리기

 

SQL>

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

노아카이브 로그 모드에서 데이터 파일을 오프라인으로 떨어뜨릴 때는 꼭 뒤에 drop 을 붙여주어야 한다.

 

 

SQL> select name, status from v$datafile;

데이터파일의 이름과 상태 보기

 

 

문제되는 테이블스페이스를 보면: 아까는 분명 online 이라고 했는데

offline 으로 떨어뜨리고 나서는 recover 라는 표시가 뜬다.

(복구해야 하는 파일이라는 뜻)

 

그리고 저 문제되는 파일이 오프라인 모드로 떨어졌기 때문에

이제는 DB를 올릴 수 있다.

 

시나리오 3-2. DB 열기

 

SQL> alter database open;

 

 

select count(*) from hr.employees;

DB 에 있는 테이블 아무거나 조회해서 DB 가 진짜로 잘 열렸는지 확인해보기

 

 

그리고 아까 insa 의 status 가 RECOVER 로 찍혀서 나왔었는데

이건 리커버리 못함. 백업파일이 없기 때문에...

이건 그냥 삭제하는 방법말고는 다른 도리가 없다.

 

3-3. insa 테이블스페이스 삭제하기

 

SQL> drop tablespace insa_tbs;

얘는 이 안에 세그먼트도 없기 때문에 그냥 이대로 삭제하면 된다.

 

(d 102)

select tablespace_name, file_name from dba_data_files;

데이터파일들을 조회해보면: insa 가 사라져 있다.

 

관련글 더보기