zoukankan      html  css  js  c++  java
  • 《转》oracle—flashback

     

    在介绍flashback之前先介绍下undo_retention相关参数

     

    undo_retention:表示undo数据的过期时间。系统默认这个时间设置为900即15分钟。但要注意,保证undo数据在这个时间内有效的前提是undo表空间有

                            足够的空间存储。如果undo空间已满且又有新事务执行则会覆盖原来的undo数据而不管undo数据是否过期。不过,如果undo空间足够,

                            尽管undo数据已经   过了指定的时间,只要不被覆盖,该undo数据还是存在,因此也还是能够被执行flashback闪回(但是必须在增删改

                            表记录之前先执行alter table table_name enable row movement即允许该表进行行移动,否则过了指定的时间该undo数据尽管没被

                            覆盖也会无法闪回了,会提示ora-01466错误)。

        如果想确保undo数据有效期为undo_retention指定的时间,可以通过 为undo表空间指定Retention Guarantee,如下:

     

    Alter tablespace undotbs1 retention guarantee;(禁止的话执行:Alter tablespace undotbs1 retention noguarantee;这样就可以保证undo表空间尽管已经满了,有新事务出现也不会去覆盖未过期的undo数据。当然此时的新事务执行就要卡住了。
     具体参考http://blog.itpub.net/post/602/469270

     

     

     

    一、FLASHBACK QUERY 介绍

    创建表并插入数据     
    CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
    INSERT INTO flashback_test VALUES('d1','s','s');
    INSERT INTO flashback_test VALUES('d2','sw','sf');
    INSERT INTO flashback_test VALUES('d3','swd','ss');

    删除数据
    DELETE FROM flashback_test WHERE a='d1';
    --基于TIMESTAMP时间的返回查询
    SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 15/1440;
    提示ORA-01466:无法读取数据-表定义已更改
    但是没有做过表修改啊,奇怪了
    DELETE FROM flashback_test WHERE a='d2';
    SELECT *FROM flashback_test AS OF TIMESTAMP SYSDATE - 10/1440;
    1    d2    sw    sf
    2    d3    swd    ss
    但是第一条记录找不回来了,看来返回查询只能在一定时间内,超过了该时间就无法查询了。

    --基于SCN的返回查询

     

    查询某个时刻的scn
    SQL> select timestamp_to_scn(to_date('20100105160606','yyyy-mm-dd hh24:mi:ss')) from dual;
    查看scn
    select dbms_flashback.get_system_change_number from dual;
    select current_scn from v$database;
     

     

    GRANT EXECUTE ON dbms_flashback TO fyzh_ora;--授权一般用户可执行dbms_flashback包
    SELECT dbms_flashback.get_system_change_number FROM dual;--查看当前的SCN
    SELECT *FROM flashback_test AS OF SCN 12486407805791; 
    1    d3    swd    ss

     

     

    FLASHBACK TABLE只是针对表的增删改操作进行闪回

    通过如下语句可以准确的获取当前的时间点
    SQL>  variable scn number;
    SQL>  exec :scn:=dbms_flashback.get_system_change_number (scn为3373273)
    select count(1) from t;--20000条记录
    delete from t;
    select count(1) from t;--现在只有0条记录

    select count(1) from t as of scn :scn;查找在删之前的某个时间点,数据仍是20000条

    现在将表闪回到3373273这个点
    flashback table t to scn:scn;
    提示“ORA-08189: 因为未启用行移动功能, 不能闪回表”错误,执行如下语句
    alter table t enable row movement;--允许对行rowid进行移动

    再进行闪回
    flashback table t to scn:scn;

    此时再查询该表
    select count(1) from t;恢复了20000条记录。

    我们也可以通过flashback_transaction_query这个视图中获取想要闪回的时间点。

    --TRUNCATE TABLE 操作的闪回实验
    TRUNCATE TABLE flashback_test;
    SELECT * FROM flashback_transaction_query WHERE table_name='FLASHBACK_TEST';
    FLASHBACK TABLE flashback_test TO SCN 12486407806290;
    提示ORA-01466:无法读取数据-表定义已更改
    说明:ddl操作不会记录到flashback_transaction_query视图中,且也不能执行闪回

     

     

    创建表并插入数据     
    CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
    INSERT INTO flashback_test VALUES('d1','s','s');
    INSERT INTO flashback_test VALUES('d2','sw','sf');
    INSERT INTO flashback_test VALUES('d3','swd','ss'); 
    1.删除表
    --删除表
    DROP TABLE flashback_test;
    --查看回收站,该表存在回收站中
    SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';
    --执行闪回
    FLASHBACK TABLE flashback_test TO BEFORE DROP;
    --执行闪回后,该表已不在回收站,在查看该表已经恢复
    SELECT * FROM flashback_test;

    2.删除表且执行purge操作
    --删除表
    DROP TABLE flashback_test PURGE;
    --查看回收站,发现没有在回收站中
    SELECT * FROM user_recyclebin WHERE original_name='FLASHBACK_TEST';

    3.清除回收站
    PURGE TABLE original_name;--清除回收站中的某个表
    PURGE INDEX original_name;--清除回收站中的某个索引
    PURGE RECYCLEBIN;--清除自己用户下的回收站信息
    PURGE TABLESPACE tablespace_name;--清除指定表空间下所有在回收站的对象
    PURGE TABLESPACE tablespace_name USER user_name;--清除指定表空间指定用户下在回收站中的对象(drop user 若加上CASCADE关键字则不进入回收站)
    PURGE DBA_RECYCLEBIN; --从所有用户的回收站清除所有对象

    注:如果被删除的表不在回收站,则执行flashback drop table时会提示ORA-38305:对象不在回收站中。 

     

    不同版本查询介绍
    VERSIONS  BETWEEN 能够查看指定时间段内undo表空间中记录的不同版本
    1.创建表
    CREATE TABLE ff (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
    2.分别作插入,更新,删除操作
    INSERT INTO ff VALUES('d1','s','s');
    UPDATE ff SET a='u_d2' WHERE a='d1';
    DELETE FROM ff WHERE a='d1';
    3.查看 该时间内ff表非操作情况
    1)VERSIONS BETWEEN TIMESTAMP minvalue AND MAXVALUE 方式
    SELECT versions_starttime,
           versions_endtime,
           versions_xid,
           versions_operation,
           a,
           b,
           c
      FROM ff VERSIONS BETWEEN TIMESTAMP minvalue AND maxvalue
     ORDER BY versions_starttime;
    VERSIONS_STARTTIME         VERSIONS_ENDTIME             VERSIONS_XID     VERSIONS_OPERATION       A     B    C
    ------------------------  ---------------------------- ----------------   ------------------    ----- ----- ----
    30-12月-11 01.27.57 下午   30-12月-11 01.28.36 下午    0900000035070000         I                d1     s    s
    30-12月-11 01.28.36 下午                               0100140069060000         U                u_d1   s    s

    2)VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss')
    SELECT versions_starttime,
           versions_endtime,
           versions_xid,
           versions_operation,
           a,
           b,
           c
      FROM ff VERSIONS BETWEEN TIMESTAMP to_date('2011-12-30 13:22:00', 'yyyy-mm-dd hh24:mi:ss') AND to_date('2011-12-30 13:23:00', 'yyyy-mm-dd hh24:mi:ss');

    3)VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864
    SELECT *FROM flashback_transaction_query WHERE table_name='FF';
    SELECT versions_starttime,
           versions_endtime,
           versions_xid,
           versions_operation,
           a,
           b,
           c
      FROM ff VERSIONS BETWEEN SCN 12486407818849 AND 12486407818864;

     

     

    GRANT SELECT ON flashback_transaction_query TO fyzh_ora;--直接赋予该表的select权限还是无法查询,提示权限不够
    GRANT SELECT ANY TRANSACTION TO fyzh_ora;--必须授予ANY TRANSACTION才行

     

    --创建表flashback_test
    CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
    --插入三条记录
    INSERT INTO flashback_test VALUES('d1','s','s');
    INSERT INTO flashback_test VALUES('d2','sw','sf');
    INSERT INTO flashback_test VALUES('d3','swd','ss');
    --执行删除操作
    DELETE FROM flashback_test WHERE a='d1';
     

     

     

    --通过版本查询xid,在flashback_transaction_query视图中找出flashback_test表对应删除操作的undo_sql,执行该sql即可闪回 

     

    SELECT xid, operation, table_name, undo_sql
      FROM flashback_transaction_query
     WHERE xid IN
           (SELECT versions_xid

              FROM flashback_test versions BETWEEN TIMESTAMP minvalue AND maxvalue); 

     查询结果如下图所示:

     

    SQL> show parameter retention guarantee;
     
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_flashback_retention_target        integer     1440
    undo_retention                       integer     900

    1.创建表并插入数据     
    CREATE TABLE flashback_test (a VARCHAR2(255),b VARCHAR2(255),c VARCHAR2(255));
    INSERT INTO flashback_test VALUES('d1','s','s');
    INSERT INTO flashback_test VALUES('d2','sw','sf');
    INSERT INTO flashback_test VALUES('d3','swd','ss');
    DELETE FROM flashback_test WHERE a= 'd1';
    2.FLASHBACK DATABASE 
    1)一般用户下执行:
    SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
    FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
    ORA-01031: 权限不足
    2)采用sys用户执行:
    SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24); 
    FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
    ORA-38757: 要闪回数据库, 数据库必须已装载但不能打开。
    3)关闭数据库并装载数据库
    C:Users hinkpad>sqlplus/nolog
    SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:05:16 2011
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
    SQL> conn sys/fyzh@fgisdb as SYSDBA --sys用户登录
    已连接。
    SQL> SHUTDOWN IMMEDIATE;--关闭数据库
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    SQL> startup MOUNT;--装载数据库,无法识别监听,退出重新以sys登录可解决
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    SQL> exit
    从 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开

    C:Users hinkpad>sqlplus/nolog
    SQL*Plus: Release 11.1.0.7.0 - Production on 星期四 12月 29 16:06:19 2011
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
    SQL> conn sys/fyzh as SYSDBA --再次登录
    已连接到空闲例程。
    SQL> startup mount; --装载数据库
    ORACLE 例程已经启动。

    Total System Global Area  535662592 bytes
    Fixed Size                  1348508 bytes
    Variable Size             251661412 bytes
    Database Buffers          276824064 bytes
    Redo Buffers                5828608 bytes
    数据库装载完毕。

    4)再次执行还是报错
    SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24);
    FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 1/24)
    ORA-38726: 未启用闪回数据库事件记录。
    SQL> flashback database to restore point BEFORE_DROP;
    flashback database to restore point BEFORE_DROP 
    ORA-38780: 还原点 'BEFORE_DROP' 不存在。

    5)开启闪回功能
    SQL> alter database flashback on;
    alter database flashback on
    ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
    ORA-38707: 尚未启用介质恢复。

    6)开启归档和闪回
    SQL> alter database archivelog;
    Database altered
    SQL> alter database flashback on;
    Database altered

    7)再次执行
    SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24);
    FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.1/24)
    ORA-38729: 执行 FLASHBACK 的闪回数据库日志数据不足。
     
    SQL> FLASHBACK DATABASE TO TIMESTAMP (SYSDATE - 0.01/24);
    Done

    8)开启数据库
    SQL> alter database open;
    alter database open
    *
    第 1 行出现错误:
    ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

    SQL> alter database open noresetlogs;
    alter database open noresetlogs
    *
    第 1 行出现错误:
    ORA-01610: 使用 BACKUP CONTROLFILE 选项的恢复必须已完成

    SQL> alter database open resetlogs;
    数据库已更改。

    9)查看 表还存在,数据2条

    注:1.必须具有DBA权限
        2.数据库必须处在装载状态
        3.必须启用介质恢复
        4.必须开启闪回和归档(必须在归档模式下才能开启闪回)
        5.闪回好后,开启数据库要使用 RESETLOGS 或 NORESETLOGS 选项
        6.使用该功能,需要之前就已经开启归档模式和闪回,否则等数据损坏再打开已经来不及了
    复原点是手动创建的一个时间点,数据库可以闪回到创建的该复原点。
    普通复原点:只是在闪回或恢复操作中为指定以前的SCN或时间点提供方便。但不保证数据库在所有情形下都保留成功执行
                闪回数据库操作所需的闪回数据库日志。
    创建普通复原点:CREATE RESTORE POINT test_point;
    有保证的复原点:保证可以把数据库倒退到由复原点指定的SCN或时间点.
    创建有保证的复原点:CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
    删除复原点:DROP RESTORE POINT point_name;
    查看复原点:v$restore_point视图

    创建复原点注意事项:
    1.创建复原点必须打开归档模式
    2.创建复原点可以不打开闪回
    3.创建复原点若闪回没打开数据库需为装载状态
    SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
    CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE
    第 1 行出现错误:
    ORA-38784: 无法创建还原点 'TEST_STOREPOINT'。
    ORA-38787: 在闪回数据库处于关闭状态时, 创建第一个可靠还原点需要装载模式。
    4.创建了复原点后,数据库的闪回由原来的no状态变成了RESTORE POINT ONLY
    SQL> CREATE RESTORE POINT test_storepoint GUARANTEE FLASHBACK DATABASE;
    还原点已创建。
    SQL> select flashback_on from v$database;
    FLASHBACK_ON
    ------------------
    RESTORE POINT ONLY

    利用复原点闪回数据库:
    FLASHBACK DATABASE TO RESTORE POINT test_storepoint;
  • 相关阅读:
    在平面中,一个点绕任意点旋转θ度后的点的坐标
    消息队列
    通过注册表修改默认打开方式
    Beagleboneblack的MLO文件干了些啥
    input子系统 KeyPad-Touch上报数据格式与机制
    字符编码
    find命令之exec
    Jmeter(一)-Linux上的安装和使用
    for循环删除linkedlist中的元素。。。。。。
    Java中组装String字符串常用的几种防范
  • 原文地址:https://www.cnblogs.com/leafcb/p/3354592.html
Copyright © 2011-2022 走看看