oracle 恢复 table 删除数据 恢复 package(使用闪回)
正文1:表数据删除恢复
--1、查询删除数据时间点之前的数据 select * from 表名 as of timestamp to_timestamp('2016-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss'); --(若没有数据 ,将时间继续提前) --2、启用行移动功能 alter table 表名 enable row movement; --3、恢复数据(激动人心的时刻) flashback table 表名 to timestamp to_timestamp('2016-08-11 16:12:11','yyyy-mm-dd hh24:mi:ss'); 大功告成,数据恢复成功;
正文2:包被覆盖错了,想要闪回 package
注意这里需要使用 dba 权限,否则查看不到
--错误包:XXX_PKG 正确时间:中午12点 SELECT OBJECT_ID FROM all_objects WHERE OBJECT_NAME = 'XXX_PKG'; --如果包直接被删除了,不是被覆盖,那只能先闪回查询对象表 SELECT OBJECT_ID FROM all_objects AS OF TIMESTAMP TO_TIMESTAMP('2018-06-26 12:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE OBJECT_NAME = 'XXX_PKG'; --查到2个对象id,一个包头,一个包体 93163 94602 --根据对象id查询包头和包体内容 SELECT source FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2018-06-26 12:00:00', 'YYYY-MM-DD HH24:MI:SS') where obj# = 93163; SELECT source FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2018-06-26 12:00:00', 'YYYY-MM-DD HH24:MI:SS') where obj# = 94602; --然后确认没问题,用查到的sql内容重新覆盖就好
注意:一般 package body 的内容比较多,怎么复制下来呢?
spool /home/oracle/xxx_pkg.sql
SELECT source
FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2018-06-26 12:00:00', 'YYYY-MM-DD HH24:MI:SS')
where obj# = 93163;
spool off
exit
ll /home/oracle/
知识点
简单总结一下,这里就是利用了 oracle 的闪回查询功能,非常的简单,一看就懂了,但是 oracle 闪回有很多种包括删除表和数据库,闪回事务等等。
最重要的是要理解
SQL> show parameter undo_retention;
NAME TYPE VALUE
-----------------------------------
undo_retention integer 900
这是默认的 900,其中 undo 保留 900s,后面 undo 磁盘不够就可能回收,那样闪回可能会失败,当然也可以强制保留更久,更详细的解释自行百度。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论