***
该文章是以草案的形式发布的,可能会包含一定的错误。请使用Metalink“反馈”按钮来通知ORACLE如果有任何关于这篇文章的问题。
***
目的
————
如何使用闪回查询恢复旧的数据
范围及应用
————
所有用户
如何使用闪回查询恢复旧的数据
————
Oracle 9.2 版本 已经推出的了“AS OF”子句和闪回查询。
该子句可以用作下列事项:
+ 寻找旧的数据
+ 恢复旧的数据
你可以结合TIMESTAMP或者是SCN到“AS OF”子句中一起使用。根据给定的SCN或者TIMESTAMP,oracle可以判定要追溯到多远去找旧数据。
在用“AS OF”子句执行闪回查询之前,请确保以下的要求被满足:
+ 打开自动undo管理来维持读一致性,为此执行以下操作:
l 设置UNDO_MANAGEMENT=AUTO
l 创建UNDO表空间,给予足够的空间来保持要求的数据
l 设置UNDO_TABLESPACE=UNDO.
l 赋予你要使用闪回查询的表格FLASHBACK权限
这是一个如何使用TIMESTAMP找到并恢复旧数据的例子:
案例1:
——
(1) 你错误的更新了员工ALLEN的工作使用如下命令:
SQL> update emp set sal=1800 where ename='ALLEN';
1 row updated.
SQL> commit;
Commit complete.
SQL> select ename, sal from emp where ename='ALLEN';
ENAME SAL
---------- ----------
ALLEN 1800
(2)现在你不得不恢复到你不知道的旧的数值,使用闪回查询寻找旧的数值:
SELECT ename, sal FROM emp
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '6' MINUTE)
WHERE ename = 'ALLEN';
该查询将找出6分钟前存在的旧的数值。
SQL> /
ENAME SAL
---------- ----------
ALLEN 1600
因此ALLEN的工资是1600,然后你可以更新工资到1600.
(3)你也可以使用闪回查询作为一个更新语句的子查询来恢复到旧的数值,命令是:
update emp
set sal = (
SELECT sal FROM emp
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '6' MINUTE) where ename='ALLEN')
where ename='ALLEN';
注意:
——
这个间隔应该大于五分钟。这个限制是因为ORACLE要从内部将TIMESTAMP转化为响应的SCN号。转化的SCN号可能是不够精确的因为oracle每间隔五分钟存储一次SCN号,因此转化的SCN号可能四舍五入,因此可能不精确。
下面的例子是通过SCN号来寻找和恢复旧的数据
例子2:
——
(1)这里,你必须知道恢复旧数据的SCN号,当前SCN号查询:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
3297508
(2)你错误的更新了MILLER的工资。
SQL> update emp set sal=1800 where ename='MILLER';
1 row updated.
SQL> commit;
Commit complete.
SQL> select ename, sal from emp where ename='MILLER';
ENAME SAL
---------- ----------
MILLER 1800
(3)你不知道MILLER之前的工资但是你知道之前旧值的SCN号。
(4)旧值可以通过使用错误更新前记录的SCN号闪回查询更新回来,查询如下:
1 SELECT ename, sal FROM emp
2 AS OF SCN 3297508
3* where ename='MILLER'
SQL> /
ENAME SAL
---------- ----------
MILLER 1300
然后,你可以通过更新行来恢复旧的值了
(5)你可以使用下面闪回子查询的更新恢复旧的数据:
update emp
set sal = (
SELECT sal FROM emp
AS OF SCN 3297508 where ename='MILLER')
where ename='MILLER';
关键词:
FLASHBACK