百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle备份恢复之Flashback--闪回版本查询

mhr18 2024-09-26 14:21 19 浏览 0 评论

概述

Oracle 的闪回版本查询功能(Flashback Version Query)提供了一个审计行改变的查询功能,它能找到所有已经提交了行的记录,这样可以清楚地看到何时执行了何操作。


语法:

SELECT <column1>...FROM <TABLE>...
VERSION BETWEEN [scn | TIMESTAMP]
[<EXPR > | MAXVALUE] AND <EXPR>| MINVALUE]
|AS OF [SCN | TIMESTAMP] <EXPR>

举例:

SQL>delete from test where id=666;
SQL>commit;
SQL>delete from test where id=777;
SQL>commit;

对 test 表的操作进行审计查询:

SQL>select id,name,versions_operation,versions_xid,versions_starttime from test versions between timestamp minvalue and maxvalue order by id;

Flashback 是 ORACLE 自 9i 就开始提供的一项特性,在 9i 中利用 oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为 Flashback Query。


什么是多版本读一致性

Oracle 采用了一种非常优秀的设计,通过 undo 数据来确保写不堵塞读,简单的讲,不同的事务在写数据时,会将数据的前映像写入 undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过 undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。

flashback query 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在 undo 表空间中不同事务时的前映象。

用法与标准查询非常类似,要通过 flashback query 查询 undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上 as of timestamp(基于时间)或 as of scn(基于 scn)即可。


1.As of timestamp

SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
SQL> select sysdate from dual;
SQL> select * from A;
--模拟用户误操作,删除数据
SQL> delete from A;
SQL> commit;
SQL> select * from A;

查看删除之前的状态:

假设当前距离删除数据已经有 5 分钟左右的话(这里最少要有5分钟,要不可能会报错:ORA-01466: unable to read data - table definition has changed)

SQL> select * from A as of timestamp sysdate-5/1440;

用 Flashback Query 恢复之前的数据:

SQL>insert into A select * from A as of timestamp to_timestamp('2019-03-11 23:48:02','YYYY-MM-DD hh24:mi:ss');。
SQL> COMMIT;
SQL> select * from A;

如上述示例中所表示的,as of timestamp 的确非常易用,但是在某些情况下,我们建议使用 as of scn 的方式执行 flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用 as of timestamp 的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过 scn 方式则能够确保记录的约束一致性。


2.As of scn

查看 SCN:

SQL>SELECT dbms _flashback.get_system_change_number FROM dual;
SQL> SELECT CURRENT _SCN FROM V$DATABASE;
CURRENT_SCN
----------- 
1095782

删除数据:

SQL> delete from A;

SQL> commit;

查看删除之前的状态:

SQL> select * from A as of scn 1095782;

用 Flashback Query 恢复之前的数据:

SQL> insert into A select * from A as of scn 1095782;
已创建 4 行。
SQL> commit;
提交完成。
SQL> select * from A;

事实上,Oracle 在内部都是使用 scn,即使你指定的是 as of timestamp,oracle 也会将其转换成 scn,系统时间标记与 scn 之间存在一张表,即 SYS 下的 SMON_SCN_TIME

每隔 5 分钟,系统产生一次系统时间标记与 scn 的匹配并存入 sys.smon_scn_time表,该表中记录了最近 1440 个系统时间标记与 scn 的匹配记录,由于该表只维护了最近的1440 条记录,因此如果使用 as of timestamp 的方式则只能 flashback 最近 5 天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。

查看 SCN 和 timestamp 之间的对应关系:

select scn,to _char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

总结

Flashback Version Query和Flashback Query从技术基础上,都是相似的,也就是借助Oracle的Undo机制。其中Undo记录的是数据DML操作的前镜像,经典的Oracle事务模型中,一旦事务被commit,理论上之后SCN启动的读操作都不能读到之前的镜像数据。

Oracle于是利用Undo的机制,提供了短时间内的数据表旧版本查询。通过as of {timestamp | scn}指定时间点,就可以进行查询。当然,这个旧版本时间并不是无限长度,这就涉及到undo_retention这个争议参数(官方理解是:设置undo_retention之后,可以支持设置秒数的闪回数据查询。但是在实际工作中,却发现很多时候超过这个时间的数据也能检索到,但是有的时候没有到这个时间间隔旧版本数据,也不能找到)

其实,Undo_retention参数其实是用户建议Oracle数据库的一个“建议理想值”。试想一下,Undo数据是一个不断循环覆盖使用的空间,旧Undo前镜像一定会被新Undo前镜像覆盖。事务负载不同的系统,对Undo的使用情况也是不同的。

Flashback Query和Flashback Version Query,都是依赖Undo过期数据的来构建前镜像的操作。与Flashback Query不同的是,Flashback Version Query引入了一些数据表“伪列”,可以提供对数据版本的操作和检索。

后面会分享更多关于flashback的内容,感兴趣的朋友可以关注下!!


相关推荐

一文带您了解数据库的行列之争:行式与列式存储的异同

数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优...

NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!

老规矩,先看效果下面的demo来自试用的SuperSonic,将会在下面详细介绍:大模型时代Text-to-SQL特点随着基于LLM技术的发展,RAG/AIAgent/Fine...

JDK25长期支持版九月降临:18项王炸功能全解析

Java要放大招啦!9月份推出的JDK25长期支持版已经锁定18个超能力,从稳定值到结构化并发,还有Linux系统下的"预知未来"性能分析!下面我用打游戏的术语给你们掰扯明白:1、飞...

OceanBase 推出单机版 高度兼容MySQL和Oracle

【环球网科技综合报道】3月27日,独立数据库厂商OceanBase正式发布单机版产品。据悉,这一产品基于自主研发的单机分布式一体化架构设计,具备极简数据库架构和高度兼容性,为中小规模业务提供兼具性能与...

黄远邦:应对7月1日闰秒对Oracle数据库影响

由于今年7月1日全世界会多出一秒,这可能对时间敏感的IT系统造成较大影响。中亦科技数据库团队对此问题做了深入的研究,并对用户系统提出了相应的解决方法及建议。中亦科技数据库产品总监黄远邦认为,闰秒调整会...

MySQL数据库密码忘记了,怎么办?(mysql 数据库密码)

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

Chinese AI Talent in Spotlight as Nvidia and Meta Escalate Talent War

OntherightisBanghuaZhu,ChiefResearchScientistatNVIDIATMTPOST--SiliconValley’stoptech...

用Cursor开启JAVA+AI生涯(javascirpt怎么开启)

Cursor是基于VSCode开发的一款编辑器,支持多种语言的开发编辑。与传统的开发工具相比,它有多种优势:与AI无缝集成,响应速度快,占用内存小。但很多同学在"起步"过程中遇到了...

毕业十年了,自从做了开发用了很多软件,但距离写开发工具还很远

办公系统类:办公软件Word、Excel、PowerPoint三大必备技能+腾讯/金山在线文档解压缩操作:7-zip/winrar文件文本处理:Notepad++(文本编辑器正则表达式超级好...

盘点Java中最没用的知识⑤:这3个老古董你还在代码里“考古”?

一、Stack类:“继承Vector”的历史bug,为何成了性能拖油瓶?你是不是在学Java集合时,老师说过“栈结构用Stack类”?是不是在老代码里见过"newStack<>(...

Gemini 2.5 Pro 0506发布,编程最强大模型, 碾压 Claude3.7 sonnent

一、Gemini2.5Pro(I/Oedition)发布1、为何叫I/Oedition?谷歌史上最强编程模型Gemini2.5Pro(I/Oedition)发布,具体型号是Gemin...

如何让无聊变得有趣(附本人大量美图)

文/图:金冬成在这条长300公里的公路上,我已经来回往返了无数次。3小时车程,一个人,想想都是多么无聊的一件事。其实,人生道路上,类似这种无聊的事情有很多很多。无聊的事情、枯燥的工作,往往让我们容易失...

Oracle 推出 Java 24,增强 AI 支持和后量子加密

导读:Oracle宣布正式发布Java24,该语言增加了几个新功能,例如StreamGatherersAPI和Class-FileAPI的可用性,以及专门为AI推理和量子安全设计...

公司ERP突然变慢?“索引重建”这颗“药”可不能随便吃!

各位老板、IT小哥、财务小姐姐,有没有遇到过公司ERP系统突然卡顿得像“老爷车”,点个按钮半天没反应,急得直跺脚?这时候,可能有人会跳出来说:“我知道,重建一下数据库索引就好了!”听起来像个“神操作”...

基于Java实现,支持在线发布API接口读取数据库,有哪些工具?

基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...

取消回复欢迎 发表评论: