자격증들/23) SQLD, SQLP

SQLP 5 실습 - Flashback 기술

tonyhan18 2023. 5. 24. 13:29
728x90

 

 

 

 

SELECT * FROM emp;

UPDATE EMP 
SET sal= sal + 500
WHERE empno = 7788;

commit;

7788의 SCOTT 데이터를 변경해주자

 

UPDATE EMP 
SET sal= sal * 1.1
WHERE empno = 7788;

commit;

그리고 또 변경해준다.

 

UPDATE EMP 
SET sal= sal -2000
WHERE empno = 7788;

commit;

또 변경해준다

 

SELECT versions_xid, versions_operation, versions_starttime, versions_endtime, sal
FROM emp versions BETWEEN timestamp sysdate - 20/1440 AND sysdate
WHERE empno = 7788;

 

결과는 위와같이 나오는 것을 볼 수 있다.

 

/*
col operation for a10
col undo_sql for a80
 * */


SELECT xid, operation, undo_sql
FROM FLASHBACK_TRANSACTION_QUERY 
WHERE table_owner = 'ORA01'
AND table_name = 'EMP'
AND START_TIMESTAMP > SYSDATE - 20/1440;

 

뜨는 레코드가 없다.

 

????

 

ALTER DATABASE ADD supplemental log DATA;

 

---

 

INSERT INTO DEPT d 
values(50, 'MARKETING', 'DENVER');

COMMIT;

UPDATE dept
SET loc='서울'
WHERE deptno=10;

COMMIT;

DELETE dept
WHERE deptno=40;
COMMIT;

 

 이 상황에서 이전으로 되돌아가보자

flashback table dept to timestamp sysdate-20/1440;

alter table dept enable row movement;

 

????

 

CREATE TABLE emp_flash AS SELECT empno, ename, sal, hiredate FROM emp;
SELECT * FROM emp_flash;

하고 drop 해주자

DROP TABLE emp_flash;

이것을 반복 수행할 것이다.

 

CREATE TABLE emp_flash AS SELECT ename, deptno, job FROM emp;
SELECT * FROM emp_flash;

DROP TABLE emp_flash;

다시금 컬럼 속성만 다른 테이블을 만들고 다시 삭제해주자

 

CREATE TABLE emp_flash AS SELECT empno FROM emp;
SELECT * FROM emp_flash;

DROP TABLE emp_flash;

show recyclebin;

하면 위와같이 버려졌던 table들을 볼 수 있다.

 

 

select * from "BIN$5QSytn1ITEGr6Aw5lPsplg==$0";

휴지통에 간 것을 다시 볼 수도 있고

flashback table emp_flash to before drop;

복원시킬 수도 있다. 보면 휴지통은 LIFO 알고리즘으로 적용하여 마지막으로 들어간것부터 복원된다.

 

하지만 이전것을 복원할 수 있다.

 

일단 show recyclebin을 해주면 이전 것들을 볼 수 있다.

 

flashback table "BIN$dCHmFVhQRbKBQdh8lyXnzA==$0" to before drop rename to emp_new;
select * from emp_new;

해주면 살릴 수 있다. 물론 이것도 만능은 아니라서 살린 수 있는거에 한계는 존재하니 주의

 

 

???

alter database add supplemental log data;
select member from v$logfile;

로그파일 3개가 있는것을 알 수 있다.(로그파일은 최소 2개 있다.)

 

 

execute dmbs_logmnr.add_logfile(logfilename=>'D:\APP\OURCL\VIRTUAL\ORADATA\PROD\REDO01.LOG');
execute dmbs_logmnr.add_logfile(logfilename=>'D:\APP\OURCL\VIRTUAL\ORADATA\PROD\REDO02.LOG');
execute dmbs_logmnr.add_logfile(logfilename=>'D:\APP\OURCL\VIRTUAL\ORADATA\PROD\REDO03.LOG');

3번만 위와같이 떳다. 이건 ??? 이다.

 

execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

이제 분석 시작하자.

 

 

---

????

728x90