<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>
用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>