9i新特性之backQuery的应用-------------针对DML误操作的恢复(2)

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

用DBMS_FLASHBACK包

 

DBMS_FLASHBACK包提供了以下几个函数:

 

ENABLE_AT_TIME:设置当前SESSION的闪回查询时间

ENABLE_AT_SYSTEM_CHANGE_NUMBER:设置当前SESSION的闪回查询SCN

GET_SYSTEM_CHANGE_NUMBER:取得当前的SCN

     DISABLE:关闭当前SESSION的闪回查询

 

   如:

SQL>selectdbms_flashback.get_system_change_numberfromdual;

 

GET_SYSTEM_CHANGE_NUMBER

------------------------

                8053651

当将一个SESSION设置为闪回查询模式之后,后续的查询都会基于那个时间点或者SCN的数据库状态,如果SESSION结束,那么即使没有明确指定DISABLE,闪回查询也会自动失效。在SESSION运行在闪回查询状态时,是不允许进行任何 DML和DDL操作。如果要用 DML操作来进行数据 恢复就必须使用PL/SQL游标(其实,这里也就是给我们提供了一个数据 恢复的方法)。即使SESSION运行在闪回查询模式,SYSDATE函数也不会受到影响,仍然会返回当前正确的系统时间。

下面我们用一个例子说明如何使用DBMS_FLASHBACK包来 恢复数据。

假设由于 误操作删除了SCOTT.EMP表中的所有数据,现在我们要 恢复

SQL>deletefromemp;

14rowsdeleted.

SQL>commit;

Commitcomplete.

SQL>selectcount(*)fromemp;

COUNT(*)

----------

0

然后执行下面的SQL创建一个存储过程用于 恢复数据

CREATEORREPLACEPROCEDUREprc_recoverempIS

CURSORc_empIS

SELECT*FROMscott.emp;

v_rowc_emp%ROWTYPE;

BEGIN

DBMS_FLASHBACK.ENABLE_AT_TIME(SYSTIMESTAMP-INTERVAL'1'DAY);

OPENc_emp;

DBMS_FLASHBACK.DISABLE;

LOOP

FETCHc_emp

INTOv_row;

EXITWHENc_emp%NOTFOUND;

INSERTINTOscott.emp

VALUES

(v_row.EMPNO,

v_row.ENAME,

v_row.JOB,

v_row.MGR,

v_row.HIREDATE,

v_row.SAL,

v_row.COMM,

v_row.DEPTNO);

ENDLOOP;

CLOSEc_emp;

COMMIT;

ENDprc_recoveremp;

SQL>executeprc_recoveremp;

PL/SQLproceduresuccessfullycompleted.

SQL>selectcount(*)fromemp;

COUNT(*)

----------

14

到此成功结束,检查EMP表可以看到所有的数据已经全部都 恢复了。

备注:在存储过程中我们创建了游标之后就将执行了DBMS_FLASHBACK.DISABLE,只

有这样我们才能在这个SESSION中进行 DML操作。否则将产生ORA-08182错误,In

Flashbackmode,usercannotperform DMLorDDLoperations。

上面我们已经介绍了关于如何的应用Flash backQuery恢复 DML误操作,但都是基于时间点(timestamp)的,其实呢,尽管timestamp可以精确到毫秒,可是由于{oracle每隔5分钟会将产生的SCN对应一个TIME做记录,也就是说通常只记录了SCN,但是每5分钟会记录SCNandTIME }(这段话需要深入的考究),当采用timestamp来做flashback的时候就有可能产生偏差,5分钟的来由是在于表SYS.SMON_SCN_TIME,我们可以察看一下:

该表的记录一共是1440行,那来几行可以看看

 

   THREAD   TIME_MPTIME_DP       SCN_WRP   SCN_BAS

---------------------------------------------------

        110727725272003-12-30          0   8052536

        110727728342003-12-30          0   8053330共2页  第1页 
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值