상세 컨텐츠

본문 제목

2024년 1월 9일 3교시 시나리오 2. 특정 dbf 손상 + 백업본 O + 백업 이후 리두 정보 X = 완전 복구 불가능

오라클 백업 리커버리

by 병아리 엔지니어 2024. 1. 9. 12:25

본문

 

 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★  시나리오 2 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★

특정한 데이터파일이 손상됨 + 백업 이후 리두정보 없음 = 완전 복구 불가능 = 시나리오 2

 

SQL> conn / as sysdba
Connected.

 

(conn 을 반복하다 보면 프로세스들이 엉켜서 말을 안 들을 수가 있는데

그때는 창을 끊고 다시 접속해서 해보자.)

 

select current_scn from v$database;

current 한 SCN 번호 확인하기: 1646212

 

 

select name, checkpoint_change# from v$datafile;

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

 

 

select * from v$log;

리두 정보 확인

 

 


 

★ 원복 작업

(개념 공부 중이라면 아래 내용은 한참 건너뛰기, '시나리오 시작' 으로 검색해서 시작 부분으로 가기)

 

DB 내리기

 

SQL>

shutdown immediate

 

OS 로 나가서 백업파일이 있는 위치로 가기

 

SQL> !

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

 

[oracle@oracle noarch]$ pwd
/home/oracle/backup/noarch

 

백업받아놓은 파일 원래 위치로 돌려놓기 (불완전 복구)

이렇게 하면 DB 가 아예 과거 시점으로 돌아가게 된다.

 

[oracle@oracle noarch]$ cp -av *.* /u01/app/oracle/oradata/ora11g/

 

 

백업이 다 끝났으면 다시 DB 올리기

 

SQL> startup

 

그리고 다시

select current_scn from v$database;

current 한 SCN 번호 확인해 보면: 1647564

어... 왜 늘어났지... 원복을 했는데...?

아까는 1646212 이었으니까 그것보다 더 줄어들어 있어야 맞는데...

혹시 복습시간에 잘못 붙여넣은 거 아냐?

 

 

select name, checkpoint_change# from v$datafile;

현재 데이터 파일 헤더에 있는 체크포인트 정보 확인

 

 

select * from v$log;

리두 정보 확인

 

 

커런트 리두의 SCN 번호가 1639496: DB 시간이 과거로 되돌아가 있는 것이 보인다.

 

다시 hr 로 로그인하고

 

conn hr/hr

 

SQL> conn hr/hr
Connected.

 

SQL> select * from new;

이 상태에서 new 테이블을 조회해보면: 없다고 하면서 오류가 나온다.

(왜? DB 가 과거 시점으로 되돌아갔기 때문)

 

 

★ 테이블을 다시 한번 생성해보자.

 

(hr)

SQL> create table new(id number) tablespace example;
Table created.

 

 

테이블 생성

(테이블 생성 정보가 리두 그룹에 기록된다.)

 

SQL>

insert into new(id) values(1);
1 row created.

인서트 작업

 

 

SQL> commit;
Commit complete.

 

커밋

 

SQL> select * from new;

        ID
----------
         1

 

테이블 조회해보기

일련의 정보들은 모두 current 한 리두 그룹에 저장되어 있게 된다.

 

다시 sys로

 

SQL> select * from v$log;

리두 정보 확인

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
         1          1          4   52428800        512          1 NO
CURRENT                1639496 09-JAN-24   2.8147E+14

         2          1          0   52428800        512          1 YES
UNUSED                       0                      0

         3          1          0   52428800        512          1 YES
UNUSED                       0                      0

 

로그 스위치 강제로 발생시키기

 

SQL>

alter system switch logfile;
System altered.

 

/

/

 

(강제로 여러 번 발생시킴)

 

SQL> select * from v$log;

리두 정보 확인

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC
---------- ---------- ---------- ---------- ---------- ---------- ---
STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------------- ------------- --------- ------------ ---------
         1          1         10   52428800        512          1 NO
CURRENT                1647855 09-JAN-24   2.8147E+14

         2          1          8   52428800        512          1 NO
INACTIVE               1647849 09-JAN-24      1647852 09-JAN-24

         3          1          9   52428800        512          1 NO
INACTIVE               1647852 09-JAN-24      1647855 09-JAN-24

 

기존 데이터들은 모두 없어짐 (overwrite 됨)

(마지막 백업 이후에 변경 이력 정보가 없다면 어떻게 될지를 보기 위해서 하는 것)

 

현재 SCN 번호 확인해보기

 

SQL> select current_scn from v$database;

 

CURRENT_SCN
-----------
    1647908

 

 

SQL> select name, checkpoint_change# from v$datafile;

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

 

 

 

select f.file_name
from dba_extents e, dba_data_files f
where e.file_id = f.file_id
and e.segment_name = 'NEW'
and e.owner = 'HR';

hr 이 가지고 있는 new 테이블이 어느 테이블스페이스에 있는지 조회

 


 

<<시나리오 2>>

시나리오 시작

 

1. DB 내리기

 

SQL>

shutdown immediate


Database closed.
Database dismounted.
ORACLE instance shut down.

 

SQL> !

OS 로 나와서

 

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

[oracle@oracle ~]$ rm /u01/app/oracle/oradata/ora11g/example01.dbf

[oracle@oracle ~]$ ls /u01/app/oracle/oradata/ora11g/example01.dbf

ls: cannot access /u01/app/oracle/oradata/ora11g/example01.dbf: No such file or directory

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

 

3. 다시 DB 올리기 (데이터 파일이 있어야 할 위치에 없어서 오류가 발생한다)

SQL> startup

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01110: data file 5: '/u01/app/oracle/oradata/ora11g/example01.dbf'

 

 

백업본이 있는 곳으로 가서

 

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

[oracle@oracle noarch]$ ls example01.dbf
example01.dbf

 

example01 파일이 있는지 확인해보면: 있다.

 

4. 백업 파일 원래 위치에 카피해주기

 

[oracle@oracle noarch]$ cp -av example01.dbf /u01/app/oracle/oradata/ora11g/example01.dbf

‘example01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/example01.dbf’

 

 

 

5. 데이터베이스 복구하기 recover database

깨진 데이터파일 대신 백업파일을 원래 위치로 부어넣어 복구를 해주긴 했지만

그냥 저대로 두면 다른 데이터파일들과 싱크가 맞지 않는다. 그래서 싱크 맞추는 작업을 꼭 해주어야 한다.

 

SQL> recover database;

 

ORA-00279: change 1642105 generated at 01/09/2024 10:20:09 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ORA11G/archivelog/2024_01_09/o1_mf_1_4_%u_.ar
c
ORA-00280: change 1642105 for thread 1 is in sequence #4

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

 

 

오류 발생:

마지막 체크포인트 이후의 SCN 번호부터 해서 #4 번의 리두가 필요한데 없다는 뜻

(아까 로그 스위치를 발생시켜서 다 overwrite 시켜 놨으니 당연하겠지...)

밑에 옵션들 중에 AUTO 는 알아서 해달라는 뜻인데

알아서 해달라고 해도 리두가 없기 때문에 복구를 못해준다.

 

 

auto 를 선택했는데 리두가 없어서 복구할 도리가 없으니 얘도 어쩔 수 없이 또 오류를 발생시킴:

완전 복구 불가

 

이럴 때는 어쩔 수 없이 shutdown abort 해서 또 DB를 내려야 한다.

 

6. shutdown abort 로 DB 내리기

 

SQL> shutdown abort
ORACLE instance shut down.

 

7. OS 로 나가서 전체 백업본 다시 부어넣기

 

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

백업파일이 있는 위치로 가기

(사실 저 위치까지 계속 굳이 안가도 되는데... 처음이니까 연습삼아 해보는 것)

 

[oracle@oracle noarch]$ cp -av *.* /u01/app/oracle/oradata/ora11g/

백업본 부어넣기

더보기

[oracle@oracle noarch]$ cp -av *.* /u01/app/oracle/oradata/ora11g/
‘control01.ctl’ -> ‘/u01/app/oracle/oradata/ora11g/control01.ctl’
‘example01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/example01.dbf’
‘redo01.log’ -> ‘/u01/app/oracle/oradata/ora11g/redo01.log’
‘redo02.log’ -> ‘/u01/app/oracle/oradata/ora11g/redo02.log’
‘redo03.log’ -> ‘/u01/app/oracle/oradata/ora11g/redo03.log’
‘sysaux01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/sysaux01.dbf’
‘system01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/system01.dbf’
‘temp01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/temp01.dbf’
‘undotbs01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/undotbs01.dbf’
‘users01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/users01.dbf’

 

8. 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.
Database opened.

 

select current_scn from v$database;

커런트한 SCN 번호 확인하기


select name, checkpoint_change# from v$datafile;

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

 

select * from v$log;

리두 정보 확인

 

얘네도 체크해 보면서 아까와 비교해보기

 

 

 

관련글 더보기