Flashback 조회와 테이블 복구
UNDO로 과거 시점의 데이터를 조회하는 Flashback Query, 테이블을 과거 시점으로 되돌리는 Flashback Table, 휴지통에서 삭제된 테이블을 되살리는 Flashback Drop의 조건과 명령
#핵심 요약
Flashback Query(AS OF TIMESTAMP)는 UNDO로 과거 시점의 데이터를 조회함
Flashback Table은 백업이 아니라 UNDO 테이블스페이스의 정보로 테이블을 과거 시점으로 되돌림
나머지 데이터베이스는 그대로 쓸 수 있음
Flashback Table에는 행 이동(ENABLE ROW MOVEMENT)이 켜져 있어야 하고, 대상 시점까지의 UNDO가 남아 있어야 함
Flashback Drop(FLASHBACK TABLE ... TO BEFORE DROP)은 UNDO가 아니라 휴지통에서 삭제된 테이블을 되살림
#개념과 동작 원리
#Flashback Table
새 행은 지우고 예전 행은 다시 넣는 방식으로 동작함
권한: FLASHBACK ANY TABLE 시스템 권한 또는 그 테이블의 FLASHBACK 객체 권한, 그리고 테이블의 READ 또는 SELECT, INSERT, DELETE, ALTER 권한
대상이 될 수 없는 것: 클러스터에 속한 테이블, 구체화 뷰, AQ 테이블, 정적 데이터 딕셔너리 테이블, 시스템 테이블, 원격 테이블, 객체 테이블, 중첩 테이블, 개별 파티션
현재와 대상 시점 사이에 테이블 구조가 바뀌면 안 됨(이동, TRUNCATE, 제약 추가, 열 수정, 삭제 등)
행 이동이 켜져 있어야 함
되돌린 뒤 ROWID가 바뀌므로 ROWID에 의존하는 애플리케이션에는 쓸 수 없음
Flashback Table을 위한 UNDO_RETENTION 설정 지침은 86400초(24시간) 이상임
설정값만으로 필요한 UNDO 보존이 항상 보장되지는 않음
UNDO 보존은 UNDO 공간과 보존에 있음
FLASHBACK TABLE은 롤백할 수 없으므로 실행 전에 현재 SCN을 기록해 두라고 권함
타임스탬프와 SCN의 대응은 최대 약 3초 어긋날 수 있어, 정확한 시점은 SCN으로 지정함
기본적으로 작업 중 트리거를 끄고, ENABLE TRIGGERS를 주면 켠 채로 둠
#Flashback Drop
휴지통은 SYSTEM이 아닌 로컬 관리 테이블스페이스에서만 쓸 수 있음
공간이 필요해지면 오래된 객체부터 지워지므로 얼마나 남아 있을지 보장되지 않음
원래 이름이나 휴지통 이름(BIN$...)으로 되살림
같은 원래 이름이 여럿이면 가장 최근에 지운 것부터 되살아남RENAME TO로 새 이름을 줄 수 있음
종속 인덱스는 휴지통 이름 그대로 돌아오므로 필요하면 이름을 바꿈
참조 제약은 휴지통이 보존하지 않으므로 다시 만듦
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| AS OF | 지정 시점에 커밋되어 있던 데이터 조회임 |
| VERSIONS BETWEEN | 지정 구간에 존재한 커밋 버전들을 조회하며 트랜잭션별 모든 중간 DML을 한 줄씩 보장하는 기능은 아님 |
| VERSIONS_STARTSCN, ENDSCN | 버전이 시작, 종료된 SCN이며 조회 구간 이전에 만들어진 버전의 시작값은 NULL일 수 있음 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | und_use, emp의 과거 상태, 버전, 현재 SCN, UNDO 설정과 휴지통 객체 |
| 필요 권한 | 과거 조회는 대상 FLASHBACK과 READ 또는 SELECT, 과거 복원은 추가 INSERT, DELETE, ALTER 권한이 필요함 V$ 조회는 관리자 조회 권한 필요 |
| 바꿀 입력값 | 테이블명, <ENAME>, <SCN>, 휴지통 이름, <NEW_NAME>과 목표 시각 |
| 결과 해석 | 버전 메타데이터의 의미와 복원 조건을 구분하며 실습에 없는 출력, 복구 성공은 기재 없음 |
#Flashback Query와 Flashback Table
SELECT COUNT(*) FROM und_use AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '7' MINUTE;ALTER TABLE und_use ENABLE ROW MOVEMENT;
FLASHBACK TABLE und_use TO TIMESTAMP SYSTIMESTAMP - INTERVAL '10' MINUTE;결과 해석:
실습에서는 FLASHBACK TABLE und_use TO systimestamp - interval '10' minute로 TIMESTAMP 키워드 없이 적었음
시각으로 되돌리는 구문에는 TO TIMESTAMP <식>이 필요함
#실행 전 확인
SELECT current_scn FROM v$database;
SELECT name, scn, time FROM v$restore_point;
SELECT name, value/60 minutes_retained FROM v$parameter WHERE name = 'undo_retention';결과 해석: 개별 실행 출력은 기재 없음
#Flashback Drop
SHOW RECYCLEBIN
SELECT object_name AS recycle_name, original_name, type FROM recyclebin;FLASHBACK TABLE <TABLE_NAME> TO BEFORE DROP;
FLASHBACK TABLE "<BIN$이름>" TO BEFORE DROP RENAME TO <NEW_NAME>;결과 해석:
휴지통 이름은 특수 문자가 있어 큰따옴표로 감쌈
PURGE RECYCLEBIN; -- 내 휴지통 비우기
DROP TABLE <TABLE_NAME> PURGE; -- 휴지통에 넣지 않고 바로 삭제결과 해석:
PURGE로 지운 테이블은 TO BEFORE DROP으로 되살릴 수 없음
#Flashback Version Query
데이터를 잘못 고치거나 지웠을 때 그냥 과거 시점으로 되돌리면 그 사이의 다른 변경도 함께 사라짐
과거에 어떤 DML이 언제 일어났는지 행 단위로 보면 돌아갈 시점을 정확히 고를 수 있음
SELECT ename, sal, deptno, versions_operation, versions_starttime
FROM emp
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE ename = '<ENAME>';결과 해석: 같은 행의 변경 이력이 여러 줄로 나오고, VERSIONS_OPERATION에 I(입력), U(수정), D(삭제)가, VERSIONS_STARTTIME에 그 변경 시각이 보임
이 시각이나 SCN을 FLASHBACK TABLE ... TO TIMESTAMP나 TO SCN에 넣어 되돌림
ALTER TABLE emp ENABLE ROW MOVEMENT;
FLASHBACK TABLE emp TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);
FLASHBACK TABLE emp TO SCN <SCN>;결과 해석:
SCN(System Change Number)은 데이터베이스에 변경이 일어날 때마다 생기는 번호이고, SCN_TO_TIMESTAMP, TIMESTAMP_TO_SCN으로 서로 바꿀 수 있음
TRUNCATE한 테이블은 Flashback Table로 되돌릴 수 없어 백업받은 테이블로 복구해야 한다고 수업 자료는 설명함
#구문과 옵션 설명
VERSIONS 조회의 범위 시작과 끝은 포함됨
한 버전의 유효 구간은 시작 SCN 이상, 종료 SCN 미만으로 해석함
FLASHBACK TABLE의 TO SCN, TO TIMESTAMP와 휴지통 기반 TO BEFORE DROP은 필요한 저장 정보가 다름
#사용 조건과 주의사항
Flashback Table이 대상 시점까지 가려면 그만큼의 UNDO가 남아 있어야 함
고정 크기 UNDO 테이블스페이스에서는 UNDO_RETENTION이 보장되지 않음(UNDO 공간과 보존)