[SQL] 데이터 복구 - FLASHBACK TRANSACTION QUERY

·2025년 7월 15일

SQL

목록 보기
118/126

💡 FLASHBACK TRANSACTION QUERY 이란?

특정 테이블에 대해서 그동안 변경해왔던 이력정보를 가지고
다시 과거로 되돌리기 위한 DML 문장을 보여주는 쿼리문
아주 상세하게 데이터를 복구할 수 있게 됨
예: 과거에 delete 를 했다면 ------> insert 문장을 보여줌


실습1. 명령 프롬프트 창을 열고 sys 유져로 접속해서 db를 정상종료합니다

sqlplus sys/oracle_4U as sysdba

sql developer 를 종료합니다

그리고 db를 정상 종료 합니다
show user
shutdown immediate

db 를 mount 로 올립니다
startup mount

나중에 복구가 가능하도록 로그를 자동으로 기록하게 설정하기
alter database archivelog;

DML 문이 기록될 수 있도록 설정합니다
alter database add supplemental log data;

db 를 open 시킵니다
alter database open;

잘 설정되었는지 확인합니다
archive log list

sqldeveloper 를 다시 켜고 c##scott 으로 접속합니다


실습2. c##scott 유져에서 다음의 DML 작업들을 수행하시오

  1. KING의 부서번호를 20번으로 변경
update emp
 set deptno = 20
where ename = 'KING';

commit;
  1. KING의 월급을 8000으로 변경
update emp
 set sal = 8000
where ename = 'KING';
 
commit;

실습3. flashback version query 를 이용해서 KING의 데이터가 어떻게 변경되어 왔는지 그 이력정보를 확인하시오

select versions_startscn, versions_endscn, versions_operation, sal, deptno
 from emp
 versions between scn minvalue and maxvalue
 where ename='KING'
 order by versions_starttime asc nulls first;

실습4. 더 정교하게 복구를 하기 위해서 과거로 되돌리기 위한 DML 문장을 출력하게 하시오

select undo_sql
 from  flashback_transaction_query
 where table_owner='C##SCOTT' and table_name='EMP';

update "C##SCOTT"."EMP" set "SAL" = '0' where ROWID = 'AAATPSAAHAAAAHHAAA';
update "C##SCOTT"."EMP" set "DEPTNO" = '10' where ROWID = 'AAATPSAAHAAAAHHAAA';

💡 과거로 되돌리기 위해서 시간으로 모두 되돌리는게 아니라
특정 DML 문장만 추출해서 그것만 수행해서 되돌림


문제1. ALLEN 의 커미션을 7000으로 변경하고 직업을 PRESIDENT 로 변경하시오

update emp
 set comm = 7000, job = 'PRESIDENT'
 where ename = 'ALLEN';
 
commit;

문제2. ALLEN의 데이터를 과거로 되돌리기 위한 DML문장을 추출하시오

-- ALLEN의 rowid 조회
select rowid, ename -- AAATOuAAHAAAAInAAF
 from emp
 where ename='ALLEN';
 
 
select undo_sql
 from flashback_transaction_query
 where table_owner='C##SCOTT' and table_name='EMP';

0개의 댓글