oracle 数据提交之后如何闪回

当你对数据库的数据进行update后,并commit。 但是你马上又后悔了你所做的更改,或者你在做update的时候忘记了加where条件 致使大量的数据被更改。
如果你的数据库是oracle9i那么就可以利用 9i的新特性闪回查询

首先查看系统参数看是否支持闪回查询
SQL> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- ---------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1

参数 undo_management 为 auto 表示可以
undo_retention 表示可以闪回的时间,默认为3 个小时。

9i支持闪回查询的包:dbms_flashback
需要在非dba用户下,例如:system 进行操作

SQL> execute dbms_flashback.enable_at_time(sysdate-1/24/3);
1/24/3:系统当前时间 的前8个小时的数据。
执行完成之后,在当前的session下进行查询就可以查到历史数据。
如果要回到原来的实时数据

SQL> execute dbms_flashback.disable

局限性

1、闪回查询是基于SCN的,虽然我执行的是:

DBMS_FLASHBACK.ENABLE_AT_TIME(to_date('2003-05-16 15:37:23'));

但Oracle并不会精确的这个时间点,而是ROUND DOWN到最近的一次SCN,然后从这个SCN开始进行恢复。而Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。

这正是上面我们进行恢复时少了一条的原因。因此如果使用DBMS_FLASHBACK.ENABLE_AT_TIME来进行恢复,为了避免恢复失败,我可以先等5分钟,然后再进行恢复。

使用DBMS_FLASHBACK.ENABLE_AT_TIME进行恢复还有一个缺点,那就是在Oracle 9i中SCN和对应时间的映射信息只会保留5天,因此我们无法通过DBMS_FLASHBACK.ENABLE_AT_TIME来恢复5天前的数据。如果你想使用闪回查询来恢复5天前的数据,你必须自己来确定需要恢复的SCN,然后使用

DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUMBER); 来定位你的恢复时间点,下面是使用方法:

15:58:58 SQL> VARIABLE SCN_SAVE NUMBER;

16:13:43 SQL> EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;

PL/SQL procedure successfully completed.

16:13:50 SQL> print SCN_SAVE;

SCN_SAVE

----------

2.1202E+11

16:28:34 SQL> execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);

PL/SQL procedure successfully completed.

另外,在使用DBMS_FLASHBACK.ENABLE_AT_TIME前,你必须设定你的NLS_DATE_FORMAT的精确程度,Oracle默认的是精确到天,如果你不设定,像上面的例子你不会得到预期结果。

2、如果你使用sysdate和DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER来获取时间点或者SCN值,你必须注意它们取得都是当前的时间点和SCN值。

3、你只能在事务开始时进入闪回查询模式,如果之前有DML操作,则必须COMMIT。

4、闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值