zoukankan      html  css  js  c++  java
  • [terry笔记]Flashback

    flashback 闪回,主要功能有两个:闪回查询(flashback query)、闪回恢复(flashback table/database)

    开启闪回flashback功能(归档下才可开启数据库闪回)

    select name,flashback_on from v$database; /*查看flashback是否开启*/
    show parameter db_recovery; /*查看闪回恢复区及大小是否设置*/
    alter system set db_recovery_file_dest_size='2G'; /*先设置闪回恢复区的大小*/
    alter system set db_recovery_file_dest='c:u01fast_recovery_area'; /*再设置闪回恢复区路径*/
    alter system set db_flashback_retention_target = 1440/*设置数据库回退的时间,默认1440分钟为一天时间*/
    alter database flashback on/*开启flashback功能*/

    闪回查询需要设置undo_management=auto(默认即可)
    闪回表需要recycle bin
    闪回数据库需要flashback area

    一、flashback query闪回查询
    1.as of timestamp

    select * from t as of timestamp sysdate-20/1440; /*按时间查询,此查询是查询20分钟前的*/ 

    2.as of scn

    select * from t as of scn 1234567;

    当前scn:

    select dbms_flashback.get_system_change_number from dual;
    select current_scn from v$database;

    其实在oracle内部as of timestamp/scn 最后都是转换为scn进行闪回查询。
    可以通过timestamp_to_scn与scn_to_timestamp进行转换

    SQL> select timestamp_to_scn(sysdate) from dual;
    SQL> select to_char(scn_to_timestamp(1582900),'yyyy-mm-dd hh24:mi:ss') from dual;

    闪回查询需要保证表的结构没有做过ddl

    二、flashback table闪回表
    如果删除的表含有索引、触发器、约束、物化试图等,需要在恢复表后恢复其完整性。

    flashback table xx.xxx to before drop rename to xxx; /*按照删除闪回不用开启行迁移*/
    
    alter table xxx enable row movement; /*因为闪回表需要改变rowid,所以需要行迁移*/
    select row_movement from user_tables where table_name = 'XXX';
    /*根据scn/timestamp闪回,需要注意其触发器会失效,可以加上选项enable triggers*/
    flashback table xxx to scn 1234567;
    flashback table xxx to timestamp sysdate-x/1440;

    此功能需要开启回收站:

    show parameter recyclebin
    
    select object_name,original_name,type from recyclebin; /*查询回收站中都有哪些对象*/
    SQL> drop table t;
    表已删除。
    
    SQL> select object_name,original_name,type from recyclebin;
    
    OBJECT_NAME                    ORIGINAL_NAME                    TYPE
    ------------------------------ -------------------------------- -------------------------
    BIN$OiJJIiwuTaCJqY+UV8eTWQ==$0 T                                TABLE
    
    SQL> flashback table t to before drop;
    flashback table "BIN$OiJJIiwuTaCJqY+UV8eTWQ==$0" to before drop;
    闪回完成。

    三、flashback database闪回数据库
    闪回数据库无法恢复被删除的数据文件,控制文件不可以被重建,不支持shrink后的恢复。
    需要设置db_recovery_file_dest(_size),并且会在这里面产生flashback logs,需要开启force logging

    select flashback_on,force_logging from v$database;
    alter database flashback on;
    alter database force logging;
    show parameter db_flashback_retention_target /*希望能恢复到多长时间以内,默认1440分钟*/
    SQL> select current_scn from v$database;
    
    CURRENT_SCN
    -----------
        1592391
    
    SQL> drop table t purge;
    表已删除。
    
    SQL> shutdown immediate
    ORA-01031: 权限不足
    SQL> conn / as sysdba
    已连接。
    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    
    SQL> startup mount;
    ORACLE 例程已经启动。
    Total System Global Area  535662592 bytes
    Fixed Size                  1385840 bytes
    Variable Size             352324240 bytes
    Database Buffers          176160768 bytes
    Redo Buffers                5791744 bytes
    数据库装载完毕。
    
    SQL> flashback database to scn 1592391;
    闪回完成。
    
    SQL> alter database open resetlogs;
    数据库已更改。
    /*open resetlogs会丢失flashback的时间点到目前的数据,可以用read only的方式打开数据库,用逻辑导出误操作的表,再执行recover database重新应用redo,将数据库恢复到flashback database之前状态,然后逻辑导入。*/
    alter database open read only;
  • 相关阅读:
    PHP 操作MySQL时mysql_connect( )和Mysqli( )的两种报错机制
    OS + macOS Mojave 10.14.4 / sushi / ssh-keygen / ssh-copy-id
    script ajax / XHR / XMLHttpRequest
    java socket / No buffer space available
    OS + Ubuntu ARM Android
    mysql中批量替换数据库中的内容的sql
    linux下ubuntu系统安装及开发环境配置
    PHP 截取字符串专题
    在Ubuntu中用root帐号登录
    理解javascript的caller,callee,call,apply概念
  • 原文地址:https://www.cnblogs.com/kkterry/p/3312110.html
Copyright © 2011-2022 走看看