zoukankan      html  css  js  c++  java
  • 闪回flashback

    1、flashback query(使用UNDO)查询某个scn时该表的内容
    SQL> select * from t1;

            ID
    ----------
             1
             2

    SQL> select current_scn from v$database;

    CURRENT_SCN
    -----------
       10517036

    SQL> update t1 set id=11 where id=1;

    已更新 1 行。

    SQL> commit;

    提交完成。

    SQL> select * from t1 as of scn 10517036;        //查询之前scn时的值

            ID
    ----------
             1
             2
     
    scn和时间戳的互相转换:
    SQL> select systimestamp from dual;

    SYSTIMESTAMP
    ---------------------------------------------------------------------------
    24-2-13 01.16.40.854000 上午 +08:00

    SQL> select scn_to_timestamp(10517036) from dual;

    SCN_TO_TIMESTAMP(10517036)
    ---------------------------------------------------------------------------
    24-2-13 01.12.07.000000000 上午

    SQL> select to_timestamp('24-2月 -13 01.12.07.000000000 上午') from dual;   //把字符串类型转换为时间戳类型

    TO_TIMESTAMP('24-2月-1301.12.07.000000000上午')
    ---------------------------------------------------------------------------
    24-2-13 01.12.07.000000000 上午

    SQL> select timestamp_to_scn(to_timestamp('24-2月 -13 01.12.07.000000000 上午')) from dual;

    TIMESTAMP_TO_SCN(TO_TIMESTAMP('24-2月-1301.12.07.000000000上午'))
    -----------------------------------------------------------------
                                                             10517035

    查询smon维护的最早scn
    SQL> select min(scn) from sys.smon_scn_time ;

      MIN(SCN)
    ----------
      10681569


    SQL> select scn_to_timestamp(10681579) from dual;

    SCN_TO_TIMESTAMP(10681579)
    ---------------------------------------------------------------------------
    27-2-13 03.33.58.000000000 下午

    小于最早scn则无法进行运算
    SQL> select scn_to_timestamp(10681559) from dual;
    select scn_to_timestamp(10681559) from dual
           *
    1 行出现错误:
    ORA-08181: 指定的编号不是有效的系统更改号
    ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1
     
    2、flashback table(sys用户下的表不能用这个方式,利用UNDO。而闪回表内部实际是先delete再insert)闪回表到之前某个scn的状态
    SQL> select * from t12;

    OBJECT_ID NAME
    ---------- --------------------
        234555 aaa
             3 aaa

    SQL> select current_scn from v$database;

    CURRENT_SCN
    -----------
       10518096

    SQL> update t12 set name='bbb';

    已更新2行。

    SQL> commit;

    提交完成。

    SQL> flashback table t12 to scn 10518096;
    flashback table t12 to scn 10518096
                    *
    1 行出现错误:
    ORA-08189: 因为未启用行移动功能, 不能闪回表(因为闪回2个时间点,行位置可能被占用,存储位置可能发生变化)

    SQL> select t12.*,rowid from t12;

     OBJECT_ID NAME                 ROWID
    ---------- -------------------- ------------------
        234555 bbb                  AAAXMiAAEAAAMFTAAA
             3 bbb                  AAAXMiAAEAAAMFTAAB

    是否允许行移动,查询dba_tables表中row_movement=DISABLED|ENABLE

    SQL> alter table t12 enable row movement;

    表已更改。

    SQL> flashback table t12 to scn 10518096;

    闪回完成。

    SQL> select t12.*,rowid from t12;

     OBJECT_ID NAME                 ROWID
    ---------- -------------------- ------------------
        234555 aaa                  AAAXMiAAEAAAMFTAAC
             3 aaa                  AAAXMiAAEAAAMFTAAD
     
    3、flashback version query(返回版本查询)
    查询对此表做过哪些动作,versions_endscn有值,说明这个版本已经结束,数据表中已经没有该值
    startscn是事务提交时的scn。startscn相同说明是一个事务中的操作。而且别绪事务已经提交才会有信息,未提交不会记录。
    select versions_startscn,versions_endscn,versions_xid,versions_operation,versions_starttime,versions_endtime,id,name 
    from scott.t1 versions between scn minvalue and maxvalue order by versions_startscn;
     
     
    4、flashback transaction query(闪回事务查询,使用undo)
    SQL> conn scott/tiger
    已连接。
    SQL> create table t1 (id number,name varchar2(20));

    表已创建。

    SQL> insert into t1 values(1,'aaa');

    已创建 1 行。

    SQL> insert into t1 values(2,'aaa');

    已创建 1 行。

    SQL> commit;

    提交完成。
    此时执行了错误事务,做了update:
    SQL> update t1 set name='bbb';

    已更新2行。

    SQL> commit;

    提交完成。
     
    查询该事务的事务id,versions_xid:
     
    查询该事务的信息:
    select * from flashback_transaction_query where xid='0A00170079230000';
    后面有个undo_sql,可以执行以恢复
     
    5、flashback drop(system表空间的无法闪回)
    10g以后drop只是改名重新放入回收站,清除数据字典
    SQL> create table t_recycle (id number) tablespace users;

    表已创建。

    SQL> drop table t_recycle;

    表已删除。

    SQL> show recyclebin;
    ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
    ---------------- ------------------------------ ------------ -------------------
    T11              BIN$7lppGUw4Sb+BkxnXqIaQOw==$0 TABLE        2013-02-06:00:38:56
    T11              BIN$3Ii282AMTjaGfNBlizJytg==$0 TABLE        2013-02-06:00:36:56
    T_RECYCLE        BIN$7C3WUnHsSEaw/49R0PlbUQ==$0 TABLE        2013-03-31:17:49:10
    以上信息来自视图dba_recyclebin;
    可以直接查询:select * from scott."BIN$7C3WUnHsSEaw/49R0PlbUQ==$0";
    回收站不支持DDL DML操作,闪回需要闪回的操作:
    SQL> flashback table "BIN$7C3WUnHsSEaw/49R0PlbUQ==$0" to before drop;

    闪回完成。
     
    删除的表上如果有索引,删除闪回后索引也会被闪回,但是索引名字已经改变
    是否允许闪回drop:
     
    6、flashback database(利用不完全恢复)
    SQL> select flashback_on from v$database;

    FLASHBACK_ON
    ------------------
    NO
    开启闪回数据库的2个条件:
    a:开启归档
    b:使用闪回区,用来存放闪回日志:
    SQL> show parameter db_recover

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- --------------------------------
    db_recovery_file_dest                string      D:appLenovofast_recovery_area
    db_recovery_file_dest_size           big integer 10000M
     
    开启闪回数据库:
    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    SQL> startup mount
    ORACLE 例程已经启动。

    Total System Global Area  627732480 bytes
    Fixed Size                  1386456 bytes
    Variable Size             381683752 bytes
    Database Buffers          239075328 bytes
    Redo Buffers                5586944 bytes
    数据库装载完毕。
    SQL> archive log list
    数据库日志模式            存档模式
    自动存档             启用
    存档终点            D:apparch
    最早的联机日志序列     666
    下一个存档日志序列   668
    当前日志序列           668
    SQL> show parameter db_recover

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_recovery_file_dest                string      D:appLenovofast_recovery_area
    db_recovery_file_dest_size           big integer 10000M
    SQL> alter database flashback on;

    数据库已更改。

    SQL> alter database open;

    数据库已更改。
    这时系统出现闪回日志:
    闪回日志由RVWR进程写入:
    闪回日志可存放的最大时间,1440分钟,24小时。这个时间不是强制的,当闪回区满时,优先删除闪回日志:
    SQL> show parameter db_flashback

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------
    db_flashback_retention_target        integer     1440
    闪回库最早可闪回的scn点:
    SQL> select * from v$flashback_database_log;

    OLDEST_FLASHBACK_SCN OLDEST_FLASHBA RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
    -------------------- -------------- ---------------- -------------- ------------------------
                13243422 31-3-13                 1440      104857600                        0
    查看闪回状态:
    flashback_data db_data redo_data单位是字节,表示从begin_time至今产生的闪回日志、数据、redo的大小,可以粗略的估算闪回需要的时间和闪回的量
    SQL> select * from v$flashback_database_stat;

    BEGIN_TIME     END_TIME       FLASHBACK_DATA    DB_DATA  REDO_DATA ESTIMATED_FLASHBACK_SIZE
    -------------- -------------- -------------- ---------- ---------- ------------------------
    31-3-13     31-3-13            8101888    7086080    4808192                        0
    开始闪回数据库:
    SQL> select current_scn from v$database;

    CURRENT_SCN
    -----------
       13246550

    SQL> drop user scott cascade;

    用户已删除。

    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    SQL> startup mount
    ORACLE 例程已经启动。

    Total System Global Area  627732480 bytes
    Fixed Size                  1386456 bytes
    Variable Size             381683752 bytes
    Database Buffers          239075328 bytes
    Redo Buffers                5586944 bytes
    数据库装载完毕。
    SQL> flashback database to scn 13246550;

    闪回完成。

    SQL> alter database open read only;

    数据库已更改。

    SQL> conn scott/tiger
    已连接。
    alter database open 要 resetlog
     
    11g有个新的闪回表空间,不依赖undo
  • 相关阅读:
    分布式系统唯一ID生成方案汇总
    百度开源的分布式 id 生成器
    全局唯一ID生成器
    VisualSVN Server迁移的方法
    SQL Server 函数 LEN 与 DATALENGTH的区别
    SQLServer中DataLength()和Len()两内置函数的区别
    sql server 查询ntext字段长度
    JAVA使用POI如何导出百万级别数据
    Java 使用stringTemplate导出大批量数据excel(百万级)
    Java 两个日期间的天数计算
  • 原文地址:https://www.cnblogs.com/kissdb/p/4009902.html
Copyright © 2011-2022 走看看