Amazon

2015年1月5日月曜日

フラッシュバッククエリ

Oracle 11g EXでも使えるようです。
Undo表領域に履歴が残っている範囲で過去データが参照できます。
データリカバリ時の参考情報として、特定の時点のデータを確認するのに使えるかも。

タイムスタンプを確認します。
SQL> select to_char(systimestamp, 'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSTIMEST
-----------------
20150105 11:17:08

SQL>

誤って一部のデータを削除した想定でデータを消します。
SQL> delete from emp where job = 'MANAGER';

3 rows deleted.

SQL> select * from emp where job = 'MANAGER';

no rows selected

SQL> commit;

Commit complete.

SQL> 

開始時点のデータが残っていることを確認してinsert selectで復元します。
SQL> r
1  select * from emp
2  as of timestamp to_timestamp('20150105 11:17:08', 'YYYYMMDD HH24:MI:SS')
3* where job = 'MANAGER'

EMPNO ENAME      JOB              MGR HIREDATE                  SAL
---------- ---------- --------- ---------- ------------------ ----------
COMM     DEPTNO
---------- ----------
7566 JONES      MANAGER         7839 02-APR-81                2975
20

7698 BLAKE      MANAGER         7839 01-MAY-81                2850
30

7782 CLARK      MANAGER         7839 09-JUN-81                2450
10


SQL> insert into emp
2  select * from emp
3  as of timestamp to_timestamp('20150105 11:17:08', 'YYYYMMDD HH24:MI:SS')
4  where job = 'MANAGER';

3 rows created.

SQL> select * from emp where job = 'MANAGER';

EMPNO ENAME      JOB              MGR HIREDATE                  SAL
---------- ---------- --------- ---------- ------------------ ----------
COMM     DEPTNO
---------- ----------
7566 JONES      MANAGER         7839 02-APR-81                2975
20

7698 BLAKE      MANAGER         7839 01-MAY-81                2850
30

7782 CLARK      MANAGER         7839 09-JUN-81                2450
10


SQL> commit;

Commit complete.

SQL> 

追記
リカバリは、undo表領域を使わないcreate table asを使って、リカバリデータを確保してから行うのがいいらしいです。
SQL> r
create table emp_recovery as
select * from emp
as of timestamp to_timestamp('20150105 11:17:08', 'YYYYMMDD HH24:MI:SS')
where job = 'MANAGER';

0 件のコメント: