상세 컨텐츠

본문 제목

2024년 1월 31일 2교시 플래시백 데이터베이스

오라클 백업 리커버리

by 병아리 엔지니어 2024. 1. 31. 11:42

본문

(6:00)

★ 플래시백 데이터베이스 Flashback Database

- 불완전한 복구와 비슷하나 백업을 사용하지 않는다는 장점이 있다.

- 데이터베이스에 대한 되감기 버튼처럼 작동

- 이전 데이터로 되감기 위해서 리두 정보와 아카이브 정보를 이용한다.

  그래서 아카이브 로그 모드에서만 가능하다.

- RVWR 이라는 백그라운드 프로세스가 담당한다.

- 사용하려면 두 가지 작업을 해야 하는데 (10:59)

    1. 시간을 지정해야 하고(db_flashback_retention_target 라는 파라미터로 지정)

    2. 플래시백 데이터베이스를 활성화시켜야 한다.


 

1. 시간 지정하기

 

SYS@ora11g> show parameter db_flashback

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440   --- 이 값은 분 단위: 1440 분 = 하루 (24시간)

 

SYS@ora11g> alter system set db_flashback_retention_target = 2880 scope = both;

파라미터 값 바꾸기

 

SYS@ora11g> show parameter db_flashback_retention_target;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     2880

 

값이 바뀌어 있는 것이 보인다.

 

2. 플래시백 데이터베이스 활성화시키기

 

SYS@ora11g> alter database flashback on;

SYS@ora11g> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

 

플래시백 데이터베이스가 활성화되어 있는지 보기 : YES 라고 나오면 활성화된 것

 

테이블을 truncate 했을 경우: 백업본을 부어넣고 불완전 복구할 수밖에 없는데

백업본을 사용하면 - 그 테이블이 있는 테이블스페이스만 복구할 수는 없다.

(DB 전체가 이전 시간으로 되돌아가야 함)

 

플래시백 데이터베이스도 백업본을 사용하지 않는다 뿐이지

특정 시간으로 되돌아가는 것이기 때문에, 원하는 테이블을 살렸다 해도 다른 데이터들에 손실이 발생할 수 있다.

그래서 매우 조심해서 사용해야 한다.

(보통은 그냥 클론 DB 를 만들어서 테이블 복구하는 것이 일반적)


 

1. 샘플 테이블 만들기

 

SYS@ora11g> create table hr.ian as select * from hr.employees;

 

테이블 만들고

 

SYS@ora11g> select count(*) from hr.ian;

  COUNT(*)
----------
       107

 

테이블 조회해보기

 

SYS@ora11g>

show parameter db_recovery_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      /u01/app/oracle/fast_recovery_
                                                 area
db_recovery_file_dest_size           big integer 4152M

 

select * from v$flash_recovery_area_usage;

백업피스의 크기, 플래시백 로그의 크기 확인

 

 

SYS@ora11g> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
31-JAN-24 11.23.13.595691 AM +09:00

 

SYS@ora11g> create restore point before_hr_ian_trunc;
restore point = DB 에서 복구 지점 생성 (데이터베이스를 이전 상태로 복구하는 데 사용)

before_hr_ian_trunc 라는 이름의 복구 지점을 생성해서

이 복구 지점보다 이전 시점으로 DB 를 복구할 수 있다.

(QUESTION. 근데 이게 의미가 있나...? 얘는 그냥 truncate 하기 이전에 이게 있을 때나 얘로 복구할 수 있는 거잖아?

현장에서도 이렇게 테이블 하나 truncate 하기 전에 복구지점 하나 만들어놓고... 하는 식으로 작업하는 거야?)

(ANSWER. 시간 모르면 로그 마이너 써서 캐면 된다.)

 

select * from v$restore_point;

DB 에 생성된 복구 지점 목록 보기: 방금 만든 before_hr_ian_trunc 라는 복구지점이 보인다.

 

 


2. 샘플 테이블 잘못 지우기

 

SYS@ora11g> truncate table hr.ian;

샘플 테이블을 (잘못) truncate

 

SYS@ora11g> select count(*) from hr.ian;

  COUNT(*)
----------------
         0

 

테이블을 조회하면: 원래 107건으로 나왔던 데이터가 0건으로 나온다.

 

* delete 와 truncate 의 차이점: delete 는 롤백 가능, truncate는 롤백 불가 (11시 26분)

truncate 는 extent 정보를 해지하기 때문에 그 익스텐트 정보를 가지고 있는 딕셔너리에 갱신 조작이 발생한다.

truncate 도 언두를 발생시키기는 하지만 매우 작게 발생시킨다.

그래서 예를 들어 천만 건 데이터를 삭제하는 경우: 언두가 발생하지 않도록 truncate 해야 한다.

(!!!!!!!!!!!!!!!!!! delete 하면 절대 안된다 !!!!!!!!!!!!!!!!!!!!)


 

3. 잘못 truncate 한 테이블 살리기

 

3-1. DB 내리기

 

SYS@ora11g> shutdown immediate

Database closed.
Database dismounted.
ORACLE instance shut down.

 

3-2. DB 마운트 단계까지 올리기

SYS@ora11g> startup mount

 

3-3. DB 되감아서 테이블 살리기

SYS@ora11g> flashback database to restore point before_hr_ian_trunc;
Flashback complete.

(여기서 point 말고 timestamp 시간 쓰면 타임스탬프 뒤에 나오는 시간으로 돌아간다.

파라미터로 지정한 시간 동안만 가능)

 

이제 저 시간으로 전체 DB가 되돌아감

 

3-4. 데이터 확인: 무조건 DB 를 read only 모드로 올려서 확인해야 한다.

 

SYS@ora11g> alter database open read only;
Database altered.

SYS@ora11g> select count(*) from hr.ian;

  COUNT(*)
----------
       107

 

테이블 조회됨: 되감기 성공

 

하지만 저대로 계속 read only mode 로 DB 를 운영할 수 없으므로

 

3-5. 다시 DB 내리기

SYS@ora11g> shutdown immediate

 

3-6. 마운트 단계까지만 DB 올리기

SYS@ora11g> startup mount

 

3-7. resetlogs 로 DB 열기

SYS@ora11g> alter database open resetlogs;

 

3-8. 와중에 DB 를 오픈하고 나서 다시 hr.ian 테이블을 조회해 봤더니

 

SYS@ora11g> select count(*) from hr.ian;

  COUNT(*)
----------
       107

 

조회가 된다. (DB가 이전 시점으로 되돌아간 것)

 

select a.group#, b.sequence#, a.member, b.bytes/1024/1024MB, b.archived, b.status, b.first_change#, b.next_change#
from v$logfile a, v$log b
where a.group# = b.group#
order by 1;

 

리두 정보 확인: 리두가 1부터 다시 시작하고 있다.

 

 

 

이제 과거 백업본은 의미가 없게 되었으므로 백업을 다시 받아야 한다.

 

하지만 이 DB 되감기도

db_flashback_retention_target 파라미터에 지정된 값(2880분 = 이틀) 동안만 가능

 

점심 먹기 전까지는 유저 생성해서 권한 부여, 테이블 생성한 후

유저 drop 하고 플래시백 데이터베이스 기능으로 유저를 다시 살려 보자.

(혼자서)

관련글 더보기