oracle flashback table 闪回恢复

简单来讲,如果我们把flashback query看做是恢复记录,则flashback table就是用来恢复表的(由于记录是以表为载体存储,因此flashback table也应该看做是恢复记录,只不过相对于flashback query而言,其粒度更大一些),
同时呢,在Oracle10g中又新引入了一个叫做Recycle Bin的功能(主要针对表及其关联的对象,比如索引约束啥的),被删除的表并非真正删除,而是先通过修改数据字典的方式,将其改名并放入recyclebin,如果要恢复recycle bin中对象的话,
借助flashback table是最简便的方式。除此之外,flashback table也提供了类似flashback query中as of scn/timestamp的方式,借助undo数据,直接将现有的表恢复到某个指定的点或scn时的状态。

1、Flashback Table之从RECYCLEBIN中恢复

要恢复recyclebin中的表,注意语句如下:Flashback table [objName] to before drop,这个obj_name即可以是表名,也可以是recyclebin中的对象表(支持同时操作多个表,表名之间以逗号分隔即可),由于该项功能是恢复被删除表,因此官方对其还有另外一称谓:flashback drop。
select t.original_name,t.type from recyclebin t;
可以查询出你drop操作进入回收站recyclebin中的内容。然后想恢复可以执行:
Flashback table [objName] to before drop;
Flashback table语句同时提示了一个rename to [newTBname]的子句,如果要恢复的表在当前schema中已经存在同名的表,建议你在恢复时通过rename to 子句为待恢复的表指定一个新的表名,不然数据库会报ORA-38312错误。
Flashback table tbname to before drop rename to tbname_bak;
PS:关于数据实例在我另外一篇博文中有详细介绍《Oracle Purge和drop的区别》
PS另外一种可视化简单方法:用PL/链接数据库,点开Recycle Bin里面的内容就是你回收站的记录。找到你想要恢复的记录,点击右键Restore。

2、Flashback Table之从UNDO中恢复

某些时候,我们要处理的表并不是被意外删除,而是被反复修改过多次,希望能回复到之前的某个点,通过前面的学习,你一定会说没啊,借助flashback query就可以,没错,flashback query确实可以,
但flashback query只是查询出记录,如果想做恢复还需要写出相应的insert或update,也许还需要相当多的where条件做判断,一个不甚,可能恢复的数据就是错误的。
老板又没在跟儿前站着,我们没必要在这个时刻用这种方式展示我们娴熟的指法,因此,我们需要更高效更严谨更简便的方式:flashback table tbname to scn/timestamp,助你达成梦想。
Scn和timestamp的用法通过前面flashback query的学习大家应该都比较熟了,flashback table中指定scn或timestamp的用法与上相同。
记录下当前系统scn(如果不知道确切的scn,恢复时只能通过,但正如前文中讲到的,并不精确,如果通过指定timestamp恢复的话,需要你清楚了解所做的操作大概是在什么)。
我们可以结合as of scn / as of timestamp / Versions between 等Flashback query方法查询到我们想要数据的时间点。然后使用:
Flashback table tb_name to scn 235923450;
这样数据就可以回到scn这个时间点的状态,很方便吧,省去了繁琐delete,update中间步骤,只需要我们找到想要的时间点就可以。

3、Flashback Table之注意事项

a. 基于undo的表恢复,被恢复的表必须启用row movement,不然会报ORA-08189错误,关于row movement的相关知识,在我《Oracle Partition 分区详细总结》有介绍。要查看某表是否启用row movement,可以到user_tables中查询(或all_tables,dba_tables),例如:
select row_movement from user_tables where table_name='TB_NAME';

要启用或禁止某表row movement,可以通过下列语句:
ALTER TABLE TB_NAME ENABLE/DISABLE ROW MOVEMENT;
b. 基于undo的表恢复,需要注意前文制约因素中提到的ddl的影响。
c. 基于undo的表恢复,flashback table实际上做的也是dml操作(会在被操作的表上加dml锁),因此还需要注意triggers对其的影响,默认情况下,flashback table to scn/timestamp在执行时会自动disable掉与其操作表相差的triggers,
如果你希望在此期间trigger能够继续发挥做用,可以在flashback table后附加ENABLE TRIGGERS子句。
d. 基于undo的表恢复,索引会自动维护,但统计信息并不会恢复到指定的时间点。
e. 基于recycle bin的表恢复,flashback drop不能恢复参照完整性,这很容易理解,毕竟在该表删除之后,其被参照表是否有修改它已经无法控制了,因此如果该表有主外键约束的话,恢复之后,该约束是disable状态,需要dba手工处理。
f. 基于recycle bin的表恢复,所操作的表必须是存在于本地管理表空间中。Flashback drop不能恢复字典管理表空间中被删除的表,也不能恢复系统表。
g. 基于recycle bin的表恢复,被恢复的表的关联对象,比如其索引啦,约束的名称不会自动恢复成删除前的名称,而是系统自动生成的名称,如果你对表的索引约束有相关命名规范,那在恢复表之后,需要dba手工将索引约束等改名。
h. 当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop时,也不能恢复依赖其的物化视图,需要dba手工介入重新创建。
i. 相对于被删除的表而言,当数据文件空间不足时,oracle会首先清理被删除表的索引,因此假如你执行flashback table to before drop而发现缺少索引可能是正常的,说明你显然错过了最佳的恢复时机。
j. Flashback table命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《oracle flashback table 闪回恢复
本文地址:https://www.zhiletu.com/archives-294.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微