当前位置:  数据库>oracle

闪回版本查询Flashback Version Query

    来源: 互联网  发布时间:2017-06-19

    本文导语: “忘记备份”是几年前看一位行业前辈的经验谈中让笔者记忆深刻的工作军规。对DBA而言,备份通常指的是“Media Backup”,在Oracle世界中就是各种冷备份文件、备份集合和归档日志。 工作时间越长,胆子其实就是越小。很多很...

“忘记备份”是几年前看一位行业前辈的经验谈中让笔者记忆深刻的工作军规。对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 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,可以做到很好的事务级别数据恢复。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 自有软件的版本查询和升级
  • 在shell下如何查询kde的版本以及kde装在那个目录下面
  • linux下通过对文件读取方式查询oracle的版本信息
  • linux内核和版本查询命令
  • 有人知道如何用C程序查询当前运行机器的glibc版本么?
  • ■■CSDN查询助手■■ 发布最新版本!请大家及时更新,得到最好的(功能)待遇:-)
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • 请问LINUX内核版本为2.4.31的是什么版本?自己写的串口驱动,是否向下兼容,还是必需版本相同?
  • Apache hadoop当前各个版本说明
  • 请教:linux 的版本问题,上面想跑J2EE或网站之类的装什么版本?客户端或个人机装什么版本?
  • IP地址数字互转 iis7站长之家
  • libxml2是针对aix、sco、linux分不同版本还是统一版本?
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 内核版本问题 GCC版本问题
  • resin及jetty介绍以及如何 查看他们的版本号
  • Linux不同版本内核目录下的ChangeLog是以哪个版本作为对比?
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • C# 获取程序集版本、文件版本
  • 不同版本MSSQL清除日志方法介绍
  • 什么版本的linux系统 内置 glibc2.4以上的版本
  • 软件项目版本控制需要注意的几点
  • ms sql server有 linux 版本吗? 或有其它平台的版本吗?
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • VMware有Linux版本和Windows版本吗?
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 现在大家都用什么版本的linux做服务器?哪个版本比较稳定?
  • ​Docker v1.12.1-rc1各种版本发布下载,高级容器引擎
  • 最新版本Fedora 6,该安装哪个版本的NTFS内核?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3