• 误删表字段利用flashback恢复


    参考《利用flashback database实现部分对象回滚》:http://www.xifenfei.com/3362.html

    背景:
       同事误删带数据的字段,并重新加上了其他的字段,但后期又要用,希望能恢复原来字段和数据。

    解决思路:

          flashback database功能在生产库中,很少被直接使用,因为没有多少业务可以承受整个数据库级别的回滚.但是如果发生一些让人意想不到的误操作时候,想回滚该操作,我们不得不使用历史的备份来进行不完全恢复.如果没有历史备份,那简直是人生一个悲剧的发生.这里通过使用结合flashback database,实现flashback table级别不能完成的恢复,而且确保整个数据库的其他数据还是最新.这些操作比如:修改表结构,删除数据库用户等操作.这里通过修改表列的处理思路来展示该功能的使用方法,其他处理方法类此。


    1.确定启用flashback database功能 

    SQL> select flashback_on from v$database;
     
    FLASHBACK_ON
    ------------------
    YES
     
    SQL>  show parameter flash
     
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_flash_cache_file                  string
    db_flash_cache_size                  big integer 0
    db_flashback_retention_target        integer     1440
    

     2.模拟表结构被修改

    SQL> create table t_xifenfei
      2  as
      3  select object_id,object_name from dba_objects;
     
    表已创建。
     
    SQL> alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';
     
    会话已更改。
     
    SQL>  select sysdate from dual;
     
    SYSDATE
    -------------------------
    17-6月 -2012 15:25:24
     
    SQL> ALTER TABLE t_xifenfei drop column object_name;
     
    表已更改。
    

    3.尝试flashback query功能

    SQL> SELECT * FROM t_xifenfei as	of timestamp to_timestamp('2012-06-17 15:25:24','yyyy-mm-dd hh24:mi:ss');
    SELECT * FROM t_xifenfei as	of timestamp to_timestamp('2012-06-17 15:25:24','yyyy-mm-dd hh24:mi:ss')
                  *1 行出现错误:
    ORA-01466: 无法读取数据 - 表定义已更改
    --这个证明因为ddl操作发生在表上,无法使用flashback table/query等操作

    4.尝试flashback database

    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    SQL> STARTUP MOUNT;
    ORACLE 例程已经启动。
     
    Total System Global Area  535662592 bytes
    Fixed Size                  1385840 bytes
    Variable Size             390072976 bytes
    Database Buffers          138412032 bytes
    Redo Buffers                5791744 bytes
    数据库装载完毕。
    SQL>  flashback database to timestamp to_date('2012-06-17 15:25:24','yyyy-mm-ddhh24:mi:ss');
    闪回完成。
     
    SQL> alter database open read only;
    	
    数据库已更改。
     
    SQL> DESC CHF.T_XIFENFEI
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     
     OBJECT_ID                                          NUMBER
     OBJECT_NAME                                        VARCHAR2(128)
    

    5.导出需要回滚对象

    C:\Users\XIFENFEI>EXP chf/xifenfei tables=t_xifenfei file=d:\t_xifenfei.dmp
    >log=d:\t_xifenfei.log
     
    Export: Release 11.2.0.3.0 - Production on 星期日 6月 17 15:40:37 2012
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
    With the Partitioning, Oracle Label Security, OLAP, Data Mining,
    Oracle Database Vault and Real Application Testing options
    已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
     
    即将导出指定的表通过常规路径...
    . . 正在导出表                      T_XIFENFEI导出了       75270 行
    成功终止导出, 没有出现警告。
    

     6.恢复数据库至最新状态

    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
    SQL>  startup mount
    ORACLE 例程已经启动。
     
    Total System Global Area  535662592 bytes
    Fixed Size                  1385840 bytes
    Variable Size             390072976 bytes
    Database Buffers          138412032 bytes
    Redo Buffers                5791744 bytes
    数据库装载完毕。
    SQL> recover database;
    完成介质恢复。
    SQL> 	alter database open;
    	
    数据库已更改。
     
    SQL> desc chf.t_xifenfei
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     
     OBJECT_ID                                          NUMBER
    

    7.导入正确数据

    SQL> drop table chf.t_xifenfei purge;
     
    表已删除。
     
    SQL> host imp chf/xifenfei tables=t_xifenfei file=d:\t_xifenfei.dmp
    >log=d:\t_xifenfei.log
     
    Import: Release 11.2.0.3.0 - Production on 星期日 6月 17 15:45:53 2012
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
    With the Partitioning, Oracle Label Security, OLAP, Data Mining,
    Oracle Database Vault and Real Application Testing options
     
    经由常规路径由 EXPORT:V11.02.00 创建的导出文件
    已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
    . 正在将 CHF 的对象导入到 CHF
    . 正在将 CHF 的对象导入到 CHF
    . . 正在导入表                    "T_XIFENFEI"导入了       75270 行
    成功终止导入, 没有出现警告。
     
    SQL> desc chf.t_xifenfei
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     
     OBJECT_ID                                          NUMBER
    
  • 相关阅读:
    子页面向父页面传值
    UEditor的使用方法
    MVC 生成PDf表格并插入图片
    简单行列转换记录
    此数据库没有有效所有者“的解决,我很受用
    ASP.NET MVC3 使用kindeditor编辑器获取不到值
    c#读写文件
    VB 中Sub和Function的区别
    问题集
    hadoop2.7.2运行例子时报错
  • 原文地址:https://www.cnblogs.com/liul21cn/p/2957412.html
Copyright © 2020-2023  润新知