1.查看数据库归档和闪回状态,及环境准备
SQL> archive log list;
SQL> select flashback_on from v$database;
关闭数据库,启动归档和闪回
SQL> shutdown immediate;
启动到mount模式
SQL> startup mount;
开启归档
SQL> alter database archivelog;
如果归档没有打开,打开归档[因为flashback依赖Media recovery,所以在打开flashback之前必须先启用归档]
SQL> alter database flashback on;
SQL> alter database open;
SQL> archive log start;
SQL> archive log list;
启用闪回数据库
要想使用Flashback Database, 必须使用Flash Recovery Area。 要配置的2个参数如下,一个是大小,一个是位置。如果数据库是RAC,flash recovery area 必须位于共享存储中。数据库必须处于archivelog 模式.参数db_flashback_retention_target控制闪回日志的保留时间,默认是1440,即24小时。

SQL>alter system set db_flashback_retention_target=2880;设置归档时间:(默认的是一天1440分钟)
SQL> show parameter db_flashback_retention_target;(查询归档时间)
设置撤销表信息:
alter system set undo_managerment=auto;设置为auto才可以使用闪回查询
alter system set undo_retention=900 SCOPE=BOTH;最长保留时间(单位秒)
alter system set undo_tablespace=undotbs1;

SQL> show parameter undo;(查询undo撤销时间)

关于Oracle闪回的打开和关闭,主要就是需要注意以下几点:
1、闪回打开的前提是数据库归档必须打开
2、闪回打开/关闭和归档打开/关闭一样,都是在mount模式下
3、如果要在打开闪回的数据库上关闭归档则必须先关闭依赖于归档的闪回功能

关于V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少, 该视图就可以查看许多有用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 可以恢复的时间长度
Estimated_flashback_size: 根据恢复时间长度对需要的空间大小的估计值

SQL> select Oldest_flashback_time,Oldest_flashback_scn,Flashback_size,Retention_target,Estimated_flashback_size from V$flashback_database_log;

关于v$flashback_database_stat 
这个视图用来对Flashback log  空间情况进行更细粒度的记录和估计。 这个视图以小时为单位记录单位时间内数据库的活动量, Flashback_Data  代表 Flashback log 产生数量, DB_Date  代表数据改变数量, Redo_Date 代表日志数量,通过这3 个数量可以反映出数据的活动特点,更准确的预计 Flash Recovery Area 的空间需求
SQL> select BEGIN_TIME bt,END_TIME et,FLASHBACK_DATA fd,DB_DATA dd,REDO_DATA rd,ESTIMATED_FLASHBACK_SIZE efs from v$flashback_database_stat;

v$flashback_database_logfile
该视图主要记录闪回日志的详细信息,NAME闪回日志的位置,FIRST_CHANGE#闪回日志中记录的最早的SCN,FIRST_TIME闪回日志中记录的最早时间
SQL> select * from v$flashback_database_logfile;

2.Flashback Query闪回时间点查询
闪回时间点查询的另一种方法是首先用PL/SQL包dbms_flashback的enable_at_time或enable_at_scn存储过程锁定一个会话级别的闪回时间目标,即进入闪回模式,随后的查询命令就可以省略“as of”,但也能达到使用“as of”的闪回效果,直到调用dbms_flashback. disable存储过程关闭闪回模式为止。
比如,将闪回模式会话定格在15分钟前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);

现在,虽然没有“as of”子句,以下查询命令的含义就是查看15分钟前的hr.employees表:
需要注意此时若访问SYSDATE、SYSTIMESTAMP等日期函数,它们的返回值还是正常的当前的值,而不是静止在15分钟以前。另外,处于闪回会话模式时,执行dml和ddl将报错:
还有,SYS用户不能调用enable_at_time和enable_at_scn

在回到过去对所有感兴趣的表查询一番后,再调用disable存储过程关闭闪回会话模式回到正常状态:
SQL> exec dbms_flashback.disable

Flashback Version Query(闪回版本查询)
闪回版本查询可以贯穿一定长度的时间窗口,通过只使用一条查寻命令就能返回该时间窗口内的不同时间点上的数据,其语法是在表名之后加“versions between”子句。

4.闪回数据归档(Flashback Data Archive)
闪回查询对撤销数据及参数undo_retention的依赖注定了它们在大事务量的情况下闪回时间窗口将会很小,想要查询数月之前的“旧”数据绝对不可能,但在闪回数据归档面前这并不是不可能的。
闪回数据归档的工作原理
将原本只能保存在UNDO表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间(permanent类型的表空间)中。并且不像undo_retention参数那样是个影响整个数据库的设置,闪回数据归档可以只为特定的表服务,这样就可以长时间地保存感兴趣的“旧”数据了。
闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。例如可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。  以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
Flashback archive相关数据字典

* 代表DBA 或者User。

比如,在USERS表空间中创建一个能够将“旧”数据保存1年的数据归档,取名为“FDA1”,操作者必须拥有“flashback archive administer”系统权限:
SQL> create flashback archive fda1 tablespace users retention 1 year;
有了归档,就可以使用“flashback archive”子句在特定的表上启用闪回数据归档功能了。比如,让hr.employees使用fda1,从此该表的修改历史将保留1年:
SQL> alter table t_dealer flashback archive fda1;

或新建一个归档闪回区给一个表空间或指定一个表空间
SQL>create flashback archive default fbar_1 tablespace "USERS" quota 100M
SQL>CREATE FLASHBACK ARCHIVE fbar_1 TABLESPACE "TBS_DATA1"
一个归档区可以不仅仅对应一个表空间,可以采用如下的命令增加或者删除该归档区的表空间的个数,这样也达到了增加或者减少该归档区空间的目的。
SQL>ALTER FLASHBACK ARCHIVE fbar_1 ADD TABLESPACE "TBS_DATA2" quota 20M;

也可以从归档区中删除表空间。注意:这个删除仅仅是表示从数据归档区删除,并不是删除该表空间。
4.删除数据归档区fbar_2的表空间TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";

若执行以上命令的是个普通账号,比如HR用户,那么其在执行命令前必须被授予“flashback archive”对象权限,比如:
SQL> grant flashback archive on fda1 to hr;

使用“no flashback archive”子句可以关闭特定表上的闪回数据归档功能。执行该命令需要“flashback archive administer”系统权限:
SQL> alter table t_dealer no flashback archive;
删除整个数据归档区
SQL> drop flashback archive fla2;

Flashback Table
当一张表被修改后(非删除)需要恢复指定表,需在修改表是记录时间戳以便恢复。
SQL> select sysdate,timestamp_to_scn(sysdate) from dual; (修改数据时要记录时间戳)
SYSDATE TIMESTAMP_TO_SCN(SYSDATE)

2017-08-16-16:17:52 196349262

使用数据归档前需要开启表上的行迁移:
SQL> Alter table t_dealer enable row movement;
SQL> flashback table t_dealer to scn 196349262;
SQL> Alter table t_dealer disable row movement;(完成归档后关闭表上的行迁移)

若没有记录时间戳,这可以查询指定时间内数据量来判断数据是佛完整,来恢复数据。
SQL> select count(*) from T_T_THIRDPAY_ORDER_H as of timestamp to_timestamp('20170816 18:00:00','yyyy-mm-dd hh24:mi:ss');

COUNT(*)
325
使用数据归档前需要开启表上的行迁移:
SQL> Alter table t_dealer enable row movement; 
开始闪回
SQL> flashback table T_T_THIRDPAY_ORDER_H to timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
SQL> Alter table t_dealer disable row movement;(完成归档后关闭表上的行迁移)

Flashback Data
若没有记录时间戳,则可恢复整个数据库
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
*TO_CHAR(OLDEST_FLAS
2017-08-16 11:23:46*
这个日期为能回退的最早时间,取决于保留的Flashback database log的多少
恢复数据到指定时间点
SQL> shutdown immediate;
SQL> startup mount;
SQL> flashback database to timestamp to_timestamp('2017-08-16 16:00:46','yyyy-mm-dd hh24:mi:ss');
恢复成功后,最好先以readonly的方式打开数据库,以确认恢复达到预期,如果没有达到预期,还可以再进行恢复
SQL> alter database open read only;
检查恢复完成后打开数据库
恢复成功后,以resetlog方式打开数据库:
SQL> shutdown immediate;
SQL> startup mount
SQL> alter database open resetlogs;

查哪些表已经启用了闪回数据归档
SQL>select * from dba_flashback_archive_tables;
查数据库中所有的闪回数据归档
SQL>select flashback_archive_name,retention_in_days from dba_flashback_archive;
查有关闪回数据归档所使用的表空间的信息
SQL>select flashback_archive_name,tablespace_name,quota_in_mb from dba_flashback_archive_ts;
删除闪回归档数据
SQL>drop flashback archive flash1;

Flashback Drop
Flashback drop是从Oracle 10g开始才有的功能,原理是每个表空间都会有严格回收站的逻辑区域,当drop时,被删除的表及其关联对象不会被物理删除,只是转移到回收站中,给用户提供一个恢复的可能。

注意事项
对system表空间无效, 只能用于非系统表空间和本地管理的表空间
数据库的版本不能低于10g,否则很多命令无法使用
对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
对象能否恢复成功,取决与对象空间是否被覆盖重用。
当删除表时,信赖于该表的物化视图也会同时删除,但是由于物化视图并不会被放入recycle bin,因此当你执行flashback table to before drop 时,也不能恢复依赖其的物化视图,需要dba 手工介入重新创建。
对于Recycle Bin中的对象,只支持查询.
删除几张表,然后指定表恢复

Oracle11g则为flashback家族又带来一个新的成员:flashback data archive。

初看起来,flashback data archive和flashback query没有太大的不同,都是通过as of能够查询之前的数据,但是他们的实现机制是不一样的。Flashback query是通过直接从undo中读取信息来构造旧数据,这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。
Falshback data archive特性则通过将变化数据另外存储到创建的flashback archive中,以和undo区别开来,这样就可以通过为flashback archive单独设置存活策略,使得可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大的减少空间需求。

ORACLE闪回机制分析与研究应用的更多相关文章

  1. Oracle闪回机制

    最近学习oracle的时候,无意中看到oracle的闪回技术flashback,原来oracle在delete数据或者drop的时候,不是直接删除,而是跟windows一样,先把数据放入到回收站中. ...

  2. Oracle多表更新及MERGE命令和闪回机制还原数据表

    一.多表更新 比如线上有个系统由于某一个模块出现异常,导致系统整体的数据出现了错误,需要你手动改写数据库错误,Oracle update语句更新的值来自另一张表 update语法最基本的格式为 UPD ...

  3. Oracle闪回表

    Oracle闪回技术 场景:测试环境数据库的表数据被误删除. 解决思路:使用闪回表技术 原理 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小 ...

  4. Oracle闪回恢复误删除的表、存储过程、包、函数...

    在日常的数据库开发过程汇总难免会出现一些误删除的动作, 对于一些误删的操作我们可以通过oracle提供的闪回机制恢复误删数据, 从而避免出现较大的生产事故. 下面是本人平时工作中积累的一些常用的操作, ...

  5. Oracle 闪回 找回数据的实现方法

    Oracle 闪回 找回数据的实现方法 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复.这篇文章主要介绍了Oracle 闪回 找回 ...

  6. Oracle闪回flashback

    参考资料:Using Oracle Flashback Technology Oracle 11g的新特性闪回操作 闪回查询 闪回查询 闪回版本查询 闪回事务查询 闪回数据 闪回表 闪回删除 闪回数据 ...

  7. Oracle 闪回特性(FLASHBACK DATABASE)

    --===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...

  8. Oracle闪回操作

    Oracle闪回操作 1. 记录当前时间或SCN 在数据库变动前记录时间或SCN SQL> select  to_char(sysdate,'YYYY-MM-DD HH24:mi:ss') fr ...

  9. Oracle 闪回

    Oracle 闪回特性(FLASHBACK DATABASE) 本文来源于:gerainly 的<Oracle 闪回特性(FLASHBACK DATABASE) > -========== ...

随机推荐

  1. 基于flex的不定个数的按钮组

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  3. 链式编程:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)

    public class NutritionFacts { private final int servingSize; private final int servings; private fin ...

  4. 使用Quartz.net来执行定时任务

    Quartz.net使用方法:http://www.cnblogs.com/lizichao1991/p/5707604.html 最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.n ...

  5. [PY3]——Queue

    Queue class Queue(builtins.object) __init__(self, maxsize=0) empty(self) full(self) get(self, block= ...

  6. RabbitMQ上手记录–part 5-节点集群高可用(多服务器)

    上一part<RabbitMQ上手记录–part 4-节点集群(单机多节点)>中介绍了RabbitMQ集群的一些概念以及实现了在单机上运行多个节点,并且将多个节点组成一个集群. 通常情况下 ...

  7. 利用反射,批量启动WCF服务

    对于WCF的宿主启动来说,有好多方法,单独启动也很简单,可以根据业务需要来自由选择(单独启动方法这里就不做解释) 对于业务服务比较多的时候,往往需要多个服务来承载系统,但是如果将服务启动单独写代码启动 ...

  8. 写一个有字符界面的ssh链接工具

    大概的样子 这是大致的样子- 写之前想说的 因为个人工作的的电脑是deepin系统的,系统本身的命令行非常好用,用第三方的ssh工具用不习惯,就想自己写一个. shell脚本是第一次写,写的不是很好, ...

  9. MySQL数据库的回滚失败(JAVA)

    这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...

  10. SpringBoot配置——@PropertySource、@ImportResource、@Bean

    @PropertySource:加载指定的配置文件 package com.hoje.springboot.bean; import org.springframework.beans.factory ...