Flashback Data Archive機能を利用して、過去データの参照、及び過去データへのフラッシュバックを行なってみましょう。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
Archiveを有効にしたemp表を利用します。
SMITHの給与(SAL)は800です。
SQL> UPDATE emp
2 SET sal = sal + 1000
3 WHERE ename = 'SMITH';
1行が更新されました。
SQL> commit;
コミットが完了しました。
SMITHの給与を3回、+1000します。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 3800
給与が更新されたことを確認します。
SELECT empno,ename,sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
emp表はArchiveを有効にしているので過去データを参照可能です。
「(SYSTIMESTAMP - INTERVAL '10' MINUTE)」で10分前のデータを参照します。
更新前の給与が表示されていることを確認できます。
SQL> explain plan for
2 SELECT empno,ename,sal FROM emp
3 AS OF TIMESTAMP
4 (SYSTIMESTAMP - INTERVAL '10' MINUTE)
5 WHERE ename = 'SMITH';
解析されました。
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2504078639
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 66 | 285 (1)| 00:00:01 | | |
| 1 | VIEW | | 2 | 66 | 285 (1)| 00:00:01 | | |
| 2 | UNION-ALL | | | | | | | |
|* 3 | FILTER | | | | | | | |
| 4 | PARTITION RANGE SINGLE| | 1 | 61 | 274 (0)| 00:00:01 | KEY | 1 |
|* 5 | TABLE ACCESS FULL | SYS_FBA_HIST_92153 | 1 | 61 | 274 (0)| 00:00:01 | KEY | 1 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|* 6 | FILTER | | | | | | | |
| 7 | MERGE JOIN OUTER | | 1 | 2054 | 11 (19)| 00:00:01 | | |
| 8 | SORT JOIN | | 1 | 26 | 7 (15)| 00:00:01 | | |
|* 9 | TABLE ACCESS FULL | EMP | 1 | 26 | 6 (0)| 00:00:01 | | |
|* 10 | SORT JOIN | | 1 | 2028 | 4 (25)| 00:00:01 | | |
|* 11 | TABLE ACCESS FULL | SYS_FBA_TCRV_92153 | 1 | 2028 | 3 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------
explainの解析データでflashback表を参照していることがわかります。
UPDATE emp
SET sal = (
SELECT sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE ename = 'SMITH'
)
WHERE ename = 'SMITH';
1行が更新されました。
Archiveを利用して、現在の値を更新します。
つまりは、更新の取り消しです。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
更新前の状態になったことを確認できました。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
Archiveを有効にしたemp表を利用します。
SMITHの給与(SAL)は800です。
SQL> UPDATE emp
2 SET sal = sal + 1000
3 WHERE ename = 'SMITH';
1行が更新されました。
SQL> commit;
コミットが完了しました。
SMITHの給与を3回、+1000します。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 3800
給与が更新されたことを確認します。
SELECT empno,ename,sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
emp表はArchiveを有効にしているので過去データを参照可能です。
「(SYSTIMESTAMP - INTERVAL '10' MINUTE)」で10分前のデータを参照します。
更新前の給与が表示されていることを確認できます。
SQL> explain plan for
2 SELECT empno,ename,sal FROM emp
3 AS OF TIMESTAMP
4 (SYSTIMESTAMP - INTERVAL '10' MINUTE)
5 WHERE ename = 'SMITH';
解析されました。
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2504078639
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 66 | 285 (1)| 00:00:01 | | |
| 1 | VIEW | | 2 | 66 | 285 (1)| 00:00:01 | | |
| 2 | UNION-ALL | | | | | | | |
|* 3 | FILTER | | | | | | | |
| 4 | PARTITION RANGE SINGLE| | 1 | 61 | 274 (0)| 00:00:01 | KEY | 1 |
|* 5 | TABLE ACCESS FULL | SYS_FBA_HIST_92153 | 1 | 61 | 274 (0)| 00:00:01 | KEY | 1 |
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|* 6 | FILTER | | | | | | | |
| 7 | MERGE JOIN OUTER | | 1 | 2054 | 11 (19)| 00:00:01 | | |
| 8 | SORT JOIN | | 1 | 26 | 7 (15)| 00:00:01 | | |
|* 9 | TABLE ACCESS FULL | EMP | 1 | 26 | 6 (0)| 00:00:01 | | |
|* 10 | SORT JOIN | | 1 | 2028 | 4 (25)| 00:00:01 | | |
|* 11 | TABLE ACCESS FULL | SYS_FBA_TCRV_92153 | 1 | 2028 | 3 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------
explainの解析データでflashback表を参照していることがわかります。
UPDATE emp
SET sal = (
SELECT sal FROM emp
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE ename = 'SMITH'
)
WHERE ename = 'SMITH';
1行が更新されました。
Archiveを利用して、現在の値を更新します。
つまりは、更新の取り消しです。
SQL> SELECT empno,ename,sal FROM emp
2 WHERE ename = 'SMITH';
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
更新前の状態になったことを確認できました。

コメント