热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

闪回版本查询FlashbackVersionQuery

从10g开始,Oracle开始大面积引入ldquo;Flashbackrdquo;技术,或者成为Flashback技术工具集合,来提供多级别多粒度的ldquo;逻

从10g开始,Oracle开始大面积引入ldquo;Flashbackrdquo;技术,或者成为Flashback技术工具集合,来提供多级别多粒度的ldquo;逻

“忘记备份”是几年前看一位行业前辈的经验谈中让笔者记忆深刻的工作军规。对DBA而言,备份通常指的是“Media Backup”,在Oracle世界中就是各种冷备份文件、备份集合和归档日志。

工作时间越长,胆子其实就是越小。很多很多时候,有备份并不意味着可以高枕无忧。这种论断主要是基于两方面的因素,其一是备份的有效性,虽然有各种工具系统介质负责备份工作,但是备份是不是有效一直是运维工程师心中的噩梦。第二个因素是恢复时间,大部分的Media Recovery都需要停机停服务,这对于7*24小时的高可用应用是不能允许的。另一方面,在现代企业级别数据中心环境下,如果存在正当的管理流程和方法,大规模数据恢复、回退的情况是比较少见的。

相应的,小规模数据恢复,如数据表一行数据被莫名误修改、数据表误删除等需要恢复的需求却不断增加。在传统的恢复技术中,这样粒度的恢复操作一般是不能支持的。

从10g开始,Oracle开始大面积引入“Flashback”技术,或者成为Flashback技术工具集合,来提供多级别多粒度的“逻辑恢复”。经过若干年的发展,Flashback家族已经有诸多的分支技术,依托不同的技术技术,来实现多粒度的数据恢复。在笔者之前的文章中,已经陆续介绍了一些Flashback技术和应用,本篇继续介绍Flashback Version Query。

1、环境介绍

笔者选择Oracle 11g进行测试,具体版本为11.2.0.4。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE 11.2.0.4.0 Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

Flashback Version Query的配置基础和Flashback Query相同,都需要启用Automatic Undo Management,通过Undo_Retention进行控制时间长短。

SQL> show parameter undo

NAME TYPE VALUE

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

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

为了实验方便,调整undo_retention到1800。

SQL> alter system set undo_retention=1800 scope=both;

System altered

SQL> show parameter undo_re

NAME TYPE VALUE

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

undo_retention integer 1800

创建实验数据表。

SQL> create table test as select empno, ename, sal from scott.emp where rownum<3;

Table created

SQL> commit;

Commit complete

SQL> select * from test;

EMPNO ENAME SAL

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

7369 SMITH 800.00

7499 ALLEN 1600.00

2、Flashback Version Query

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

Oracle于是利用Undo的机制,提供了短时间内的数据表旧版本查询。通过as of {timestamp | scn}指定时间点,就可以进行查询。当然,这个旧版本时间并不是无限长度,这就涉及到undo_retention这个争议参数。

很多朋友都不是很理解undo_retention,这个以秒为单位的参数经常让人很抓狂。官方理解是:设置undo_retention之后,可以支持设置秒数的闪回数据查询。但是在实际工作中,却发现很多时候超过这个时间的数据也能检索到,但是有的时候没有到这个时间间隔旧版本数据,也不能找到。

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

如果Undo_Retention保留的时间比较长,而恰恰数据库系统是一个事务操作频繁的系统,那么Oracle如果想要坚持undo_retention,就必须维持一个比较大可拓展的Undo Tablespace。这时候,如果恰恰Undo Tablespace的文件被设置为不可拓展的,那么Oracle也就不能保证undo_retention的理想值了。

参数retention grantee是设置在undo tablespace的参数设置。如果设置了这个参数,就表示Oracle一定要保证undo_retention的理想设置值,即使不能完成事务过程。

Flashback Query和Flashback Version Query,都是依赖Undo过期数据的来构建前镜像的操作。

与Flashback Query不同的是,Flashback Version Query引入了一些数据表“伪列”,可以提供对数据版本的操作和检索。下面通过一个SQL来查看。

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;

XID START_SCN ENDSCN OPERATION EMPNO

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

7369

7499

数据表test,显然没有诸多的列定义。从这个情况看,flashback query提供了一种数据行级别的版本查询操作。先来看一下引入的数据伪列含义,本截图是从Oracle 11g官方文档中提取出的截图。

ü Versions_Startxxx表示数据行的最开始出现时间,可以使用SCN或者timestamp表示,如果这个字段为null,表示该数据从undo数据中没有找到对应的版本记录;

ü Versions_Endxxx表示数据行的截止时间,如果为空,表示数据为当前记录或者已经经过delete操作;

ü Versions_xid为事务对应的唯一标识,表示该数据行的变化是被哪个事务操作的;

ü Versions_operation:操作内容;

3、操作实验

下面经过一系列实验,来确定Flashback Version Query使用。原始数据情况如下:

SQL> select * from test;

EMPNO ENAME SAL

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

7369 SMITH 800.00

7499 ALLEN 1600.00

进行数据增加操作。

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;

XID START_SCN ENDSCN OPERATION EMPNO

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

7369

7499

0A001B00D3870100 24306083 I 1000

versions_operation表示“I”,为新增加的数据。start_scn为数据插入的SCN记录,xid为事务的标示。

SQL> update test set sal=200 where empno=7369;

1 row updated

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, sal from test versions between scn minvalue and maxvalue;

XID START_SCN ENDSCN OPERATION EMPNO SAL

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

0200110020160000 24306146 U 7369 200.00

24306146 7369 800.00

7499 1600.00

0A001B00D3870100 24306083 I 1000 200.00

U表示数据修改后的版本数据。如果删除数据,如下操作:

SQL> delete test where empno=7499;

1 row deleted

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;

XID START_SCN ENDSCN OPERATION EMPNO ROWID

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

0A001100D3870100 24306188 D 7499 AAAtPCAABAAAeu5AAB

0200110020160000 24306146 U 7369 AAAtPCAABAAAeu5AAA

24306146 7369 AAAtPCAABAAAeu5AAA

24306188 7499 AAAtPCAABAAAeu5AAB

0A001B00D3870100 24306083 I 1000 AAAtPCAABAAAeu6AAA

通过上面的数据,是可以做到跟踪整个Undo_retention中数据变化的情况。下面监控一下事务标记信息。

SQL> delete test;

2 rows deleted

SQL> select xid from v$transaction;

XID

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

0A000300C3870100

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;

XID START_SCN ENDSCN OPERATION EMPNO ROWID

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

0A000300C3870100 24306249 D 7369 AAAtPCAABAAAeu5AAA

0A001100D3870100 24306188 D 7499 AAAtPCAABAAAeu5AAB

0200110020160000 24306146 24306249 U 7369 AAAtPCAABAAAeu5AAA

24306146 7369 AAAtPCAABAAAeu5AAA

24306188 7499 AAAtPCAABAAAeu5AAB

0A000300C3870100 24306249 D 1000 AAAtPCAABAAAeu6AAA

0A001B00D3870100 24306083 24306249 I 1000 AAAtPCAABAAAeu6AAA

7 rows selected

从v$transaction中获取到的数据XID,可以在其中对应上。

4、结论

Flashback Version Query是Oracle Flashback系列的一个技术。虽然基于的Undo过期数据时间上是有限制的,结合Flashback Transaction Query,可以做到很好的事务级别数据恢复。

本文永久更新链接地址

推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
author-avatar
妞妞盼寒假_197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有