归档模式下oracle如何手工进行不完全恢复实验(2)

1.不完全恢复的特点:
1)让整个 database 回到过去某个时间点,不能避免数据丢失。
2)想跳过坏日志而继续恢复所有其他工作是不可能的,前滚没有这个功能(考点)。
3)必须以 sysdba 身份连接进行不完全恢复,普通用户或 sysoper 都不行(考点)。
4)语句只有 recover database until 这种形式,表示整个数据库回到某个时间点或SCN,而 until 是指恢复在时间点前停止(考点)。
2.不完全恢复(Incomplete recover) 适用情况
1)在过去的某个时间点重要的数据被破坏。
2)在做完全恢复时,丢失了归档日志或当前 online redo log(考点)
3)当误删除了表空间时(有控制文件备份)
4)丢失了所有的控制文件,使用备份的控制文件恢复时(条件满足时可以完全恢复)
3.不完全恢复的基本类型:
1)基于时间点 (until time):    使整个数据库恢复到过去的一个时间点前
2)基于 scn (until change):    使整个数据库恢复到过去的某个 SCN 前
2)基于 cancel (until cancel):    使整个数据库恢复到归档日志或当前 日志的断点前
3)基于误删除表空间(使用备份的 controlfile): 使整个数据库恢复到误删除表空间前

下面将针对第二种不完全恢复的类型进行练习:
1.对用户test下的表TEST_TAB(表空间为TEST_TS)进行实验


SQL>  select * from test.test_tab;
        ID
----------
         1
         2


SQL> insert into test.test_tab values (3);
SQL> commit;

2)模拟误删除表TEST_TAB,并 purge 

SQL>  drop table test.test_tab purge; 
SQL> select group#,sequence#,archived,status from v$log;
    GROUP#  SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
         1          1 YES      INACTIVE
         2          2 NO       CURRENT
         3          0 YES      UNUSED

SQL> alter system switch logfile;
SQL> /
SQL> /

[oracle@oracle 2018_09_29]$ cd /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2018_09_29
[oracle@oracle 2018_09_29]$ ls
o1_mf_1_1_ftxldnsg_.arc  o1_mf_1_2_ftxoscn7_.arc  o1_mf_1_3_ftxosf3m_.arc  o1_mf_1_4_ftxosj9p_.arc


由此可知,删除语句记录于o1_mf_1_2_ftxoscn7_.arc归档日志文件中。
实验的原因,我们可以做此判断,现实中可能预估范围文件,逐一进行挖掘。


3)通过 logmr 找出误操作的 ddl 命令的 timestamp 或 san

SQL> show parameter utl_file_dir

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string

建立目录,用于日志挖掘

[oracle@oracle ORCL]$ cd /u01/app/oracle/flash_recovery_area/ORCL
[oracle@oracle ORCL]$ mkdir logmnr

SQL> alter system set utl_file_dir='/u01/app/oracle/flash_recovery_area/ORCL/logmnr' scope=spfile;


SQL> shutdown immediate ;
SQL> startup
SQL> show parameter utl_file_dir

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      /u01/app/oracle/flash_recovery
                                                 _area/ORCL/logmnr

SQL> 下执行如下
execute dbms_logmnr_d.build('dict.ora','/u01/app/oracle/flash_recovery_area/ORCL/logmnr',dbms_logmnr_d.store_in_flat_file);
execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2018_09_29/o1_mf_1_1_ftxldnsg_.arc',options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2018_09_29/o1_mf_1_2_ftxoscn7_.arc',options=>dbms_logmnr.addfile);
execute dbms_logmnr.start_logmnr(dictfilename=>'/u01/app/oracle/flash_recovery_area/ORCL/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);

select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE lower(sql_redo) like 'drop table%';
USERNAME                              SCN TO_CHAR(TIMESTAMP,'
------------------------------ ---------- -------------------
SQL_REDO
--------------------------------------------------------------------------------
UNKNOWN                           4114437 2018-09-29 09:34:52
drop table test.test_tab purge;


execute dbms_logmnr.end_logmnr;


4) 关闭数据库,删除所有 dbf,准备做不完全恢复
SQL>  shutdown abort

[oracle@oracle orcl]$ cd /u01/app/oracle/oradata/orcl
[oracle@oracle orcl]$ rm *.dbf

5)还原所有备份的数据文件
[oracle@oracle orcl]$ cp osbak2/*.dbf ./
6)根据 log miner 提供的信息,做基于时间点(2018-09-27 17:03:43)的不完全恢复

SQL> recover database until change 4114437

auto


7)resetlogs 方式打开数据库
SQL> alter database open resetlogs;

8)验证


SQL> select * from test.test_tab;

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

此时数据库整体已经不完全恢复到过去drop表之前的状态了,现实生中的情况可能不是这样使用的,现实中如果发现过去某个时间误删除了某个表,是先一致性关闭数据库,再做全备,然后按照上面的方法进行不完全恢复,再把误删除的表EXP出来的,进行最后完全备份恢复,恢复后再将先前EXP的表IMP,此时,其它用户或表的数据保持最新,误删除的表也恢复了正常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值