`

Oracle基于时间的不完全恢复

阅读更多
实验时间:2011年10月14日 环境:RED HAT4,Oracle 10.0.20

基于时间的不完全恢复,难点之一是找出恢复的时间点。如果用户记得当然很多,但很多时候,用户是不知道的,或者不能说知道。如果用户不知道,可以借助于LOG MINIER工具的确定。

一、假定场景
  用户误删一个重要的表(SCOTT用户的EMP表),并且清空了回收站。当然此种情况也可以使用闪回技术来恢复,这里使用不完全恢复方法进行恢复。

二、场景模拟
以SCOTT用户登录,删除表,新建一个表。
SQL> conn scott/oracle
Connected.
SQL> drop table emp purge;

Table dropped.

SQL> create table dept_new as select * from dept;

Table created.

不完全恢复后,EMP表应该存在,DEPT_NEW表应该不存在

为了更加接近实际情况,再手动切换几次日志。
SQL> conn / as sysdba
Connected.
SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

三、恢复过程
1、设置LOG MINER用的参数
SQL> conn / as sysdba
Connected.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /home/oracle/oracle/product/10
                                                 .2.0/db_1/dbs/spfileorcl.ora
SQL> alter system set utl_file_dir='/tmp/logmnr' scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area  130023424 bytes
Fixed Size                  1218100 bytes
Variable Size              62917068 bytes
Database Buffers           62914560 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> show parameter utl_file

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      /tmp/logmnr
验证一下,设置成功,当然,对应的目录要存在。

2、创建数据字典
SQL> exec dbms_logmnr_d.build('dictora','/tmp/logmnr');

PL/SQL procedure successfully completed.

SQL> !ls -l /tmp/logmnr
total 22992
-rw-r--r--  1 oracle oinstall 23509170 Oct 14 22:20 dictora
创建成功后,可以看到对应的文件

3、添加要分析的日志(包括联机日志和归档日志)
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         35   52428800          1 YES INACTIVE                915247 14-OCT-11
         2          1         36   52428800          1 NO  CURRENT                 935795 14-OCT-11
         3          1         34   52428800          1 YES INACTIVE                915244 14-OCT-11

SQL> select * from v$logfile;

    GROUP# STATUS  TYPE    MEMBER                                                       IS_
---------- ------- ------- ------------------------------------------------------------ ---
         3         ONLINE  /home/oracle/oracle/product/oradata/orcl/redo03.log          NO
         2         ONLINE  /home/oracle/oracle/product/oradata/orcl/redo02.log          NO
         1 STALE   ONLINE  /home/oracle/oracle/product/oradata/orcl/redo01.log          NO
        
SQL> exec dbms_logmnr.add_logfile('/home/oracle/oracle/product/oradata/orcl/redo02.log',-
> dbms_logmnr.new);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.add_logfile('/home/oracle/oracle/product/oradata/orcl/redo01.log',-
> dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.add_logfile('/home/oracle/oracle/product/oradata/orcl/redo03.log',-
> dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

再加入两组归档日志
SQL> exec dbms_logmnr.add_logfile('/home/oracle/oracle/product/archive/1_33_760842868.dbf',-
> dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.add_logfile('/home/oracle/oracle/product/archive/1_32_760842868.dbf',-
> dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

4、开始分析,根据分析结果确定时间
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/tmp/logmnr/dictora');

PL/SQL procedure successfully completed.
字典文件名称就是前面的目录,加上字典文件名称

SQL> select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') sj,
  2  scn,sql_redo from V$logmnr_contents
  3  where upper(sql_redo) like 'DROP TABLE EMP%';

SJ                         SCN SQL_REDO
------------------- ---------- ------------------------------------------------------------
2011-10-14 22:04:56     915163 drop table emp purge;
由以上SQL可以确定了删除表的时间,以及SCN号。

5、具体的恢复过程
SQL> shutdown abort;
ORACLE instance shut down.
SQL> !cp /disk2/oracle/coldbak/*.dbf $ORACLE_BASE/oradata/orcl/

SQL> startup mount
ORACLE instance started.

Total System Global Area  130023424 bytes
Fixed Size                  1218100 bytes
Variable Size              67111372 bytes
Database Buffers           58720256 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> recover database until time '2011-10-14 22:04:56';
ORA-00279: change 869963 generated at 09/26/2011 03:49:03 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_22_760842868.dbf
ORA-00280: change 869963 for thread 1 is in sequence #22


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 890420 generated at 09/26/2011 03:58:51 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_23_760842868.dbf
ORA-00280: change 890420 for thread 1 is in sequence #23
ORA-00278: log file '/home/oracle/oracle/product/archive/1_22_760842868.dbf' no longer needed for this recovery


ORA-00279: change 910592 generated at 09/26/2011 04:14:24 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_24_760842868.dbf
ORA-00280: change 910592 for thread 1 is in sequence #24
ORA-00278: log file '/home/oracle/oracle/product/archive/1_23_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912028 generated at 09/26/2011 04:39:55 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_25_760842868.dbf
ORA-00280: change 912028 for thread 1 is in sequence #25
ORA-00278: log file '/home/oracle/oracle/product/archive/1_24_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912030 generated at 09/26/2011 04:39:56 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_26_760842868.dbf
ORA-00280: change 912030 for thread 1 is in sequence #26
ORA-00278: log file '/home/oracle/oracle/product/archive/1_25_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912033 generated at 09/26/2011 04:40:01 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_27_760842868.dbf
ORA-00280: change 912033 for thread 1 is in sequence #27
ORA-00278: log file '/home/oracle/oracle/product/archive/1_26_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912035 generated at 09/26/2011 04:40:03 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_28_760842868.dbf
ORA-00280: change 912035 for thread 1 is in sequence #28
ORA-00278: log file '/home/oracle/oracle/product/archive/1_27_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912037 generated at 09/26/2011 04:40:04 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_29_760842868.dbf
ORA-00280: change 912037 for thread 1 is in sequence #29
ORA-00278: log file '/home/oracle/oracle/product/archive/1_28_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912039 generated at 09/26/2011 04:40:05 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_30_760842868.dbf
ORA-00280: change 912039 for thread 1 is in sequence #30
ORA-00278: log file '/home/oracle/oracle/product/archive/1_29_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912041 generated at 09/26/2011 04:40:05 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_31_760842868.dbf
ORA-00280: change 912041 for thread 1 is in sequence #31
ORA-00278: log file '/home/oracle/oracle/product/archive/1_30_760842868.dbf' no longer needed for this recovery


ORA-00279: change 912152 generated at 09/26/2011 04:46:45 needed for thread 1
ORA-00289: suggestion : /home/oracle/oracle/product/archive/1_32_760842868.dbf
ORA-00280: change 912152 for thread 1 is in sequence #32
ORA-00278: log file '/home/oracle/oracle/product/archive/1_31_760842868.dbf' no longer needed for this recovery


Log applied.
Media recovery complete.
SQL> alter database open resetlogs;

Database altered.

简述一下具体过程:关库,转储备份的数据文件,打开数据库的MOUNT状态,使用recover database until time '2011-10-14 22:04:56'命令进行不完全恢复,
使用alter database open resetlogs命令打开数据库

6、检查
SQL> conn scott/oracle;
Connected.
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
RECOVER_TEST                   TABLE
RECOVER_TEST2                  TABLE
EMP_BAK                        TABLE

7 rows selected.
好了,该存在的表EMP存在,不该存在的表DEPT_NEW不存在。

7、关于resetlogs参数
切换几次重做日志,查询一下,可以看到由此带来的相应变化;日志的SEQUENCE#从1重新开始编了,RESETLOGS_CHANGE#变成一个新的数字了。
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1          2   52428800          1 YES INACTIVE                915564 14-OCT-11
         2          1          4   52428800          1 NO  CURRENT                 915569 14-OCT-11
         3          1          3   52428800          1 YES INACTIVE                915566 14-OCT-11

SQL> select name,status,thread#,sequence#,resetlogs_change# from v$archived_log;

NAME                                                                             S    THREAD#  SEQUENCE# RESETLOGS_CHANGE#
-------------------------------------------------------------------------------- - ---------- ---------- -----------------
/home/oracle/oracle/product/archive/1_33_760842868.dbf                           A          1         33            690028
/home/oracle/oracle/product/archive/1_34_760842868.dbf                           A          1         34            690028
/home/oracle/oracle/product/archive/1_35_760842868.dbf                           A          1         35            690028
/home/oracle/oracle/product/archive/1_36_760842868.dbf                           A          1         36            690028
/home/oracle/oracle/product/archive/1_1_764549776.dbf                            A          1          1            915159
/home/oracle/oracle/product/archive/1_2_764549776.dbf                            A          1          2            915159
/home/oracle/oracle/product/archive/1_3_764549776.dbf                            A          1          3            915159
分享到:
评论

相关推荐

    Oracle RMAN异机不完全恢复

    ### Oracle RMAN 异机不完全恢复 #### 实验背景 在实际的数据库管理工作中,可能会遇到因误操作导致的数据丢失或损坏的情况。在这种情况下,如何有效地利用备份数据完成数据库的恢复工作至关重要。本实验模拟了一...

    oracle数据库不完全恢复

    Oracle数据库的不完全恢复是一种特殊的恢复机制,它用于在某些特定情况下,如丢失部分归档日志或数据文件,使得完全恢复无法实现时,通过应用部分日志来恢复数据库到故障发生前的一个特定状态。不完全恢复的目标是尽...

    Oracle基于数据挖掘的不完全恢复

    本篇将探讨Oracle基于数据挖掘的不完全恢复方法,它允许你在误操作后恢复到特定的时间点,而非仅仅回滚到最近的备份状态。 首先,理解不完全恢复的概念。不完全恢复是一种在数据库关闭状态下进行的恢复方式,它可以...

    oracle备份及Oracle彻底删除大全

    使用RMAN进行基于时间点的不完全恢复 - Oracle Life.files 使用RMAN进行快速Dataguard数据库创建 - Oracle Life.files Oracle RMAN物理备份技术详解 Oracle RMAN快速入门指南 如何彻底删除Oracle 使用RMAN进行快速...

    Oracle基于事务日志的数据恢复.pdf

    对于完全恢复,Oracle使用归档日志(Archived Redo Logs),这是在每次日志切换时产生的历史记录,用于在数据库灾难性失败后进行完全恢复。 归档日志是Oracle数据恢复策略中的关键元素,因为它们包含了自上次备份...

    Oracle数据库备份与恢复之完全攻略

    本资源“Oracle数据库备份与恢复之完全攻略”提供了一份详尽的指导,涵盖了Oracle数据库的备份、还原过程及注意事项。 一、Oracle数据库备份类型 1. **完整备份**:包括数据库的所有数据文件、控制文件、参数文件...

    oracle 备份&恢复案例.doc

    而不完全介质恢复则在无法进行完全恢复或无需完全恢复时进行,包括基于撤销、基于时间和基于修改的恢复。基于撤销的恢复允许DBA控制恢复到某一特定操作前的状态,而基于时间或修改的恢复则可以恢复到某个特定的时间...

    oracle 备份&恢复案例

    - 不完全介质恢复:在无法进行完全恢复或不需要完全恢复时使用,如基于撤销、基于时间或基于修改的恢复。基于撤销恢复允许DBA控制恢复到特定操作之前,而基于时间和基于修改的恢复则允许恢复到特定的时间点或系统...

    oracle备份与恢复案例电子书

    总结来说,Oracle备份与恢复是数据库管理中的核心技能,涉及到实例恢复、介质恢复、不同类型的不完全恢复策略,以及使用如`exp`和`imp`等工具进行数据迁移。了解并熟练掌握这些概念和技术,能够帮助DBA有效地应对...

    Oracle数据库备份恢复工具

    2. 恢复模式:根据业务需求,可以选择完全恢复、不完全恢复或单个表空间恢复等模式。 3. 指定恢复时间点:如果选择了时间点恢复,用户需要确定到哪个时间点的数据需要恢复。 4. 执行恢复:工具会解析用户的恢复指令...

    Oracle 12c备份恢复-RMAN工具技术手册

    Oracle 12c 备份恢复-RMAN 工具技术手册 本文档旨在提供 Oracle 12c 备份恢复的技术手册,主要介绍 RMAN 工具的概念、架构、备份类型和使用方法。 一、RMAN 概念 RMAN(Recovery Manager)是 Oracle 推荐的备份和...

    EasyDB for Oracle——基于阿里云的Oracle最佳实践.pdf

    同城容灾和异地灾备的部署策略可以确保在故障发生时,业务能够快速恢复,减少中断时间。 此外,EasyDB还提供了数据库运维管控平台,名为easyDBagent,用于简化Oracle的管理和监控。通过这个SaaS平台,可以进行全量...

    Oracle 备份工具,基于.net

    Oracle数据库是企业级广泛使用的数据库管理系统,为了保证数据的安全性和完整性,定期备份是必不可少的环节。本项目"Oracle 备份工具,基于.net"提供了一种解决方案,它利用.NET框架来实现对Oracle数据库的自动备份...

    实验8-Oracle数据库备份与恢复.pdf

    Oracle 数据库提供了多种恢复方法,包括基于时间的不完全恢复、基于 SCN 的恢复、基于日志的恢复等。 1. 基于时间的不完全恢复 基于时间的不完全恢复是指恢复数据库到某个指定的时间点。这种方法可以使用热备份来...

    Oracle备份与恢复案例

    不完全介质恢复则是在无法或不需要完全恢复时使用,它可以是基于撤销、基于时间或基于修改的恢复。例如,基于撤销的恢复适用于日志组受损,需要在使用最近的未损日志组后中断恢复;基于时间或修改的恢复则允许恢复到...

    oracle数据库管理备份与恢复及网络配置

    冷备份是在数据库关闭的情况下进行的,适用于完全备份,但操作期间数据库不可用;热备份则允许在数据库运行时进行备份,适合于事务繁忙的环境;逻辑备份通过导出数据和SQL脚本实现,适用于数据迁移和数据复制;物理...

    ORACLE 数据库 备份和恢复的 案例 例子 rman

    - **基于时间(TIME)和基于修改(SCN)的恢复**:如果DBA希望将数据库恢复到过去某个特定的时间点或修改点,可以采用基于时间和基于修改的不完全恢复。例如,在意外删除了某个数据表之后,可以使用这种方式将数据库...

Global site tag (gtag.js) - Google Analytics