[SQL] FLASHBACK
Updated:
실수로 지운 데이터 복구하기
- INSERT문 활용
- 데이터의 과거 데이터를 볼 수 있는 기술을 지원한다.
예제) 사원 테이블을 지우기전인 5분전의 사원 테이블의 상태를 검색하세요.
insert into emp --데이터 조회 후 재삽입할 때
select * from emp
as of timestamp(systimestamp - interval '5' minute); --현재의 시분초에서 5분 전의 데이터를 조회한다.
- 무한정 가능한 것은 아니고, 가능한 시간이 존재한다. 프로젝트마다 다르게 셋팅되어 있음.
show parameter undo; --15분 안에만 복구가 가능
예제2) 사원 테이블의 월급을 모두 0으로 변경하고 commit한 후에 사원 테이블을 1분 전 상태로 되돌리시오.
update emp
set sal=0;
commit;
merge into emp e
using (select empno, sal from emp
as of timestamp(systimestamp - interval '1' minute)
) s --현재의 시분초에서 1분 전의 데이터를 조회한다.
on (e.empno = s.empno)
when matched then
update set e.sal = s.sal;
commit;
- FLASHBACK 활용
--복구
alter table emp enable row movement; --복구 가능한 상태로 만든다.
--플래시백 실행
flashback table emp to timestamp(systimestamp - interval '5' minute);
--insert문이 일어났으므로 commit해야 함
commit;
- FLASHBACK DROP 활용
- 테이블을 완전 삭제했을 때 복귀할 수 있다. 휴지통을 비우지 않았을 때 가능하다.
flashback table emp to before drop; --가장 최근에 drop된 테이블을 복귀한다.
--참고
flashback table emp to before drop; --가장 최근에 drop된 테이블을 복귀한다.
- FLASHBACK VERSION QUERY
- emp 테이블이 어떻게 변해왔는지 히스토리를 확인하는 명령어
- 무한정 가능한 것은 아니고, 가능한 시간이 존재한다.
- commit이 진행되어야 version이 업데이트된다.
- version_starttime의 초기값은 null이므로 nulls first를 작성하면 순서대로 확인하기 용이하다.
- to_timestamp 값은 특정 시점을 시작지점으로 설정할 수 있다. (between timestamp 구문에서 종료시점도 설정 가능하다.)
select ename, sal, deptno, versions_starttime, versions_endtime, versions_operation
from emp
versions between timestamp to_timestamp('23/05/18 11:10:25', 'RRRR-MM-DD HH24:MI:SS')
and maxvalue
where ename = 'KING'
order by versions_starttime nulls first;
- FLASHBACK TRANSACTION QUERY
- 과거에 데이터를 지우거나 수정했을 때 어떻게 수정했는지 스크립트를 역으로 확보하여 수행 여부를 결정할 수 있도록 할 때 유용한 기술이다.
** 작성중 **
실행 순서
- 명렁 프롬프트 관리자 권한으로 접속 (enterprise edition에서 실행 가능)
SQL> sqlplus "/as sysdba"
SQL> show user
SQL >shutdown immediate
ORACLE 인스턴스가 종료되었습니다.
SQL > startup mount --mount로 올려야 데이터베이스 구조를 바꿀 수 있다.
SQL > alter database archivelog; --archive : 데이터베이스를 언제든 복구할 수 있는 모드
데이터베이스가 변경되었습니다.
SQL > alter database add supplemental log data: --복구에 필요한 스크립트 저장 가능
데이터베이스가 변경되었습니다.
SQL > connect as sysdba
SQL > alter database open;
데이터베이스가 변경되었습니다.
SQL > connect scott/tiger
연결되었습니다.
--scoott 잠겼을 때 푸는 명령어
SQL > connect/ as sysdba
연결되어습니다.
SQL > alter user scott
2 account unlock;
사용자가 변경되었습니다.
SQL > alter user scott
2 identified by tiger;
사용자가 변경되었습니다.
SQL> connect scott/tiger
연결되었습니다.
SQL > select ename, sql
from emp
where ename = 'KING';
COMMIT;