相关概念

Flashback Data Archive是什么

Flashback data archive是oracle 11g中引入的一个新特性。Flashback archive是一个新的数据库对象,用于存储一个或多表的历史数据。Flashback archive是一个逻辑对象,概念上类似于表空间。实际上flashback archive可以看作是存储一个或多个表的所有事务变化的逻辑空间。

Oracle 11g 中 Flashback Data Archive 特性。将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响 undo 策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,而只是记录了指定表的数据变化。所以,Flashback Data Archive 是针对对象的保护,是 Flashback Database 的有力补充。

它和Flashbak的区别?

在Oracle中的flashback 包括: flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性。

在这些闪回技术当中,除了Flashback Database(依赖于闪回日志)之外,其他的闪回技术都是依赖于Undo撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关。

它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。

换句话说:一般的数据库内undo_retention只设置了900秒,如果事务量太大,在发生误操作后undo内的事务被其他顶掉或超过900秒,那么就无法通过flashbak进行恢复。而Flashback Data Archive和undo无关,是单独创建一个闪回归档区,把表级的历史记录都存到归档区里面,可以随时查看表级对象的历史情况。

模拟用Flashback Data Archive恢复

环境准备

数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

是否开启归档:否

是否为RAC:否

建立测试表插入测试数据

建立一个测试表test_table_delete,插入数据如下图所示

查询time_stamp内的数据和执行计划select * from test_table_delete as of timestamp to_timestamp('2020-09-17 13:55:09','yyyy-mm-dd hh24:mi:ss');

可以看到,此时的计划走的是test_table_delete这张表的全表扫描,先记着,后面有用。

创建一个用来存储闪回归档的表空间可以使用现有表空间,但Oracle建议最好使用专用表空间

对表空间的要求:

(1)Flashback data archive只能在ASSM的tablespace上创建

(2)Flashback data archive要求必须使用自动undo管理,即undo_management参数为autocreate tablespace fa_data datafile '/opt/ora_data/fa_01.dbf' size 1G;

查看我们创建的fa_data表空间是否符合要求:select dbt.TABLESPACE_NAME,dbt.SEGMENT_SPACE_MANAGEMENT from dba_tablespaces dbt where dbt.TABLESPACE_NAME = 'FA_DATA';

SEGMENT_SPACE_MANAGEMENT为AUTO代表为ASSM方式段管理的表空间

数据库的undo_management参数也为AUTOConnected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

Connected as lijian@oraclevm

SQL> show parameter undo

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

创建一个闪回归档区

语法:create flashback archive fa_data tablespace fa_data quota 50M retention 1 year;

qutoa后面跟的是闪回归档区的大小,retention后面跟的是要保存多久的历史数据。

qutoa如果不设置,默认自增;当闪回归档区数据超过retiontion设置的值时Oracle会自动清理。

查看闪回归档、闪回归档和表空间的关系select * from dba_flashback_archive;

select * from dba_flashback_archive_ts;

把测试表分配到闪回归档区alter table test_table_delete flashback archive fa_data;

查询DBA_FLASHBACK_ARCHIVE_TABLES视图可以获得已经归档的表select * from dba_flashback_archive_tables;

模拟delete操作(更新不频繁的表)因为测试库没有那么大量的事务,所以undo会保留很长时间

这里为了模拟,所以采用的看执行计划的方式来判断是否走了Flashback Data Archive

并且下面所有的操作,都没有用flashbak操作命令,为的就是区别这两种做法

操作过程:删掉一条数据

恢复目标:恢复到表里之前5条数据的情况delete from test_table_delete where cityid =1002;

commit;

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1001 吉林

1003 武汉

1004 成都

1005 四川

再来看一下之前SQL的执行计划

发现计划里已经走了DBA_FLASHBACK_ARCHIVE_TABLES里的表,说明已经调用到闪回归档的信息,现在查询出来的数据就是走的Flashback Data Archive,不走undo了

进行恢复SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

------------------------------

2020-09-17 14:47:09 --获取现在的时间

-- 这里的2020-09-17 14:25:54可以一直往前找,delete后实际表里存在4条数据

-- 我们需要找到一个时间点,里面有5条数据的。

SQL> select * from test_table_delete as of timestamp to_timestamp('2020-09-17 14:25:54','yyyy-mm-dd hh24:mi:ss');

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1001 吉林

1003 武汉

1004 成都

1005 四川

-- 这里我们直接用insert into语句,where条件后跟cityid=1002,因为我们知道删的数据是哪条。

SQL> insert into test_table_delete (select * from test_table_delete as of timestamp to_timestamp('2020-09-17 14:25:54','yyyy-mm-dd hh24:mi:ss') where cityid = 1002);

1 row inserted

SQL> commit;

Commit complete

-- 可以看到,id=1002,cityname=长春的数据被我们恢复回来了。

-- 无论是删除1条还是多条,还是删除后表里又新增数据,只要知道当时删除的条件,都可以找回来。

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1001 吉林

1003 武汉

1004 成都

1005 四川

模拟truncate操作truncate表操作,用flashbak命令是无法进行闪回的

但Flashback Data Archive将不可能变成了可能。

恢复目标:truncate后恢复到新增3条数据之前的5条记录truncate后恢复到8条记录-- 我又新增了3条数据进去

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1006 甘肃

1007 上海

1008 北京

1001 吉林

1003 武汉

1004 成都

1005 四川

8 rows selected

Commit complete

SQL> truncate table test_table_delete;

Table truncated

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

-- 用之前5条记录的时间点来看,是否还能查出来数据

SQL> select * from test_table_delete as of timestamp to_timestamp('2020-09-17 14:25:54','yyyy-mm-dd hh24:mi:ss');

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1005 四川

1003 武汉

1004 成都

1001 吉林

-- 我们可以将这个sql的结果insert到test_table_delete表里来完成truncate后的恢复

SQL> insert into test_table_delete (select * from test_table_delete as of timestamp to_timestamp('2020-09-17 14:25:54','yyyy-mm-dd hh24:mi:ss'));

5 rows inserted

SQL> commit;

Commit complete

-- 5条数据被恢复回来

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1005 四川

1003 武汉

1004 成都

1001 吉林

-- 再执行一遍truncate,这次要恢复8条数据

SQL> truncate table test_table_delete;

Table truncated

-- 找到存在8条记录的时间

SQL> select * from test_table_delete as of timestamp to_timestamp('2020-09-17 15:00:00','yyyy-mm-dd hh24:mi:ss');

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1006 甘肃

1007 上海

1008 北京

1005 四川

1003 武汉

1004 成都

1001 吉林

8 rows selected

-- 用Insert语句进行恢复

SQL> insert into test_table_delete (select * from test_table_delete as of timestamp to_timestamp('2020-09-17 15:00:00','yyyy-mm-dd hh24:mi:ss'));

8 rows inserted

SQL> commit;

Commit complete

SQL> select * from test_table_delete;

CITYID CITYNAME

-------------------------------------------------- --------------------------------------------------

1002 长春

1006 甘肃

1007 上海

1008 北京

1005 四川

1003 武汉

1004 成都

1001 吉林

8 rows selected

SQL>

关于Drop table的操作

对于加入了归档空间的table,进行删除的时候会产生一个报错,强制不让你drop这个表

从另一种角度来说,也是存在一定的安全因素。

如果非要删除,那么需要用dbms_flashback_archive包来解除关联关系,我们来实验一下。SQL> drop table test_table_delete;

drop table test_table_delete

ORA-55610: 针对历史记录跟踪表的 DDL 语句无效

SQL> EXEC DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA('LIJIAN','TEST_TABLE_DELETE');

PL/SQL procedure successfully completed

SQL> drop table test_table_delete;

drop table test_table_delete

ORA-55610: 针对历史记录跟踪表的 DDL 语句无效

SQL> exec dbms_flashback_archive.reassociate_fba('LIJIAN','test_table_delete');

PL/SQL procedure successfully completed

发现执行了dbms_flashback_archive包来解除关联关系,我们也无法drop table

网上的资料说是Oracle的一个bug,也有资料说是在11.2版本修复的,但是我是11.2.0.4试过了也不行

既然drop不行,那么测试下rename和一些添加、修改字段的操作,具体的测试步骤不写了,大概是这样:在原表增加一个字段,不用涉及到dbms_flashback_archive包的相关操作,直接新增就可以,在主表增加完成后闪回归档空间的对象表自动增加一个列,如图所示:

2.如果主表中删除一个列,也不需要涉及到dbms_flashback_archive包的相关操作,直接删除就可以。但是删除后在闪回归档空间的对象表里存在一列记录,如图所示:

3.要还原删除列后的表,需要先在主表上增加字段后从对应时间点内恢复

如果不需要在闪回归档空间的对象表里保存已经删除列的信息,则需要用dbms_flashback_archive包进行解除关系,之后删除回归档空间的对象表里的列。

如果真要强行drop table,那么只能解除表和闪回归档空间的关系,带来的后果是无法再恢复之前的历史记录。alter table test_delete no flashback archive;

总结

通过Flashback Data Archive,我们可以更好的管理表级别的恢复,但是使用Flashback Data Archive也有一些限制。

比如我们应该规划数据库中哪些表是非常重要的,将它们加入到闪回归档区里。

另外还需要单独为空间进行规划,这需要一定的存储用来保存你期望的历史数据。

对于频繁修改的表,可能不太适用。

以上。

oracle11g怎样进行闪回,模拟Oracle11g下用Flashback Data Archive进行恢复的若干场景相关推荐

  1. oracle闪回数据归档,oracle 11g Flashback Data Archive(闪回数据归档)

    Oracle 11G提供了丰富的回闪查询功能,对于人为的错误操作,历史数据订正,操作流程记录等有非常大的帮助,下面就来详细介绍下这个特性 回闪查询的原理: Oracle中有UNDO表空间,用来存放数据 ...

  2. 闪回之 Flashback Data Archive

    背景: Oracle 11g 中 Flashback Data Archive 特性.将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以 ...

  3. 【转载】oracle闪回技术详解之闪回drop(神奇的flashback)

    写在前面:删库跑路,相信这是绝大多数程序员会经常听到的一个词.俗话说:常在河边走,哪有不湿鞋,作为经常和数据打交道的程序员也好,运维实施也好,有时难免会出现数据误删除,误操作等情况.如果你是一个ora ...

  4. oracle 11g Flashback Data Archive(闪回数据归档)

    Flashback Data Archive(闪回数据归档) UNDO表空间记录的回滚信息虽然可以提供回闪查询,但时间久了,这些信息会被覆盖掉,其实只要事务一提交,他们就变成可覆盖的对象了,所以经常在 ...

  5. oracle闪回技术详解之闪回drop(神奇的flashback)

    写在前面:删库跑路,相信这是绝大多数程序员会经常听到的一个词.俗话说:常在河边走,哪有不湿鞋,作为经常和数据打交道的程序员也好,运维实施也好,有时难免会出现数据误删除,误操作等情况.如果你是一个ora ...

  6. oracle11g闪回默认路径,ORACLE11G开启数据库闪回

    准备: 首先必须按照完毕Oracle11g数据库产品及数据库:其次当前数据库的闪回是关闭的. 开始实验: 检查数据库的闪回状态(我这是关闭的) SQL> select FLASHBACK_ON ...

  7. oracle flashback与归档关系,Oracle Flashback Archive——Oracle闪回归档(下)

    Flashback Archive是Oracle 11g推出的具有针对性和强制性的数据透明归档技术.本篇我们集中介绍与该特性相关的权限和DDL操作问题. 9.Flashback Archive相关权限 ...

  8. oracle flashback与归档关系,Oracle闪回归档(下) —— Oracle Flashback Archive

    另一个与flashback archive相关的系统权限是flashback archive administrator,拥有这个权限的用户可以执行下列操作类型: -Create flashback ...

  9. oracle flash_back oracle闪回技术详解,oracle flashback 闪回技术实例

    oracle flashback 闪回技术实例 相关操作 1.DBA必须设定undo保持力足够大以能够重构需要闪回的数据 ALTER SYSTEM SET UNDO_RETENTION=; secon ...

  10. Oracle 闪回技术详解(flashback)

    文章目录 1 概述 2 实例说明 2.1 闪回查询 2.2 闪回版本查询 2.3 闪回事务查询 2.4 闪回表 2.5 闪回删除 3 扩展 1 概述 为了使 Oracle 数据库从误操作中迅速地恢复, ...

最新文章

  1. Socket支持多用户并发访问的解决办法
  2. 电子科大电气工程导师介绍绍_电子科技大学计算机科学与工程学院研究生导师介绍:葛树志...
  3. QT的QClipboard类的使用
  4. CodeForces - 1307D Cow and Fields(最短路+思维)
  5. 大文件及文件夹上传(续)
  6. java实现遍历树形菜单方法——实体类VoteTree
  7. Strategy 定义一系列算法或策略,把它们封闭起来,并且使它们相互可以替换。各算法或策略可以独立于客户程序而变化。...
  8. OpManager网络性能监控
  9. 秒、毫秒和年月日的转换
  10. UltraEdit如何激活
  11. 微信浏览器自动播放多个视频黑屏,h5video,videojs
  12. 针对Win10 Tensorflow-2.x 训练 线程冻结(假死、卡住、几个epoch后、中途停滞、CPU占用0%) 等问题的排查总结
  13. 房多多2020年财报:再度录得亏损,第四季度毛利率骤降至8%
  14. 小说更新太慢怎么办_这几部小说因更新太慢,惹得书迷大怒,粉丝扬言要打断作者的腿!...
  15. Fildder拦截请求并修改请求参数
  16. 关于工作和生活的点滴心得
  17. word文件解除保护模式让其可编辑
  18. GitLab-CI持续集成(CI)的介绍与运行机制
  19. 经济法基础(2020年)——第三章 支付结算法律制度
  20. 文心ERNIE 3.0 Zeus千亿参数大模型,一键生成“学术范儿”论文标题

热门文章

  1. windows 空闲超时 非管理员如何破解
  2. javaee utf-8文件的转换
  3. ARC和MRC混合使用
  4. 洛谷 U5737 纸条
  5. MYSQL PGA SGA设置
  6. 群体智能优化算法之人工鱼群优化算法(Artificial Fish Swarm Algorithm,AFSA)
  7. 【博客管理】他山之石简介【置顶】
  8. 【Android学习笔记】【Android开发环境搭建】安装JDK
  9. Python日期类的实现
  10. 【skimage.util.shape】有关view_as_windows裁剪数组及恢复的简单尝试