Chinaunix首页 | 论坛 | 博客
  • 博客访问: 220751
  • 博文数量: 49
  • 博客积分: 1785
  • 博客等级: 上尉
  • 技术积分: 565
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-01 10:30
文章分类

全部博文(49)

文章存档

2013年(2)

2012年(7)

2011年(11)

2010年(6)

2009年(23)

我的朋友

分类: Oracle

2009-07-28 09:16:12

flashback学习笔记
1.特性
    作为10G提供的一个新特性,可以通过flashback查看过去的数据,并且可以恢复数据到以前的状态,如果没有这个特性,想查看
    过去的数据,可能需要做一个介质恢复才可以。

2.两种用法
    flashback database   --- 需要flash recovery area
    flashback table             --- 恢复行数据,需要足够的undo信息,row movement 必须是enable状态
                                             --- 删除对象后,会放在recyclebin中,如果空间不够用会覆盖recyclebin

3.具体用法    
    Oracle Flashback Query                                       ---- 可以直接查询之前的数据
    Oracle Flashback Version Query                         ---- 可以查看一段时间范围或SCN范围之内数据的变化
    Oracle Flashback Transaction Query                 ---- 通过Version Query查询到的XID查找FLASHBACK_TRANSACTION_QUERY视图来回退事务
    DBMS_FLASHBACK                                       ---- flashback 包

4.使用这些新特性的前提

    a.创建一个足够大的undo表空间
    b.自动管理undo表空间
    c.都undo 表空间指定RETENTION GUARANTEE特性,保重undo block在retention期间内不会被覆盖,这样就需要较大的undo空间。
    d.授予相关用户该权限    包dbms_flashback,flashback,select,SELECT ANY TRANSACTION
        还要授予SELECT, UPDATE, DELETE权限给要flashback的表。
    e.仅限于10G
    f.对lob列要特别指定
    
5 例子
    5.1 Oracle Flashback Query
            使用select ... as of 方法, of后面可以跟timestamp或者scn
            1.恢复删除的数据
            2.比较现在的数据和过去的数据的不同
            3.检查事务数据在不同时间的状态

   
            查看一下当前的时间
            SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

                    TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS'
                    --------------------------------------
                    2009-07-23 01:09:13

            过一会儿,执行一个update操作
            SQL> update test set owner='abc' where object_id=123;

            1 row updated.

            执行commit,如果没有select .. as of这个特性,除非做一个介质恢复,否则数据可能就无法找到了
            SQL> commit;

            Commit complete.

            执行select .. as of方法,如下可以看到已经看到原来的owner值是sys

            SQL> select owner from test as of timestamp to_timestamp('2009-07-23 01:09:59','yyyy-mm-dd hh24:mi:ss') where object_id=123;

            OWNER
            ------------------------------------------------------------
            SYS

            数据库中实际的值是
            SQL> select owner from test where object_id=123;
           
            OWNER
            ------------------------------------------------------------
            abc
           
            如果想把以前的值写会数据库,可以执行insert或者update,下面举一个update的列子
           
            update test set owner=(select owner from test as of timestamp to_timestamp('2009-07-23 01:09:59','yyyy-mm-dd hh24:mi:ss') where object_id=123) where object_id=123;


5.2 flashback version query  和 flashback transaction query的用法

                这两个特性一般是配合使用,先通过flashback version query查到事务id,也就是xid,
                然后通过xid查找flashback_transaction_query视图来确定undo sql语句。
               
                SQL> l
                  1  SELECT versions_startscn, versions_starttime,
                  2  versions_endscn, versions_endtime,
                  3  versions_xid, versions_operation,
                  4  owner
                  5  FROM test.test
                  6  VERSIONS BETWEEN TIMESTAMP
                  7  TO_TIMESTAMP('2009-07-23 01:09:00','YYYY-MM-DD HH24:MI:SS')
                  8  AND TO_TIMESTAMP('2009-07-23 02:07:00','YYYY-MM-DD HH24:MI:SS')
                  9* WHERE object_id=123
                SQL> /
               
                VERSIONS_STARTSCN VERSIONS_STARTTIME             VERSIONS_ENDSCN VERSIONS_ENDTIME               VERSIONS_XID     VE OWNER
                ----------------- ------------------------------ --------------- ------------------------------ ---------------- -- ----------
                          1333419 23-JUL-09 02.06.21 AM                                                         00090015000002BB U  asd
                          1331780 23-JUL-09 01.17.53 AM                  1333419 23-JUL-09 02.06.21 AM          0006000D000002B4 U  SYS
                          1331546 23-JUL-09 01.10.10 AM                  1331780 23-JUL-09 01.17.53 AM          00090020000002BA U  abc
                                                                         1331546 23-JUL-09 01.10.10 AM                              SYS
                                                                        
                                                                        
                SELECT xid, operation, start_scn,commit_scn, logon_user, undo_sql
                FROM flashback_transaction_query
                WHERE xid = HEXTORAW('00090015000002BB');
 
阅读(1393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~