2 minute read

Updated:

실수로 지운 데이터 복구하

  1. 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;

  1. FLASHBACK 활용
--복구
alter table emp enable row movement; --복구 가능한 상태로 만든다.

--플래시백 실행
flashback table emp to timestamp(systimestamp - interval '5' minute);

--insert문이 일어났으므로 commit해야 함
commit;

  1. FLASHBACK DROP 활용
    • 테이블을 완전 삭제했을 때 복귀할 수 있다. 휴지통을 비우지 않았을 때 가능하다.
flashback table emp to before drop; --가장 최근에 drop된 테이블을 복귀한다.

--참고
flashback table emp to before drop; --가장 최근에 drop된 테이블을 복귀한다.


  1. 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;

  1. FLASHBACK TRANSACTION QUERY
    • 과거에 데이터를 지우거나 수정했을 때 어떻게 수정했는지 스크립트를 역으로 확보하여 수행 여부를 결정할 수 있도록 할 때 유용한 기술이다.

** 작성중 **

실행 순서

  1. 명렁 프롬프트 관리자 권한으로 접속 (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;