Home >Database >Mysql Tutorial >Oracle的回闪查询

Oracle的回闪查询

WBOY
WBOYOriginal
2016-06-07 17:25:45987browse

从oracle9i开始,oracle开始提供回闪查询特性(flashback query),允许将回滚段中的数据进行回闪,通过下面的例子来看一下这个从orac

Oracle回闪查询的新特性

从oracle9i开始,oracle开始提供回闪查询特性(flashback query),允许将回滚段中的数据进行回闪,通过下面的例子来看一下这个从oracle9i开始提供的新特性.

SQL> update emp set sal=4000 where empno=7788;

 


1 row updated.

SQL> update emp set sal=4000 where empno=7782;

 


1 row updated.

 


SQL> update emp set sal=4000 where empno=7698;

 


1 row updated.

 

 

 

先不提交这个事务,在另外窗口新开session,使用sys用户查询相关信息,进行进一步的分析

 


获得事务信息

从事务表中可以获得关于这个事务的信息,该事务位于9号回滚段(XIDUSN),在9号回滚段

上,该事务位于第29号事务槽(XIDSLOT):

SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;

 


    XIDUSN    XIDSLOT    XIDSQN    UBABLK    UBAFIL    UBAREC

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

        9        29        385      1350          2        22

从v$rollstat视图中也可获得事务信息,xacts字段代表的是活动事务的数量,同样看到该事务

位于9号回滚段

SQL> select usn,writes,rssize,xacts,hwmsize,shrinks,wraps from v$rollstat;

 


      USN    WRITES    RSSIZE      XACTS    HWMSIZE    SHRINKS      WRAPS

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

        0      7620    385024          0    385024          0          0

        1      21390  29351936          0  29351936          0          0

        2      22108    3268608          0    3268608          0          0

        3      29954    450560          0    450560          0          0

        4      23700    843776          0    843776          0          0

        5      23334    450560          0    450560          0          0

        6      21082    450560          0    450560          0          0

        7      23146    2285568          0    2285568          0          0

        8      28742    843776          0    843776          0          1

        9      22648    2088960          1    2088960          0          0

        10      24326    2220032          0    2220032          0          0

 


11 rows selected.

 


这是执行alter system dump datafile 2 block 1350

转储的回滚表空间中的数据块的信息的一部分

*-----------------------------

* Rec #0x1d  slt: 0x24  objn: 517(0x00000205)  objd: 517  tblspc: 0(0x00000000)

*      Layer:  11 (Row)  opc: 1  rci 0x00

Undo type:  Regular undo    Begin trans    Last buffer split:  No

Temp Object:  No

Tablespace Undo:  No

rdba: 0x00000000

*-----------------------------

uba: 0x00800546.0129.1b ctl max scn: 0x0000.000e4e9c prv tx scn: 0x0000.000e4ea6

txn start scn: scn: 0x0000.000e7526 logon user: 0

 prev brb: 8389956 prev bcl: 0

KDO undo record:

KTB Redo

op: 0x04  ver: 0x01

op: L  itl: xid:  0x0006.016.0000015d uba: 0x00800419.00fe.11

                      flg: C---    lkc:  0    scn: 0x0000.000e7524

KDO Op code: URP row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x0040100f  hdba: 0x00401001

itli: 2  ispac: 0  maxfr: 4863

tabn: 0 slot: 116(0x74) flag: 0x2c lock: 0 ckix: 191

ncol: 9 nnew: 7 size: 0

Vector content:

col  2: [ 2]  c1 0a

col  3: [ 2]  c1 0a

col  4: [ 1]  80

col  5: [ 1]  80

col  6: [ 1]  80

col  7: [ 1]  80

col  8: [ 7]  78 71 01 07 0b 07 34

 


先注意到这里存在一个信息ctl max scn: 0x0000.000e4e9c,这个转换为scn值就是:

SQL> select (to_number('000','xxxx')*power(2,32)+to_number('e4e9c','xxxxxxxx')) scn

from dual;

 


      SCN

----------

    937628

 


查询一下当前数据的scn:

SQL> select dbms_flashback.get_system_change_number scn from dual;

 


      SCN

----------

    949630

 


SQL>

通过特定的语法,可以将scn 937628的历史状态数据查询出来:

SQL> select * from scott.emp as of scn 937628 where empno in(7788,7782,7698);

 


EMPNO ENAME      JOB        MGR HIREDATE          SAL      COMM DEPTNO

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

 7698 BLAKE      MANAGER    7839 1981-5-1      2850.00              30

 7782 CLARK      MANAGER    7839 1981-6-9      2450.00              10

 7788 SCOTT      ANALYST    7566 1987-4-19      10.00              20

 


SQL>

在查询结果中,注意到3名员工的薪水恢复到了之前的状态.而在当前的查询中,这个数据是变化

后的4000:

SQL> select * from scott.emp  where empno in(7788,7782,7698);

 


EMPNO ENAME      JOB        MGR HIREDATE          SAL      COMM DEPTNO

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

 7698 BLAKE      MANAGER    7839 1981-5-1      4000.00              30

 7782 CLARK      MANAGER    7839 1981-6-9      4000.00              10

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn