环境:

23:05:08 hr@ORCL (^ω^) select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

1 原理介绍
       原理一
       多版本读一致性

flashback query依赖于undo中存储的数据的前镜像,在AUM下,我们通过undo_retention及undo表空间的大小,来设置undo数据的保留时间,只要before image没有被覆盖,那么flashback query就是可能的。

oracle通过undo来确保写不阻塞读,当一个事务在写数据时,另一个事务可以通过undo表空间中的数据的前镜像来构造所需的记录集,无需等待commit或rollback。而且undo数据占用的空间并非一次性消费,而是通过AUM动态分配和回收,这样在不同时间点,同一条记录可能被多次修改,也就可能在undo表空间存在多条对应的记录,也就是对应多个版本,flashback便是利用多版本读一致性,通过查询不同时间点的数据和前镜像,获得查询指定时间点(而不仅仅是当前)数据的能力。

flashback query这一特性,最常被应用的就是修复误操作的数据,也就是基于select的扩展:select .. as of timestamp | scn,让user拥有了“穿越”过去的能力,至于恢复,便是insert tasble ..select或create table as select。

原理二
         SMON_SCN_TIME

SMON_SCN_TIME是SCN和时间的映射表,也是flashback 时间的限制。从oracle 10g开始,LGWR首先会在SGA中记录SCN与时间的映射关系,SMON则定期检查SGA是否内存中记录的映射大于磁盘上的,如果有就刷新记录到磁盘。由于LGWR至少每3秒就会被激活一次,所以现在SMON_SCN_TIME能够支持大于3秒flashback。

oracle 10g提供了两个新的函数对SCN和timestamp进行相互转换:scn_to_timestamp和timestamp_to_scn.这两个函数的时间转换正是依赖于SMON_SCN_TIME表,oracle能够转换的最小SCN,也就是这个表中记录的最小记录。即使执行flashback query时指定as of timestamp查询undo中的数据,实际获取的数据是以指定的时间对应的SCN时的数据为基准。例如,SCN:339988,339989分别匹配2009-05-30 13:52:00和2009-05-30 13:57:00,则当你通过as of timestamp查询2009-05-30 13:52:00或者2009:05-30 13:56:59这段时间点内的任何时间,oracle都会将其匹配为SCN:339988到undo表空间中查找,也就是说在这个时间内,不管你指定的时间点是什么,查询返回的都将是2009-05-30 13:52:00这个时刻对应的SCN的数据。

16:11:47 sys@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
3898458
16:12:11 sys@ORCL (^ω^) alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';
会话已更改。
16:12:45 sys@ORCL (^ω^) select scn_to_timestamp(3898458)  scn from dual;
SCN
---------------------------------------------------------------------------
10-9月 -12 04.12.11.000000000 下午
16:13:13 sys@ORCL (^ω^) select timestamp_to_scn(sysdate-5/1440) scn from dual;
SCN
----------
3898333
16:31:22 hr@ORCL (^ω^) select scn,to_char(time_dp,'yyyy/mm/dd hh24:mi:ss') from sys.smon_scn_time;
SCN TO_CHAR(TIME_DP,'YYYY/MM/DDHH24:MI:SS'
---------- --------------------------------------
3361371 2012/09/03 18:23:53
3361948 2012/09/03 18:33:52
3362176 2012/09/03 18:38:53
3362674 2012/09/03 18:48:52
3363615 2012/09/03 19:03:52
3363792 2012/09/03 19:08:53
3364474 2012/09/03 19:18:43
3364715 2012/09/03 19:23:47
3365034 2012/09/03 19:28:48
3365400 2012/09/03 19:38:45

2 实验

① 基于时间的查询与恢复

22:47:40 hr@ORCL (^ω^) select count(*) from t1;
COUNT(*)
----------
17
22:47:49 hr@ORCL (^ω^) delete t1 where rownum<5;
已删除4行。
22:49:15 hr@ORCL (^ω^) commit;
提交完成。
22:49:21 hr@ORCL (^ω^) select count(*) from t1;
COUNT(*)
----------
13
22:49:39 hr@ORCL (^ω^) select count(*) from t1 as of timestamp sysdate-3/1440;
COUNT(*)
----------
17
22:50:47 hr@ORCL (^ω^) create table t1_recov as select * from t1 as of timestamp sysdate-3/1440;
表已创建。
22:52:17 hr@ORCL (^ω^) select count(*) from t1_recov;
COUNT(*)
----------
17
22:52:30 hr@ORCL (^ω^) commit;
提交完成。
22:52:39 hr@ORCL (^ω^)

② 基于SCN的查询与恢复

22:52:39 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
3928361
22:56:35 hr@ORCL (^ω^) select count(*) from t1;
COUNT(*)
----------
13
22:56:58 hr@ORCL (^ω^) delete t1 where rownum<5;
已删除4行。
22:58:20 hr@ORCL (^ω^) commit;
提交完成。
22:58:25 hr@ORCL (^ω^) select count(*) from t1;
COUNT(*)
----------
9
22:58:37 hr@ORCL (^ω^) select count(*) from t1 as of scn 3928361;
COUNT(*)
----------
13
22:59:04 hr@ORCL (^ω^) create table t1_recov_scn as select * from t1 as of scn 3928361;
表已创建。
23:00:12 hr@ORCL (^ω^) select count(*) from t1_recov_scn;
COUNT(*)
----------
13
23:00:29 hr@ORCL (^ω^) commit;
提交完成。

flashback六大技术之flashback query相关推荐

  1. flashback六大技术之flashback version query

    环境: 23:47:03 hr@ORCL (^ω^) select * from v$version where rownum=1; BANNER -------------------------- ...

  2. flashback六大技术之flashback drop

    环境: sys@ORCL> select * from v$version where rownum=1; BANNER ------------------------------------ ...

  3. oracle 10g delete flashback,10g新特性,flashback系列 来自piner

    一 Flashback database falshback database是采用日志 falsgback drop是采用表空间的空间 其它的都是与undo有关... fashback是我对10g一 ...

  4. 以数据为中心,立足六大技术支柱,英特尔推动神经拟态计算、量子计算前沿探索

    近日,英特尔中国研究院院长宋继强围绕 "英特尔如何构建技术基石,驱动未来计算"为主题做了演讲.他阐述了英特尔将坚持"以数据为中心"的目标,并指出依托于XPU产品 ...

  5. 重磅!英特尔终于挤出10nm芯片 六大技术战略,震动芯片届

    戳蓝字"CSDN云计算"关注我们哦! 最近几日,对英特尔来说可谓大事连连,在北京,正举办20岁生日的英特尔中国研究院的隔壁楼房着了大火,而远在大洋彼岸,英特尔在加州Los Alto ...

  6. 元宇宙通证-十二、元宇宙 BIGANT 六大技术全景图

    十二.元宇宙 BIGANT 六大技术全景图 正如互联网经济是架构在IT相关技术基础之上,元宇宙的崛起离不开庞大技术体系的支撑 我们研究了业界对元宇宙建设体系的各种分析和论述,总结提炼出支撑元宇宙的六大 ...

  7. 高新的技术对不对_高新技术六大技术领域

    1 高新技术六大技术领域 一般认为,高技术包括六大技术领域, 12 项标志技术和 9 个高技术产业. 它们之间的关系是:六大高技术领域是信息技术.生物技术.新材料技术.新能 源技术.空间技术和海洋技术 ...

  8. 前沿聚焦:2022最受关注的六大技术热词,你都知道吗?

    本文分享自华为云社区<前沿聚焦:2022最受关注的六大技术热词,你都知道吗?>,作者:华为云社区精选. 30多年前,钱学森畅想将VR技术应用于人机结 合与人脑开发,并给其取名为" ...

  9. 元宇宙的六大技术支柱

    元宇宙的六大技术支柱(BIGANT): 1.B=Blockchain,区块链技术: 2.I=Interactivity,交互技术: 3.G=Game,电子游戏技术: 4.A=AI,人工智能技术: 5. ...

最新文章

  1. flannel 概述 - 每天5分钟玩转 Docker 容器技术(58)
  2. eslint vscode 自动格式化_配置VSCode编辑器适配VUE3开发
  3. 继续上次WDS部署安装未在真机上面实现问题解答
  4. 嵌入式处理器的体系架构与内核详解
  5. 神经网络 | Hopfield神经网络(附python源代码)
  6. EHCache 初步使用指南
  7. 空间索引不能用analyze进行分析
  8. 斥资近1亿港元,小米二次回购
  9. [html] p标签里面嵌套img标签会出现向上高3像素是什么原因?如何处理?
  10. 【Web网站服务器开发】Apache 和 Tomcat的区别及配置
  11. [cogs1065]绿豆蛙的归宿
  12. 权限管理数据表设计说明
  13. 继承关系 c# 1613704854
  14. 【Error】Less-loader 版本过高,TypeError: this.getOptions is not a function
  15. input type属性为file时(type=file),上传一次然后做更新input的change事件
  16. android合入第三方库,Android中inflate和merge结合使用
  17. 太完整了!塞班java软件下载
  18. 红米3 MoKee 7.1.2_r36 自编译版/去魔趣中心、宙斯盾/息屏禁止刷新UI 2018年5月5日更新...
  19. qt学习之路(三)之使用QT语言家
  20. java小游戏程序的编写

热门文章

  1. jQuery使用ajaxSubmit()提交表单
  2. SQL CASE语句的使用
  3. python中合法的赋值语句是_以下( )是合法的Python赋值语句。_学小易找答案
  4. 傲游研发中心在京成立
  5. 酷狗音乐动态壁纸脱离酷狗音乐独立运行
  6. SAP 各大常用模块汇总介绍(一)
  7. 基于Android的旅游app的设计与实现
  8. 阿里年薪50WJAVA工程师转大数据学习路线!
  9. sql to_char 日期转换字符串
  10. Linux---systemctl命令