본문 바로가기

SQL

Flash Back 사용법

1. Flashback기술

* Flashback 기술은 recovery 기술의 혁신적 발전을 가져왔습니다.
* 기존 recovery 기술은 느립니다.

- 9i 때부터 Flashback 쿼리가 존재 했었습니다.
- 잘못된 데이터만이 아니라 전체 데이터베이스나 파일을 복원해야 합니다.
- 데이터베이스 로그의 모든 변경 사항을 검토해야 합니다.

※ 기존 백업이 느린 이유는 백업받아 놓은걸 올려놓고 로그(온라인로그, 아카이브로그)를 적용해야되기 때문에 느립니다.
백업 받아놓은것이 용량이 클경우 속도가 상당히 느립니다.


* Flashback은 빠릅니다.
- 변경 사항은 행 및 트랜잭션으로 나타낼 수 있습니다.
- 변경된 데이터만 복원됩니다.

* Flashback 명령은 쉽습니다.
- 복잡한 다단계 절차가 포함되지 않습니다.

※ Flashback 기술은 데이터를 보면서 시점을 앞뒤로 되돌릴 수 있는 새로운 기능을 제공합니다.
※ Flashback 기술은 간단히 변경된 데이터에만 작용하므로 recovery 과정이 매우 향상됩니다.



1) Flashback 기술을 사용되는 경우


표에서 Tx는 트랜젝션의 약자입니다.
Recycle bin은 윈도우시스템의 휴지통과 같은 개념입니다.
언두 데이터는 AUM(Automatic Undo Management)를 사용해야지만 사용할수 있습니다.


※ Flashback 기술은 오라클 데이터베이스에서 논리적 손상이 발생했을 때 데이터를 빠르고
쉽게 recovery해야 하는 경우에 사용합니다.



2) 오류를 Flashback

* Flashback Database는 해당 시점 이후에 발생한 모든 변경 사항을 실행 취소하여 해당 시점 이전으로 데이터베이스를 전환합니다.

* Flashback Table은 백업을 복원하지 않고 과거의 특정 시점으로 테이블을 recovery합니다.
* Flashback Drop은 실수로 삭제된 테이블을 복원합니다.


3) Flashback Database

Flashback Database 작업은 다음 특성을 갖습니다.

* 데이터베이스에 대해 되감기 버튼처럼 작동합니다.
* 유저에 의해 논리적 데이터가 손상된 경우 사용할 수 있습니다.


 


※ 데이터베이스에 물리적 손상이 발생했거나 media가 손실된 경우에는 기존 recovery 방법을 사용해야 합니다.

* 복원 시간 단축


- Flashback Database는 Flashback Database 로그라는 일종의 로그 파일을 사용하여 구현됩니다.
- 오라클 데이터베이스는 Flashback Database 로그에 있는 데이터 블록의
"이전 이미지"를 주기적으로 기록합니다.
- 블록 이미지를 재사용하여 원하는 목표 시간 직전에 flashback 로그가 캡처된 시점으로
데이터 파일 변경 사항을 빠르게 취소할 수 있습니다.
- 그런 다음 데이터 간의 차이(gap)를 메우기 위해 리두 로그 파일의 변경 사항이 적용됩니다.
- Flashback Database 로그는 Flash Recovery Area에서 자동으로 생성되고 관리됩니다.


* 고려사항

- Flashback Database 작업이 완료되면 다음 방법 중 하나를 사용하여 데이터베이스를 열어야 합니다.
* 정확한 목표 시간 또는 SCN이 사용되었는지 확인하려면 읽기 전용 모드로 엽니다.
* 갱신을 허용하려면 RESETLOGS 파라미터를 사용합니다.

- flashback의 반대는 recovery입니다.
* 따라서 Flashback Database 작업을 언두하려면 데이터베이스를 앞으로 recovery해야 합니다.


* 제한사항

- 다음 상황에서는 Flashback Database를 사용할 수 없습니다.
* 콘트롤 파일이 복원되었거나 재생성된 경우
* 테이블스페이스가 삭제된 경우
* 데이터 파일이 축소(shrink)된 경우



* 활성화

- Flashback Database는 Enterprise Manager에서 Maintenance 탭 페이지의
Recovery Settings 링크를 사용하여 활성화할 수 있습니다.
- 이 페이지의 Flash Recovery 영역에서 체크 박스를 선택하고 retention 시간
(데이터베이스 flashback을 위해 과거로 돌아갈 수 있는 시간 분량)을 지정합니다.



4) Flashback Table

* Flashback Table은 특정 시점으로 테이블을 recovery합니다.
* Flashback Table은 in-place 작업입니다.
(해당 종속 객체에 수행한 변경 사항만 롤백하는 in-place 작업입니다.)
* 데이터베이스는 온라인 상태를 유지합니다.


* Flashback Table을 사용하여 백업을 복원하지 않고 테이블을 특정 시점으로 recovery할 수 있습니다.
* Flashback Table 작업을 수행하기 위해 언두 테이블스페이스에서 데이터를 검색합니다.
* 테이블을 flashback하려면 FLASHBACK TABLE 권한이 필요합니다.
* flashback 작업을 수행 중인 테이블에서 행 이동이 활성화되어야 합니다.



* 테이블에서 행이동 활성화

※ Enterprise Manager를 사용하여 테이블에서 행 이동을 활성화하려면
다음 단계를 수행하십시오.


1.Administration 속성 페이지의 Schema 영역에서 Tables를 선택합니다.
2.행 이동을 활성화할 테이블 이름을 누릅니다. View Table 페이지가 나타납니다.
3.Edit를 눌러 Edit Table 페이지로 이동합니다.
4.Options 탭을 눌러 테이블의 Enable Row Movement 설정을 변경할 수 있습니다.
5.Enable Row Movement를 Yes로 설정하고 Apply를 누릅니다.

※ 라인모드
SQL> SHOW USER
USER은 "SYS"입니다. -- scott에게 flashback 권한을 부여
SQL> grant flashback any table to scott; -- 권한이 부여되었습니다.

SQL> conn soctt/tiger -- USER은 "SCOTT"입니다.

SQL> alter table emp enable row movement; -- 테이블이 변경되었습니다.

-- emp 테이블과 dept 테이블은 FK키로 연결되어 있는 테이블입니다.
-- 이런경우 연과되는 테이블도 행 이동 활성화를 해줘야 됩니다.

SQL> alter table dept enable row movement; -- 테이블이 변경되었습니다

* Flashback Table 수행

※ 다음 단계를 수행하여 Enterprise Manager에서 테이블을 flashback할 수 있습니다.

1.Maintenance 속성 페이지의 Backup/Recovery 영역에서Perform Recovery를 선택합니다.
Perform Recovery 페이지가 나타납니다.
2.Object Level Recovery 영역의 Object Type drop-down list에서 Tables를 선택합니다.
3.Operation Type으로 Flashback Existing Tables를 선택합니다. Perform Object Level Recovery를 누릅니다.

"Perform Object Level Recovery: Point-in-time" 페이지가 표시됩니다.
4."Flashback to a timestamp" 또는 "Flashback to a known SCN"을 선택한 다음
flashback할 시간 기록 또는 SCN을 지정하고 Next를 누릅니다.
5.Add Tables를 눌러 flashback 작업 대상 리스트에 테이블을 추가합니다. Next를 누릅니다.
6.종속 테이블이 있는 경우 Dependency Options 페이지가 나타납니다.종속 테이블을 처리할 원하는 옵션을 선택합니다.
일반적으로 일관된 flashback을 보장하도록 "Cascade"를 선택합니다.Next를 누릅니다.
7."Perform Object Level Recovery: Review" 페이지가 나타납니다.
정보를 검토하고 Submit를 누릅니다. Confirmation 페이지가 나타납니다.

※ Administration 페이지의 Schema 영역에 있는 Tables 링크에서도 테이블을 flashback할 수 있습니다

* Flashback Table 고려사항

- FLASHBACK TABLE 명령은 단일 트랜잭션으로 실행되며 배타적 DML lock을 획득합니다.
- 통계는 flashback되지 않습니다.
- 현재 인덱스와 종속 객체는 유지됩니다.

- Flashback Table 작업의 특징


* 시스템 테이블에서 수행될 수 없습니다.
* DDL 작업을 확장할 수 없습니다.
* Alert log file에 기록됩니다.
* 언두 및 리두 데이터를 생성합니다.


5) Flashback Drop

-- 사용자 오류 발생
SQL> DROP TABLE employees;

-- 복구
SQL> FLASHBACK TABLE employees TO BEFORE DROP;

* Enterprise Manager를 통해 삭제된 테이블 Flashback

- Database Control 콘솔을 사용하여 삭제된 테이블을 flashback하려면
Maintenance 페이지의 Backup/Recovery 영역에서 Perform Recovery를 선택합니다.

- Type 영역에서 Object Type에 대해 Tables를 선택하고 Operation Type 영역에
Flashback Dropped Tables를 선택합니다. 완료된 후에 Perform Object Level Recovery를 누릅니다.
- 이제 Recycle bin에서 삭제된 테이블을 선택할 수 있는
"Perform Object Level Recovery: Dropped Objects Selection" 페이지가 나타납니다.
View Content를 눌러 삭제된 테이블의 내용을 query할 수도 있습니다. recovery할 테이블을 선택하고 Next를 누릅니다.
- 동일한 스키마 내에 동일한 이름을 가진 테이블이 존재하는 경우 테이블의 이름을 바꿀 수 있는

"Perform Object Level Recovery: Rename" 페이지가 나타납니다. Next를 눌러 계속합니다.
"Perform Object Level Recovery: Review" 페이지에서 작업의 세부 내용을 검토하고
해당 SQL 문을 표시할 수 있습니다. 준비가 되면 Submit를 누릅니다.
이제Confirmation 페이지가 나타납니다. OK를 눌러 Maintenance 페이지로 돌아갑니다.

* Flashback Drop 고려사항

- Flashback Drop은 다음 테이블에서 작동하지 않습니다.
* SYSTEM 테이블스페이스에 있는 테이블
* Fine-Grained Auditing 또는 Virtual Private Database를 사용하는 테이블
* 딕셔너리 관리방식의 테이블스페이스에 있는 테이블
* 공간 부족으로 수동 또는 자동 삭제(purging)를 통해 삭제된 테이블

- 다음에 대해서는 종속성이 보호되지 않습니다.
* Bitmap-join 인덱스
* Materialized view 로그
* 참조 무결성 제약 조건
* 테이블보다 먼저 삭제된 인덱스



6) Flashback Time Navigation

* Flashback Query
- 지정된 시점의 모든 데이터를 query합니다.

* Flashback Versions Query
- 두 시간대 사이에 있는 행의 모든 버전을 봅니다.
- 행을 변경한 트랜잭션을 봅니다.

* Flashback Transaction Query
- 트랜잭션에 의해 수행된 모든 변경 사항을 봅니다.

* Flashback Query 개요

- SELECT 문의 AS OF 절을 사용하여 데이터를 확인할 시간 기록을 지정할 수 있습니다.
- 이 기능은 데이터 불일치 분석에 유용합니다.


※ AS OF 절 다음에 TIMESTAMP 또는 SCN이 올 수 있습니다.

* Flashback Versions Query 개요


- Flashback Versions Query 기능을 통해 VERSIONS 절을 사용하여 두 시점 또는
두 SCN 사이에 존재하는 행의 모든 버전을 검색할 수 있습니다

출처 : http://www.volkit.com/

 

Data Base의 정보들을 실수로 삭제 한 경험은 한번씩은 있을 거 같다.

이렇게 실수로 삭제 한 데이터들을 rollabck 할 수 있는 방법이 있다.

commit을 한 상태라도 호출 한번으로 원상 복구 할 수 있다.

drop 된 table : flashback table 테이블명 to before drop


삭제된 data 복구 : insert into  테이블명  select * from  테이블명  as of timestamp(SYSTIMESTAMP - INTERVAL '240'MINUTE)

전 요렇게 사용함.

SELECT *
  FROM 테이블명 AS OF TIMESTAMP(SYSDATE - 240)