zoukankan      html  css  js  c++  java
  • day16——oracle闪回

    闪回查询,由一个新的包DBMS_FLASH来实现。用户使用闪回查询可以及时取得误操作DML(Delete、Update、Insert)前某一时间点数据库的映像视图,用户可以利用系统时间或系统改变号(SCN:System Change Number)来指定这个只读视图,并可以针对错误进行相应的恢复措施。闪回查询功能完全依赖于自动回滚段管理(AUM),对于Drop等误操作不能恢复。

    闪回的本质是利用空间来换取过去的时间,将undo信息进行整理和"归档",按照时间片进行整理闪回日志,用户闪回到相应的时间点,剩余的数据是由redo日志和归档日志文件进行前滚,因而闪回提供了to before resetlogs选项,开启闪回功能前数据库必须运行在归档模式,开启数据库闪回后将会产生rvwr进程.
    查看系统闪回功能
    SQL> select FLASHBACK_ON from v$database;
    (系统默认没有开闪回功能)

    设置闪回
    SQL> shutdown immediate
    SQL> startup mount;
    SQL> alter database archivelog;(闪回必须运行在归档模式)

    SQL>  alter database FLASHBACK on;(闪回启动)
    SQL> alter database open;
    SQL> select FLASHBACK_ON from v$database;

    查看恢复路径
    SQL> show parameter recover
    db_recovery_file_dest (恢复的路径)
    db_recovery_file_dest_size (区域里的配额)

    闪回日志的位置
    [oracle@sq123 ~]$ cd /oracle/app/flash_recovery_area/TEST/flashback/

    闪回保留时间(默认1天)
    SQL> show parameter flashback

    ============================================
    闪回数据库(恢复到时间点,后的数据丢失)

    查看时间点
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    2012-03-12 06:36:30
    SQL> drop user scott cascade;(删除scott用户)

    查看最早可以恢复到的时间点
    SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;
    2012-03-12 05:49:59

    SQL> shutdown abort
    SQL> startup mount

    恢复到删除用户前的时间点
    SQL> flashback database to timestamp to_timestamp('2012-04-24 05:40:51','yyyy-mm-dd hh24:mi:ss');

    SQL> alter database open resetlogs;

    scott用户又可以登陆了

    ===================================================
    监视flashback database

    最早可以恢复到那个时间点
    SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24-mi-ss') from v$flashback_database_log;

    ---------------------------------
    使用 闪回数据库
    SQL> shutdown abort
    SQL> startup mount;

    SQL> flashback database to timestamp to_timestamp('2012-03-12 02:22:22','yyyy-mm-dd hh24:mi:ss');


    -----------------------------------
    管理 闪回

    SQL> show parameter recover

    更改闪回目录
    SQL> alter system set db_recovery_file_dest='/home/oracle/flash';

    ===============================
    flashback drop 使用

    drop表时,等于把表放到回收站中(默认情况下,Oracle是将此功能开启的。)
    查看回收站
    SQL> show parameter recyclebin
    SQL> show recyclebin; (没有内容,sysdba的drop操作是不会送到recyclebin)

    scott下
    SQL> create table ttttt(d int);
    SQL> drop table tt;
    SQL> commit;

    scott下
    SQL> show recyclebin;(有数据了)
    SQL> select object_name,original_name from recyclebin;

    scott下
    SQL> flashback table tt to before drop;

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

    什么时候是闪回不回来的

    SQL> create tablespace tbs_test01 datafile '/oracle/app/oradata/TEST/tbs_test01.dbf' size 10M;

    scott下
    SQL> create table tab_aaa tablespace tbs_test01 
      2  as select * from emp;

    SQL> drop table tab_aaa;

    SQL> flashback table tab_aaa to before drop(现在还可以闪回,再次删除)

    SQL> drop table tab_aaa;

    创建tab_bbb表大于 tab_aaa表
    SQL> create table tab_bbb tablespace tbs_test01
      2  as select * from emp;

    SQL> insert into tab_bbb select * from tab_bbb;
    SQL> / (多执行几次写满表空间)
    闪回不了
    (只要这个表里有一个字节被覆盖了,那么整个表也就恢复不会来了)
    (或 清空回收站也不能闪回)

    删除表时 不放到回收站中
    SQL> drop table tab_bbb purge;
    (purge 为不放进回收站)
    SQL> show recyclebin;(没有删除记录)

    -----------------------------------------
    回收回收站
    SQL> purge recyclebin;
    SQL> show recyclebin;(没内容了)

    =============================================
    flashback query
    (Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据)
    SQL> create table t(id int); 
    SQL> insert into t values(11);
    SQL> commit;
    SQL> drop table t;
    SQL> show recyclebin;

    闪回并重命名
    SQL> flashback table t to before drop rename to haha; 
    SQL> select * from haha;
    SQL> delete from haha;
    SQL> commit;

    SQL> show recyclebin;(没内容,undo也不能恢复)

    显示当前时间
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    显示38分这个时间点上的数据
    SQL> select * from haha as of timestamp to_timestamp('2012-03-12 01:38:00','yyyy-mm-dd hh24:mi:ss');
    no rows selected(没有数据)

    显示36分这个时间点上的数据
    SQL> select * from haha as of timestamp to_timestamp('2012-03-12 01:36:00','yyyy-mm-dd hh24:mi:ss');
            ID
    ----------
            11
    (有数据)

    创建个新表装haha里的数据
    SQL> create table hehe as  select * from haha as of timestamp to_timestamp('2012-03-12 01:36:00','yyyy-mm-dd hh24:mi:ss');

    (前提条件是,undo表空间不能被覆盖)




  • 相关阅读:
    性能测试术语讲解
    Silverlight 部署
    C#数据库SQLServer查询、修改数据
    有一点点背
    Ajax与XMLHttpRequest对象
    ServletListener 之 监听HTTP会话
    JAVA中几种常见集合的使用实例
    [转]全面接触Java集合框架(二)
    自定义标签之 SimpleTag的开发
    jsp常用内置对象
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/0b9180347a8ea3a057c6bfc41ff58f8a.html
Copyright © 2011-2022 走看看