首页 > 代码库 > Performing User-Managed Database-18.7、Performing Complete User-Managed Media Recovery

Performing User-Managed Database-18.7、Performing Complete User-Managed Media Recovery

18.7、Performing Complete User-Managed Media Recovery
完成一致性备份,把数据库恢复到当前的scn是最好的结果。可以恢复整个数据库,恢复单个表空间,或恢复数据文件。一致性恢复不需要resetlogs打开数据库,非一致性恢复需要resetlogs打开数据库。Backup and Recovery Basics提供了关于介质恢复的信息。

18.7.1、Performing Closed Database Recovery
可以在一个操作中恢复所有损坏的数据文件,也可以分开操作恢复每个损坏的数据文件。

18.7.1.1、Preparing for Closed Database Recovery
(1)关闭数据库,检查出现问题的介质设备
(2)如果引起介质失败的问题是临时的,如果数据没有损坏(比如,磁盘或控制器掉电),不需要介质恢复:只需启动数据库,重新开始操作。如果不能修复,就进行以下步骤

18.7.1.2、Restoring Backups of the Damaged or Missing Files
(1)判断哪些数据文件需要恢复
(2)找到损坏的数据文件的最近备份。仅仅还原损坏的数据文件:不要还原没有损坏的数据文件或任何重做日志文件;如果没有任何备份,只能创建一个数据文件(有归档)
alter database create datafile ‘xxx‘ as ‘xxx‘ size xxx reuse
(3)使用操作系统命令把数据文件还原到默认位置或新的位置。
alter database rename file ‘xxx‘ to ‘xxx‘;

18.7.1.3、Recovering the Database
(1)使用系统管理员权限连接数据库,启动数据库到mount
(2)查询v$datafile获得数据文件名和状态
(3)需要恢复的数据文件必须是在线的,除了offline normal的表空间或read-only表空间
select ‘alter dabase datafile ‘ || name || ‘ online;‘ from  v$datafile;
(4)执行recover database,recover tablespace xxx,recover datafile ‘xxx‘等语句
(5)没有自动地恢复,必须接受或拒绝每个指出的日志。如果自动地恢复,数据库自动地应用日志。
(6)介质恢复完成,数据库返回:Media recovery complete。
(7)alter database open

18.7.2、Performing Datafile Recovery in an Open Database
当数据库处于打开状态时,出现介质失败,不能被写时返回错误,一般表空间的只是损坏的数据文件离线,不能查询时返回错误,一般表空间的只是损坏的数据文件不会离线。
当数据库处于打开状态时,该恢复过程不能用做system表空间的完全介质恢复。如果system表空间的数据文件损坏,数据库自动关闭。

18.7.2.1、Preparing for Open Database Recovery
(1)数据库处于打开,发现需要恢复,把包含损坏的数据文件的表空间离线。
(2)如果引起介质失败的问题是临时的,如果数据没有损坏(比如,磁盘或控制器掉电),不需要介质恢复:只需启动数据库,重新开始操作。如果不能修复,就进行以下步骤

18.7.2.2、Restoring Backups of the Inaccessible Datafiles
(1)判断哪些数据文件需要恢复
(2)找到损坏的数据文件的最近备份。仅仅还原损坏的数据文件:不要还原没有损坏的数据文件或任何重做日志文件;如果没有任何备份,只能创建一个数据文件(有归档)
alter database create datafile ‘xxx‘ as ‘xxx‘ size xxx reuse
SQL> alter database create datafile ‘/oracle/oradata/boss/testtbs04_01.dbf‘ as ‘/oracle/oradata/boss/testtbs04_01.dbf‘ size 10m reuse;
(3)使用操作系统命令把数据文件还原到默认位置或新的位置。
alter database rename file ‘xxx‘ to ‘xxx‘;

18.7.2.3、Recovering Offline Tablespaces in an Open Database
(1)执行recover database,recover tablespace xxx,recover datafile ‘xxx‘等语句
(2)没有自动地恢复,必须接受或拒绝每个指出的日志。如果自动地恢复,数据库自动地应用日志。
(3)介质恢复完成,数据库返回:Media recovery complete。
SQL> recover automatic tablespace testtbs04; 
(4)alter database open

模拟1、创建表空间testtbs04,创建一个表,删除对应的数据文件,做关闭数据库的恢复
(1)
SQL> create tablespace testtbs04
  2    datafile ‘/oracle/oradata/boss/testtbs04_01.dbf‘ size 10m
  3    autoextend on next 1m maxsize unlimited
  4    logging
  5    extent management local autoallocate
  6    blocksize 8k
  7    segment space management auto
  8    flashback on;

(2)
SQL> create table test04(id number, name varchar2(30)) tablespace testtbs04;
SQL> insert into test04 values(1, ‘xxxxx‘);
SQL> insert into test04 values(2, ‘yyyyy‘);
SQL> commit;

(3)
SQL> select group#,members,sequence#,archived,status,first_change# from v$log;

    GROUP#    MEMBERS  SEQUENCE# ARC STATUS           FIRST_CHANGE#
---------- ---------- ---------- --- ---------------- -------------
         1          1          0 YES UNUSED                       0
         2          1          0 YES UNUSED                       0
         3          1          1 NO  CURRENT                 697986

SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> alter system switch logfile;
SQL> select group#,members,sequence#,archived,status,first_change# from v$log;

    GROUP#    MEMBERS  SEQUENCE# ARC STATUS           FIRST_CHANGE#
---------- ---------- ---------- --- ---------------- -------------
         1          1          2 YES INACTIVE                707835
         2          1          3 YES INACTIVE                707837
         3          1          4 NO  CURRENT                 707840
(4)
$ rm -rf testtbs04_01.dbf

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup open;

SQL> col "文件名" for a40;
SQL> col "表空间名" for a10
SQL> set linesize 150
SQL>
select
  ts.name "表空间名"
  , df.file# "文件号"
  , df.checkpoint_change# "检查点"
  , df.name "文件名"
  , df.status "在线状态"
  , rf.error "恢复原因"
  , rf.change# "系统变更号"
  , rf.time
  from v$tablespace ts,v$datafile df,v$recover_file rf
where ts.ts#=df.ts# and df.file#=rf.file#
order by df.file#;

SQL> select
  2    ts.name "表空间名"
  3    , df.file# "文件号"
  4    , df.checkpoint_change# "检查点"
  5    , df.name "文件名"
  6    , df.status "在线状态"
  7    , rf.error "恢复原因"
  8    , rf.change# "系统变更号"
  9    , rf.time
 10    from v$tablespace ts,v$datafile df,v$recover_file rf
 11  where ts.ts#=df.ts# and df.file#=rf.file#
 12  order by df.file#;

表空间名       文件号     检查点 文件名                                   在线状  恢复原因           系统变更号 TIME
---------- ---------- ---------- ---------------------------------------- ------- ------------------ ---------- ------------
TESTTBS02           8     652783 /oracle/oradata/boss/testtbs02_01.dbf    OFFLINE OFFLINE NORMAL              0
TESTTBS04          10     707840 /oracle/oradata/boss/testtbs04_01.dbf    ONLINE  FILE NOT FOUND              0

(5)
SQL> alter database create datafile ‘/oracle/oradata/boss/testtbs04_01.dbf‘ as ‘/oracle/oradata/boss/testtbs04_01.dbf‘ size 10m reuse;

SQL> select file#,name,status,CHECKPOINT_CHANGE#,recover from v$datafile_header where file#=10;

     FILE# NAME                                     STATUS  CHECKPOINT_CHANGE# REC
---------- ---------------------------------------- ------- ------------------ ---
        10 /oracle/oradata/boss/testtbs04_01.dbf    ONLINE              707602 YES

(6)
SQL> recover automatic tablespace testtbs04; 
Media recovery complete.

SQL> alter database open;

SQL> select * from test04;

        ID NAME
---------- ----------------------------------------
         1 xxxxx
         2 yyyyy