度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1009|回复: 3
打印 上一主题 下一主题

[分享] 最简单的Oracle数据恢复 select as of使用方法

[复制链接]

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
跳转到指定楼层
楼主
发表于 2020-4-3 15:58:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过执行一个带as of 子句的select语句进行闪回查询,可以闪回检索过去某个时间存在的数据,一个闪回查询被用来重现过去存在过的数据,这个查询明确的引用了过去的一个时间段或SCN号,闪回查询返回的数据都是过去某时刻已经提交的数据。

可能使用到闪回查询的地方:
1、恢复丢失的数据或撤销已经提交的错误。例如如果你不小心删除或更新了行,并且做了提交操作,你可以立刻撤销这个错误。
2、比较当前数据和历史数据的一致性。例如,你可能需要生成一份前一天数据更新的日报告,你可以分别比较表的每一行或找到行的交集和并集。
3、在某个特殊时间检查事务型数据的状态。例如,你可以在某一天验证账户收支。
4、移除某些因需求储存的暂时数据以简化应用设计。通过闪回查询你可以从数据库中直接获取到过去的数据。
5、使用包装应用(例如报表生成工具)的历史数据
6、为应用提供自服务错误更正,因此可以让用户撤销或更正他们的错误。

示例:
SQL> select * from scott.dept;

    DEPTNO DNAME                        LOC
---------- ---------------------------- -------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                         CHICAGO
        40 OPERATIONS                   BOSTON
现在,我们来增加一条数据,并提交:

SQL> insert into scott.dept values(50,'错误数据','CHINA');
已创建 1 行。

SQL> select * from scott.dept;


    DEPTNO DNAME                        LOC
---------- ---------------------------- -------------------------
        10 ACCOUNTING               NEW YORK
        20 RESEARCH                 DALLAS
        30 SALES                         CHICAGO
        40 OPERATIONS               BOSTON
        50 错误数据                     CHINA

SQL> commit;  (2016-5-3 15:50:00)

提交完成。

正常情况下,由于已经做了commit操作,所以rollback已经无效了,要想得到2016-5-3 15:50:00之前的数据,怎么办?
使用timestamp时间点闪回:
SQL> select * from scott.dept as of timestamp to_timestamp('2016-05-03 15:30:00','yyyy-mm-dd hh24:mi:ss');

DEPTNO DNAME                        LOC
---------- ---------------------------- -------------------------
        10  ACCOUNTING                   NEW YORK
        20  RESEARCH                      DALLAS
        30  SALES                         CHICAGO
        40  OPERATIONS                   BOSTON
闪回查询,主要依靠表空间的undo数据,如果想要追溯更久的数据,就需要设置较大的undo_tablespaces大小和undo_retention。

如果想直接更新当前的表到历史的某个时间状态,可以直接使用flashback关键字:


SQL> alter table scott.dept enable row movement;

表已更改。

SQL> flashback table scott.dept to timestamp to_timestamp('2011-12-09 10:00:00','yyyy-mm-dd hh24:mi:ss');


闪回完成。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

348

主题

3572

帖子

9328

积分

论坛元老

Rank: 8Rank: 8

积分
9328
沙发
发表于 2020-4-3 21:51:14 | 只看该作者
(闪回查询)原理
  Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回。
Flashback query(闪回查询)前提:

  1. SQL> show parameter undo;
  2. NAME                                TYPE       VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. undo_management                     string     AUTO
  5. undo_retention                        integer    900
  6. undo_tablespace                       string     UNDOTBS1
复制代码

其中undo_management = auto,设置自动undo管理(AUM),该参数默认设置为:auto;
Undo_retention = n(秒),设置决定undo最多的保存时间,其值越大,就需要越多的undo表空间的支持。修改undo_retention的命令如下:
  1. SQL> alter system set undo_retention = 3600;
  2. System altered
复制代码
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9328

积分

论坛元老

Rank: 8Rank: 8

积分
9328
板凳
发表于 2020-4-3 21:52:18 | 只看该作者
闪回查询的局限:
1. 不能Falshback到5天以前的数据。
2. 闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。
3. 受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。
4. 对drop,truncate等不记录回滚的操作,不能恢复。
5. 普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:
  1. SQL>grant execute on dbms_flashback to scott;
复制代码

点评

多谢层主补充  详情 回复 发表于 2020-4-4 09:23
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
地板
 楼主| 发表于 2020-4-4 09:23:35 | 只看该作者
万望 发表于 2016-5-3 21:52
闪回查询的局限:
1. 不能Falshback到5天以前的数据。
2. 闪回查询无法恢复到表结构改变之前,因为闪回 ...

多谢层主补充
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-24 15:36 , Processed in 0.116416 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表