oracle 恢复 table 删除数据 恢复 package(使用闪回)

发布于 2023-07-16 21:01:36 字数 1764 浏览 36 评论 0

正文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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

玉环

暂无简介

文章
评论
26 人气
更多

推荐作者

微信用户

文章 0 评论 0

小情绪

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

笨死的猪

文章 0 评论 0

彭明超

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文