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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </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,usercannotperformDMLorDDLoperations。

上面我们已经介绍了关于如何的应用FlashbackQuery恢复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"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
个人分类: 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭