Oracle Flashback
DML ์์ ์ ํ๋ค๊ฐ ์๋์น ์๊ฒ ํน์ ์ค์๋ก Commit์ผ๋ก Transaction์ ๋๋๋๋ฐ ์ด์ ์์ ์ผ๋ก ๋์๊ฐ์ผํ๋ ์ํฉ์ด ์ฌ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Oracle์ Flashback ๊ธฐ์ ์ ์ด์ฉํด์ ํน์ ์์ ์ผ๋ก ๋์๊ฐ๊ฑฐ๋ ๋ณด์ฌ์ฃผ๋ ๋ณต๊ตฌ ์์ ์ ํ ์ ์์ต๋๋ค. ๋ค๋ง, Flashback ๊ธฐ์ ์ Undo Data๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ undo_retention ํ๋ผ๋ฏธํฐ๊ฐ์ ์ํด ๋ณด์กด๋๋ ์๊ฐ์ด ์ ํด์ ธ ์์ต๋๋ค. Undo Data๋ฅผ ๋ณด์กดํ๋๋ฐ ๊ณต๊ฐ๊ณผ ์์์ด ํ์ํฉ๋๋ค. ๊ทธ๋์ undo_retention์ ๊ธฐ๋ณธ๊ฐ์ 900์ด๋ก ๋์ด์๋๋ฐ ์ข ๋ ์ค๋ ๊ธฐ๊ฐ ๋์ Undo Data๋ฅผ ๋ณด์กดํ๊ธฐ ์ํด Flashback Data Archive ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋น ๋ด์ฉ์ ์๋ ๋งํฌ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
[Oracle] Flashback Data Archive ๋ฐ์ดํฐ ๋ณต์ ์์
Flashback Data Archive(11g) DML ์์ ์ ํ๋ฉด์ ์ค์๋ฅผ ์ ์ง๋ฌ๋ฒ๋ฆฌ๊ณ commit๊น์ง ํด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค์๋ก delete๋ฌธ์ ์กฐ๊ฑด์ ์ ํฌํจํ์ง ์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋... ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ๏ฟฝ๏ฟฝ
myjamong.tistory.com
์ด๋ฒ ๊ธ์์๋ Oracle 10g์์ New Feature๋ก ๊ณต๊ฐ๋ ๋ช๊ฐ์ง Flashback ๊ธฐ๋ฅ๋ค์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Oracle 9i release 2์์ ์ฒ์ ์ ๋ณด์ธ Flashback Query๋ฅผ ์ด์ฉํด์ ํน์ ์์ ์ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ํด๋น ๋ด์ฉ์ ์๋ ๋งํฌ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
[Oracle] Flashback Query AS OF ์ ์ฌ์ฉํ๊ธฐ
Flashback Query AS OF์ Oracle 9i release 2 ๋ฒ์ ์ New Feature๋ก "AS OF"์ ์ ์ด์ฉํด์ ํน์ ์์ ์ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๊ฒ ๋์์ต๋๋ค. ํ์ง๋ง ํน์ ์์ ์ ์ ํ์ ์์ต๋๋ค. Flashback Query๋ Un..
myjamong.tistory.com
Flashback ์ค์ตํ๊ฒฝ
OS : Red Hat Enterprise Linux Server release 6.10
DB : Oracle 11.2.0.1
SID : orcl
host : 601d2fce71dc
Flashback ๊ด๋ จ ์ค์ต์ ์์ ๊ฐ์ ํ๊ฒฝ์์ ์งํํ์ต๋๋ค.
Flashback Versions Query ์ค์ต
Flashback Versions Query๋ ์ง์ ๋ ๊ธฐ๊ฐ ๋์ ํน์ ROW์ ์ํ(Version)๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค.
์ค์ต์ฉ ํ ์ด๋ธ ์์ฑ
[oracle@601d2fce71dc orcl]$ sqlplus scott/tiger
SCOTT@orcl> create table emp_test as select * from emp;
Table created.
SCOTT@orcl> select * from emp_test;
์ค์ต์ฉ ํ ์ด๋ธ๋ก emp_test๋ฅผ ์์ฑํ์ต๋๋ค.
ํ ์ด๋ธ ์์
SCOTT@orcl> update emp_test set sal=sal*1.2 where deptno=10;
3 rows updated.
SCOTT@orcl> commit;
Commit complete.
SCOTT@orcl> update emp_test set sal=sal+5000 where deptno=20;
5 rows updated.
SCOTT@orcl> commit;
Commit complete.
๋ณ๊ฒฝ๋ ๋ด์ญ๋ค์ ํ์ธํ๊ธฐ ์ํด ๋ช๊ฐ์ง ๋ณ๊ฒฝ์์ ์ ์งํํ์ต๋๋ค.
Flashback Versions ์กฐํ
SCOTT@orcl> col versions_endtime for a30
SCOTT@orcl> col versions_starttime for a30
SCOTT@orcl> set linesize 200
SCOTT@orcl>
select
versions_xid
,versions_operation
,versions_startscn
,versions_endscn
,versions_starttime
,versions_endtime
,empno
,sal
,deptno
from emp_test
versions between timestamp sysdate - 1/24/60*10 and sysdate
where deptno in(10,20)
order by empno;
10๋ถ์ ๋ถํฐ ํ์ฌ๊น์ง 10, 20๋ฒ ๋ถ์์ ์ํด์๋ ์ฌ์์ ์ฌ์๋ฒํธ, ๊ธ์ฌ, ๋ถ์๋ฒํธ์ ๋ํ ๋ฒ์ ์ ํ์ธํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ต๋๋ค. Flashback Versions Query๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉ๊ฐ๋ฅํ Pseudo Column์ ์ด์ฉํด์ ๊ฐ ํ๋ค์ ๋ฒ์ ์ ์ธ๋ถ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
versions_xid : ํ์ ๋ณํ๋ฅผ์ฃผ์์ ๋ ๋ฐ์ํ Transaction์ ID๊ฐ
versions_operation : Transaction์ ์ก์
I --> insert
U--> update
D--> delete
versions_startscn : ํด๋น ๊ฐ์ผ๋ก ์ฒ์ ๋ณ๊ฒฝ๋์์ ๋์ SCN
versions_endscn : ํด๋น ๊ฐ์ ๋ง์ง๋ง์ผ๋ก ๊ฐ๊ณ ์์์ ๋์ SCN
versions_starttime : ํด๋น ๊ฐ์ผ๋ก ์ฒ์ ๋ณ๊ฒฝ๋์์ ๋์ Time
versions_endtime : ํด๋น ๊ฐ์ ๋ง์ง๋ง์ผ๋ก ๊ฐ๊ณ ์์์ ๋์ Time
์ค๊ฐ ์ค๊ฐ versions_start ํน์ versions_end์ ๊ด๋ จ๋ ๋ด์ฉ์ด ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. versions_start์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ๋ ์ต์ด์ ๋ฐ์ดํฐ๋ผ๋ ์๋ฏธ์ ๋๋ค. versions_end์ ๋ํ ์ ๋ณด๊ฐ ์๋ Row๋ ํ์ฌ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. Flashback Versions์ Pseudo Column๋ค์ ๊ฐ์ด ์ฌ์ฉํ์ฌ ํ๋ค์ ๋ณ๊ฒฝ๋ด์ญ์ ์ถ์ ํ ์ ์์ต๋๋ค.
Flashback Transaction Query ์ค์ต
Flashback Transaction Query๋ ๊ฐ Transaction์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ฃผ๋ก ๋ณ๊ฒฝ์ด ์์๋ Transaction์ UNDO SQL ์ ๋ณด๋ฅผ ํ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ์์ ์ผ๋ก ๋์๊ฐ๋ ์์ ๋ณด๋ค๋ ํน์ Transaction์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋๋๋ฆฌ๋๋ฐ ์ ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ค์ต์ Flashback Versions Query์์ ์์ฑํ emp_test ํ ์ด๋ธ๋ก ์งํํ๊ฒ ์ต๋๋ค.
๊ถํ ๋ฐ ์ฌ์ ์ค์
SYS@orcl> grant select on sys.flashback_transaction_query to scott;
SYS@orcl> grant select any transaction to scott;
Flashback Transaction์ ๋ํ ์ ๋ณด๋ฅผ Scott ์ ์ ๊ฐ ์กฐํํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํด์คฌ์ต๋๋ค.
SYS@orcl> alter database add supplemental log data;
Database altered.
SYS@orcl> select supplemental_log_data_min from v$database;
supplemental_log_data_min ์ ๋ณด๊ฐ NO๋ก ๋์ด์๋ ๊ฒฝ์ฐ UNDO_SQL์ ๋ํ ์ ๋ณด๊ฐ flashback_transaction_query ๋ทฐ๋ฅผ ์กฐํํ์ ๋ ๋ณด์ด์ง ์์ต๋๋ค. ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค.
ํ ์ด๋ธ ์์
SYS@orcl> conn scott/tiger
Connected.
SCOTT@orcl> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
๋จผ์ ํ์ฌ ์๊ฐ์ ํ์ธํด์ค๋๋ค. ํด๋น ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ํ์ธํ ๊ฒ๋๋ค.
SCOTT@orcl> update emp_test set sal=sal*2 where deptno=30;
6 rows updated.
SCOTT@orcl> commit;
Commit complete.
30๋ฒ ๋ถ์์ ์ฌ์๋ค์ ๊ธ์ฌ๋ฅผ 2๋ฐฐ๋ก ์์ ํ์ต๋๋ค.
Flashback Transaction ์กฐํ
SCOTT@orcl> col undo_sql for a100
SCOTT@orcl>
select
xid
,undo_sql
from flashback_transaction_query
where table_owner = 'SCOTT'
and table_name = 'EMP_TEST'
and start_timestamp > to_timestamp('2020-07-21 14:34:19','yyyy-mm-dd hh24:mi:ss');
Flashback Transaction Query๋ฅผ ์ด์ฉํด์ ์์ ๋ ๋ฐ์ดํฐ์ UNDO_SQL์ ํ์ธํ ์ ์์ต๋๋ค. ์์ ์ฟผ๋ฆฌ์์๋ ํ๋์ ๋ณ๊ฒฝ์์ ๋ง ์คํํด์ ์๊ฐ์ผ๋ก ํ์ธํ์ต๋๋ค. Flashback Versions Query๋ฅผ ์ฌ์ฉํด์ ํน์ Transaction์ ์์ ์ ๋๋๋ฆฌ๋๋ฐ ์ ํํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋น SQL๊ทธ๋๋ก ์คํํ๊ฒ๋๋ฉด ์ผ๋ถ ํธ๋์ญ์ ์ ํํด์ ์ด์ ์์ ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
Flashback Table
Flashback Table์ ํน์ ์์ ์ผ๋ก ํ ์ด๋ธ ์ ์ฒด๋ฅผ ๋ณต๊ตฌํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ ์ Flashbackํ Table์ ๋ํด Flashback Object ๊ถํ์ด ์์ด์ผํฉ๋๋ค. Flashback Transaction Query์์ ANY TABLE์ ๋ํด FLASHBACK ๊ถํ์ ๋ถ์ฌํ์ผ๋ emp_test ํ ์ด๋ธ์ ๊ฐ๊ณ ์ค์ต์ ์งํํ๊ฒ ์ต๋๋ค.
์ฌ์ ์ค์
SCOTT@orcl> alter table emp_test enable row movement;
Table altered.
๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ธ ์์น ์ด๋์ ํ์ฑํํด์ค์ผํฉ๋๋ค. row movement๋ฅผ ํ์ฑํํ๋ค๋ ๊ฒ์ ํ์ rowid๊ฐ ๋ณด์กด๋์ง ์๋๋ค๋ ๋ป์ ๋๋ค. Flashback ์์ ์ด์ ์ rowid๋ฅผ ํน์ ํ application์์ ์ฐธ์กฐํ๊ณ ์์๋ค๋ฉด Flashback ์ดํ์ rowid๊ฐ๊ณผ ์์ํ์ง ๋ชปํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํจ์ ๋๋ค.
ํ ์ด๋ธ ์์
SCOTT@orcl> conn / as sysdba
Connected.
SYS@orcl> select current_scn from v$database;
๋๋์๊ฐ SCN์ ๋ฏธ๋ฆฌ ํ์ธํด์ค๋๋ค.
SCOTT@orcl> select * from emp_test;
๋น๊ต๋ฅผ ์ํด ๋ณ๊ฒฝ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด์ค๋๋ค.
SCOTT@orcl> update emp_test set sal = 1000;
14 rows updated.
SCOTT@orcl> commit;
Commit complete.
SCOTT@orcl> select * from emp_test;
๋ชจ๋ ์ฌ์์ ๊ธ์ฌ๋ฅผ 1000์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ์ดํ Commitํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
Flashback Table ์์
SCOTT@orcl> flashback table emp_test to scn 1406603;
Flashback complete.
์ด์ ์ ๋ฏธ๋ฆฌ ํ์ธํด๋จ๋ SCN ๋ฒํธ๋ก flashback ์์ ์ ํ์ต๋๋ค.
SCOTT@orcl> select * from emp_test;
๋ณ๊ฒฝํ๊ธฐ ์ด์ ์ ์์ ์ ๋ฐ์ดํฐ๋ก ๋ณต๊ตฌ๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Flashback Drop
Oracle์์ Drop Table๋ช ๋ น์ ์ฌ์ฉํด์ ํ ์ด๋ธ์ ์ญ์ ํ๋ฉด recycle bin ํด์งํต์ผ๋ก ํ ์ด๋ธ์ ์ธ๊ทธ๋จผํธ๊ฐ ์ด๋๋ฉ๋๋ค. ์๋์ฐ ์ด์์ฒด์ ์์ ํด์งํต์ผ๋ก ํ์ผ์ ์ญ์ ํ๊ณ ์์ง ํด์งํต์ ํ์ผ์ด ๋จ์์๋ค๋ฉด ๋ณต์ํ ์ ์๋ฏ์ด, ์ค๋ผํด์์๋ Flashback Drop ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ณต์์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋จ, purge ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ธ์ Dropํ๋ค๋ฉด ๋ณต์์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ค์ต์ฉ ํ ์ด๋ธ ์์ฑ
SCOTT@orcl> create table dept_test as select deptno from dept;
Table created.
SCOTT@orcl> drop table dept_test;
Table dropped.
SCOTT@orcl> create table dept_test as select deptno, dname from dept;
Table created.
SCOTT@orcl> drop table dept_test;
Table dropped.
SCOTT@orcl> create table dept_test as select deptno, dname, loc from dept;
Table created.
SCOTT@orcl> drop table dept_test;
Table dropped.
์ค์ต์ ์ํด dept_test๋ผ๋ ํ ์ด๋ธ์ 3๋ฒ ๊ฐ๊ฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฅด๊ฒ ์์ฑํ๊ณ Dropํ๋ ์์ ์ ํ์ต๋๋ค.
recycle bin
SCOTT@orcl> show recyclebin
๋ช ๋ น์ด๋ฅผ ํตํด ํด์งํต์ ์๋ ํ ์ด๋ธ๋ค์ ํ์ธํ ์ ์์ต๋๋ค. Dropํ 3๊ฐ์ dept_test ํ ์ด๋ธ์ด ์์ต๋๋ค.
Flashback Drop ์์
SCOTT@orcl> flashback table dept_test to before drop;
Flashback complete.
SCOTT@orcl> desc dept_test;
to before drop ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ Dropํ ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
SCOTT@orcl> drop table dept_test;
Table dropped.
SCOTT@orcl> flashback table "BIN$qvYhLOvKQqngUBGsAgAC+g==$0" to before drop;
Flashback complete.
SCOTT@orcl> desc dept_test;
recycle bin์ RECYCLE_NAME์ ์ด์ฉํด์ ๋์ผํ ์ด๋ฆ์ ํ ์ด๋ธ์ด๋๋ผ๋ ์ํ๋ DROP version์ ํ ์ด๋ธ์ ๋ณต์ํ ์ ์์ต๋๋ค.
๋๊ธ