zoukankan      html  css  js  c++  java
  • oracle之三rman 不完全恢复

    rman 不完全恢复

    9.1 rman 不完全恢复的三个标准模式:基于time、基于scn和基于sequence:

    范例1:恢复过去某个时间点误操作,一般使用基于time或scn。

    1)环境:有一套全备份,controlfile AUTOBACKUP设成on

    RMAN> show all;

    CONFIGURE CONTROLFILE AUTOBACKUP ON; //控制文件自动备份,备份目的地是flash_recovery_area

    SQL> select * from scott.t1;

    ID
    ----------
    1

    2) 取时间

    SQL> select sysdate from dual;

    SYSDATE
    -------------------
    2013-01-18 13:47:04

    3) 删除 scott.t1中所有记录

    SQL> truncate table scott.t1;

    4) RMAN按时间点做不完全恢复

    run {
    startup force mount;
    allocate channel c1 type disk;
    allocate channel c2 type disk;
    set until time '2013-01-18 13:47:04 ';
    restore database;
    recover database;
    alter database open resetlogs;
    }


    5)验证

    SQL> select * from scott.t1;

    ID
    ----------
    1

    //基于scn的方法与基于time相似,语法是set until scn 6689163;

    //基于日志的方法类似手工恢复的例子,语法是set until sequence 3;

    *考点:不完全恢复的手工与RMAN语法比较:


    手工方法 RMAN方法
    -----------------------------------------------------------------
    基于time until time XXX until time XXX
    基于scn until change XXX until scn XXX
    基于日志 until cancel until sequence XXX

    范例2

    恢复SPFILE或CONTROLFILE:

    1)环境
    SQL> select * from v$tablespace;

    TS# NAME INC BIG FLA ENC
    ---------- ------------------------------ --- --- --- ---
    0 SYSTEM YES NO YES
    1 SYSAUX YES NO YES
    4 USERS YES NO YES
    6 EXAMPLE YES NO YES
    8 TEST YES NO YES
    3 TEMP NO NO YES
    2 UNDOTBS1 YES NO YES

    SQL> select owner,table_name,tablespace_name from dba_tables where table_name='T1';

    OWNER TABLE_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------ ------------------------------
    SCOTT T1 USERS

    //T1表里有一条记录

    SQL> select * from scott.t1;

    ID
    ----------
    1

    3)关闭数据库,然后让参数文件不起作用

    SQL> shutdown abort

    [oracle@timran dbs]$ rm spfiletimran.ora
    [oracle@timran dbs]$ rm inittimran.ora

    5) RMAN恢复参数文件

    [oracle@timran ~]$ [oracle@timran ~]$ rman target /

    connected to target database (not started)

    RMAN> startup nomount; //没有了参数文件,SQL*PLUS是无法启动实例的,但RMAN可以,所以startup nomount一定要在RMAN下做!!!

    RMAN> restore spfile from '/u01/flash_recovery_area/TIMRAN11G/autobackup/2013_01_16/';

    //查看在dbs/目录下已经产生spfiletimran.ora文件。证明spfile 恢复好了。


    范例3 恢复误删除表空间(已备份),RMAN必须通过备份的控制文件(即含有删除的表空间结构的老控制文件)进行恢复。

    本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。

    1)打开告警日志,查看drop tablespace的告警信息,记下时间点

    $ tail -f /u01/diag//rdbms/timran11g/timran11g/trace/alert_timran11g.log

    2)删除test表空间

    SQL> drop tablespace test including contents and datafiles;

    3)查看告警有关信息:

    Wed Jan 16 19:39:56 2013 //这个时间是你要until time的时刻
    drop tablespace test including contents and datafiles
    Deleted file /u01/oradata/timran11g/test01.dbf
    Wed Jan 16 19:40:12 2013
    Completed: drop tablespace test including contents and datafiles

    4)删除所有控制文件和数据文件

    SQL> shutdown abort
    [oracle@timran timran11g]$ rm *.ctl
    [oracle@timran timran11g]$ rm *.dbf

    5)准备对drop tablespace test做不完全恢复

    RMAN>run{
    startup force nomount;
    set dbid=3416564781;
    restore controlfile from autobackup until time '2013-01-16 19:39:56';
    alter database mount;
    set until time '2013-01-16 19:39:56';
    restore database;
    recover database;
    alter database open resetlogs;
    }

    6)验证:
    SQL> select * from scott.t1;

    ID
    ----------
    1
    要点:
    1)不能使用当前的控制文件恢复误删除的表空间,因为当前控制文件已经没有该表空间的记录了。
    2)dbid是数据库的身份证,保存在控制文件中,set dbid=对于控制文件自动恢复(from autobackup)是必要的;

    范例4 表空间时间点恢复(TableSpace Point In Time Recovery)

    作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动。TSPITR是一种对个别表空间执行不
    完全恢复的技术,一般是针对用户错误的删除
    (或截断)了表。TSPITR的最大好处是不需要生产库停机。

    我们了解一下这个过程。
    前提:

    1. 有一套全库备份,因为TSPITR这个过程除了复制需要恢复的表空间外,也必须复制system,sysaux和undo表空间(考点)
    2. 本例设置了控制文件自动备份:RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

    1)建表空间
    SQL> create tablespace abcd datafile '/u01/oradata/timran11g/abcd01.dbf' size 5m;

    2)建一个测试表
    create table scott.t4(c1 date) tablespace abcd;
    insert into scott.t4 values(sysdate);
    commit;

    3)RMAN备份表空间
    RMAN>backup tablespace abcd format '/u01/myrman/abcd_%s.bak';

    4)取当前时间
    SQL>select sysdate from dual;

    SYSDATE
    -------------------
    2013-01-16 22:02:14

    5)删除表并purge
    SQL>drop table scott.t4 purge;

    6)建立目录指定辅助库目标
    $mkdir -p /u01/oradata/timran11g/auxdata

    7)做RMAN TSPITR 并指定辅助库目的地
    [oracle@timran ~]$ rman target /

    RMAN> recover tablespace abcd until time '2013-01-16 22:02:14' auxiliary destination '/u01/oradata/timran11g/auxdata';
    执行过程值得一读,但太长了,略了。

    8)验证
    SQL> alter tablespace abcd online;
    SQL> select * from scott.t4;

    C1
    -------------------
    2013-01-16 21:58:11

    考点:
    1)TSPITR是保持在线业务下表空间级的不完全恢复,恢复的表空间要自包含。使用TS_PITR_CHECK视图查看自包含信息。
    2)TSPITR一般用于将已有的表空间恢复到过去的某个时间点,而11gR2版使用可传输表空间和数据泵技术,Oracle声明可以恢复被删除的表
    空间。(PPT-II-563)
    3)通过TS_PITR_OBJECTS_TO_BE_DROPPED视图,查看creation time字段可以知道截止恢复时间之后的有哪些新建对象可能丢失了。
    4)完成指定表空间的TSPITR后,这个表空间之前做的备份就不能再用于以后的TSPITR。 这就是在TSPITR之后要重新备份表空间的原因。

    范例5:数据块介质恢复(BMR)(PPT-II-229-236)

    如果数据文件只是出现部分数据块损坏,RMAN可以尝试针对坏块进行恢复,就是说不需要恢复整个数据文件,只恢复损坏的数据块。为了保
    证数据文件的一致性,块介质恢复是一个完全恢复。

    介质损坏,Block format incorrect,checksum无效
    逻辑损坏,Oracle internal error,checksum有效

    很多方法可以发现坏块(考点):
    A. ANALYZE operations
    B. dbv
    C. SQL queries that access the potentially corrupt block
    D. DBMS_REPAIR
    F. RMAN

    通过设置参数,当对块读写时进行检查

    DB_BLOCK_CHECKSUM 检查disk I/O讹误,缺省TYPICAL。
    DB_BLOCK_CHECKING 防止memory和data讹误,缺省FALSE。
    DB_LOST_WRITE_PROTECT lost write 与standy database的延迟永久写有关,缺省TYPICAL。

    11g新出了一个参数,顶替了上面三个参数,它就是DB_ULTRA_SAFE(考点)。
    该参数可选项:OFF(缺省)|DATA_ONLY|DATA_AND_INDEX

    OFF表示,DB_ULTRA_SAFE不起作用了,仍然沿用上面三个参数值的具体指定。

    RMAN在BACKUP时,可以监测到损坏的数据块,并且自动将坏块记录V$database_block_corruption中。

    如果是某个查询会话击中了坏块,可能会有下面的报错:
    ORA-01578: ORACLE DATA BLOCK CURRPTED(FILE #5,BLOCK #21)

    对应的rman恢复命令应该是:

    RMAN>blockrecover device type disk datafile 5 block 21;

    11g新特性增加RMAN>recover corruption list,它和backup validate database配合使用,为的是简化数据文件坏块恢复。

    例:
    RMAN>BACKUP VALIDATE DATABASE;
    RMAN>RECOVER CORRUPTION LIST;

    BACKUP VALIDATE DATABAE 不生成备份集,它只是检查坏块,并确认所有数据文件在正确的位置上, 这条命令会在v$backup_corruption
    和v$database_block_corruption视图中填充检测到的所有讹误数据块。

    例:
    RMAN> RECOVER CORRUPTION LIST UNITL TIME SYSDATE - 7;

    注意:RMAN的块恢复是完全恢复,这里的UNTIL表示的是要使用一周前的备份做还原,它不代表不完全恢复。

    考点会围绕以下知识点:

    1)BMR是RMAN的一个功能,它是针对物理损坏的block进行的完全恢复,要求数据库是ARCHIVELOG模式。
    2)RMAN是块级备份,备份时自动检测坏块,缺省下碰到坏块就会中断备份,除非set maxcorrupt
    3)做BMR有两点前提:一个是数据库要在mount或open下, 另一个是要有坏块所在的数据文件incremental level 0备份。
    4)闪回日志也可以帮助恢复坏块。

    SQL> desc V$DATABASE_BLOCK_CORRUPTION;
    名称 是否为空? 类型
    ----------------------------------------------------------------- -------- --------------------------------------------
    FILE# NUMBER
    BLOCK# NUMBER
    BLOCKS NUMBER
    CORRUPTION_CHANGE# NUMBER
    CORRUPTION_TYPE VARCHAR2(9)

    RMAN> recover corruption list命令修复的是CORRUPTION_TYPE列记录了MEDIA_CORRUPT的物理坏块。

    范例6:归档备份(PPT-II-127)

    概念:在Oracle 11g中,可以使用backup … keep命令保留比RMAN备份保留策略所指定的时间更长的备份。它可以构造能保留数年的备份(不被obsolete),归档备份之所能使备份长久保存,关键是使用keep选项覆盖掉了RMAN中缺省的保留策略。

    语法:BACKUP ... KEEP {FOREVER|UNTIL TIME 'date_expt'} [RESOTRE POINT rename];

    说明:

    KEEP FOREVER 永不过期(需要catalog)在Oracle 11g中
    KEEP UNTIL TIME 后跟一个时间长度,如表示一年:'sysdate+365'

    RESOTRE POINT 的作用记录这次备份的唯一性, rename表示的scn已被记录下来,rename不能重名。

    例:
    RMAN>
    backup datafile 4 format '/u01/myrman/%s_%t.bak'
    keep until time 'sysdate+30'
    restore point timranbak1;

    可以查看RESOTRE POINT rename和scn的对应关系。

    RMAN> list restore point all;

    SCN RSP 时间 类型 时间 名称
    ---------------- ------------------- ---------- ------------------- ----
    13400758 2014-03-13 10:10:18 TIMRANBAK


    考点:
    1)归档备份不受retention策略影响,也不会由delete obsolete命令自动删除掉。
    2)归档备份是包含一切的备份,共四种类型:数据文件备份,spfile备份,control备份和归档日志备份。

    范例7,使用image copy快速恢复数据文件(不需要restore)(PPT-II-170)

    RMAN> backup as copy datafile 4 format '/u01/myrman/%s.dbf';

    SQL> select file#,name from v$datafile; //看一下控制文件中datafile 4 标识的物理路径

    [oracle@timran timran11g]$ rm /u01/oradata/timran11g/users01.dbf

    RMAN> sql 'alter database datafile 4 offline';

    RMAN> switch datafile 4 to copy; //switch命令更改了控制文件相关信息并触发resync catalog。

    RMAN> recover datafile 4;

    RMAN> sql 'alter database datafile 4 online';

    如果还想恢复原状可以再使用SQL*PLUS
    SQL>alter tablespace users offline;
    [oracle@timran timran11g]$ cp /u01/myrman/34.dbf /u01/oradata/timran11g/users01.dbf
    SQL>alter tablespace users rename datafile '/u01/myrman/34.dbf' to '/u01/oradata/timran11g/users01.dbf';
    SQL>alter tablespace users online;

  • 相关阅读:
    Servlet的PrintWriter out = response.getWriter()使用
    Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference
    Scrum介绍——续
    Scrum介绍
    CMM能力成熟度模型
    自定义Spark Partitioner提升es-hadoop Bulk效率——续
    $digest already in progress 解决办法——续
    $digest already in progress 解决办法
    linux tcpdump 抓包
    Asterisk——part 1
  • 原文地址:https://www.cnblogs.com/jinxf/p/9171331.html
Copyright © 2011-2022 走看看