자격증들/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