RMAN Restore

本文详细介绍了如何使用RMAN进行Oracle数据库的各种恢复操作,包括恢复参数文件、控制文件、数据文件,以及处理表空间损坏、未备份数据文件丢失等复杂情况。还涵盖了不完全恢复的类型和流程,以及将数据库恢复到另一台机器的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. RMAN恢复的一般过程 

2. 恢复预览

3. 恢复参数文件

4. 恢复控制文件

5. 恢复数据文件

6. 表空间的恢复

7. 系统表空间损坏恢复

8. 所有数据文件丢了(包括system.dbf)

9. 未备份的数据文件恢复

10. 所有参数文件、控制文件、数据文件全丢了的恢复

 11. UNDO坏了

12. RMAN的不完全恢复

  12.1  不完全恢复的类型

   12.2 RMAN不完全恢复的一般流程

13. 将数据库恢复到另一个机器


1. RMAN恢复的一般过程 


    1、restore 还原

    2、recover

2. 恢复预览


 restore ... preview

 查看恢复需要哪些文件
 
 restore tablespace users priview

恢复验证:
 restore ... validate
 
 restore tablespace users validate;


检查备份的可用性:
 validate backupset 1;
 validate backupset 98;


3. 恢复参数文件


    恢复参数文件至少要启到NOMOUNT状态,丢了参数文件是无法启动到nomount
    但RMAN提供了一个运行环境,即便丢了参数文件也可以启动到nomount,
    启动到nomount 后就可以执行恢复了。
 
 restore spfile to '/... ' from '/...';

 RMAN> restore spfile
       from '/u03/rman/ctlbak/c-1307704375-20120422-23';


 或者
 RMAN> restore spfile from autobackup;

 如果控制文件自动备份不在闪回中可以
 
 RMAN> run {
 2> set controlfile autobackup format for device type disk
  to '/u03/rman/ctlbak/%F';
 3> restore spfile from autobackup;
 4> }

     
 RMAN> shutdown immediate;

 RMAN> startup

4. 恢复控制文件


    恢复必须在NOMOUNT状态下进行

    1)在nomount还原控制文件
 restore controlfiel to ... from ...

 RMAN> set dbid=1307704375
 RMAN> set controlfile autobackup format for device type disk
   to '/u03/rman/ctlbak/%F';
 RMAN> restore controlfile from autobackup;
 也可将以上三条简化为一条:
 RMAN> restore controlfile
  from '/u03/rman/ctlbak/c-1307704375-20120422-23';

    2)启动到mount进行数据库恢复
 SQL> alter database mount
 RMAN> recover database;

    3) 以resetlogs  open
 RMAN> sql 'alter database open resetlogs';


5. 恢复数据文件


    1、数据文件离线(offline)
    2、还原数据文件
    3、应用日志恢复
    4、数据文件上线(online)

    例: 
 SQL> host rm /u02/users02.dbf
 SQL> host rm /u01/app/oracle/oradata/orcl/users01.dbf

 SQL> select * from scott.emp;
 select * from scott.emp
                    *
 ERROR at line 1:
 ORA-00376: file 7 cannot be read at this time
 ORA-01110: data file 7: '/u02/users02.dbf'


 恢复:
 SQL> alter database datafile '/u02/users02.dbf'  offline;
 RMAN> restore datafile 7;
 RMAN> recover datafile 7;
 RMAN> sql 'alter database datafile 7 online';


 RMAN> sql 'alter database datafile 4 offline';
 RMAN> restore datafile 4;
 RMAN> recover datafile 4;
 RMAN> sql 'alter database datafile 4 online';

 如果还不行的话,将其所在的表空间online
 SQL> alter tablespace users online;


    例2:磁盘损坏,原有路径无法访问情况的恢复
 如上 /u02 由于磁盘故障,数据完全丢失,且无法访问
 
 由于默认从备份中还原时,是还原到原来的位置,要还原到其他位置时
 还原前要设置新的路径
 set newname for datafile 7 to '/....'


 应用日志进行恢复时,也要告诉oracle,数据文件已经发生变化了,不
 在原有位置了
 switch datafile 7

 RMAN> run {
 2> set newname for datafile 7 to '/u03/users02.dbf';
 3> restore datafile 7;
 4> switch datafile 7;
 5> recover datafile 7;
 6> }

6. 表空间的恢复


 如果数据文件丢失太多的话,可以不一个文件一个文件的恢复,可以整个
 表空间来恢复,恢复一个表空间就是恢复这个表空间的所有数据文件。

 其大致过程
 1、表空间离线
 2、还原表空间
 3、恢复表空间
 4、表空间在线
  
 SQL> host rm /u01/app/oracle/oradata/orcl/users01.dbf
 SQL> host rm /u03/users02.dbf 

 恢复:
 SQL> alter tablespace users offline;
 alter tablespace users offline
 *
 ERROR at line 1:
 ORA-01116: error in opening database file 7
 ORA-01110: data file 7: '/u03/users02.dbf'
 ORA-27041: unable to open file
 Linux Error: 2: No such file or directory
 Additional information: 3

 SQL> alter tablespace users offline immediate;
 RMAN> restore tablespace users;
 RMAN> recover tablespace users;
 RMAN> sql 'alter tablespace users online';

7. 系统表空间损坏恢复


 系统表空间、UNDO表空间损坏的恢复不能在OPEN状态进行
 必须要停机,在 mount 状态下进行
  
 SQL> host rm /u01/app/oracle/oradata/orcl/system01.dbf
 SQL> shutdown abort

 SQL> startup mount;

 RMAN> restore tablespace system;
 RMAN> recover tablespace system;

 其实也可以 restroe database;
           recover database;

 RMAN> alter database open;


8. 所有数据文件丢了(包括system.dbf)


 必须在mount状态下进行
 
 SQL> shutdown abort
 SQL> startup mount
 
 RMAN> restore database;
 RMAN> recover database;
 RMAN> alter database open;

9. 未备份的数据文件恢复


 1、数据文件离线
 2、restore (RMAN只要日志没空,数据文件没备份,能根据日志信息创建)
 3、recover
 4、数据文件上线


 SQL> create tablespace tt datafile '/u02/tt01.dbf' size 50m;

  SQL> create table tt01 tablespace tt
  as select * from scott.dept;
  SQL> alter system switch logfile;
 
 SQL> create table tt02 tablespace tt
  as select * from scott.dept;
 SQL> alter system switch logfile;

 SQL> create table tt03 tablespace tt
  as select * from scott.dept;
 SQL> alter system switch logfile;
 SQL> alter system switch logfile;

   
 SQL> host rm /u02/tt01.dbf

 SQL> alter database datafile 8 offline;
 
 RMAN> restore datafile 8;

 RMAN> recover datafile 8;

 RMAN> sql 'alter database datafile 8 online';

10. 所有参数文件、控制文件、数据文件全丢了的恢复


    1、恢复参数文件
 RMAN> startup nomount
 RMAN> restore spfile from
  '/u03/rman/ctlbak/c-1307704375-20120505-09';

 RMAN> shutdown immediate;

 RMAN> startup nomount 

    2、恢复控制文件
 RMAN> restore controlfile from
  '/u03/rman/ctlbak/c-1307704375-20120505-09';

    3、恢复数据文件
 RMAN> alter database mount;
 RMAN> restore database;
 RMAN> recover database;

 RMAN> alter database open resetlogs;

 11. UNDO坏了


 mount 下恢复


12. RMAN的不完全恢复


  12.1  不完全恢复的类型


 基于时间点不的完全恢复
     set until time="to_date('2012-05-05 11:50:02',
   'yyyy-mm-dd hh24:mi:ss')"

 基于SCN号:
     set until scn ...

 基于日志序列号的不完全恢复:
     set until sequenct ... (恢复到这个序列号之前,不包括这个序列号)


   12.2 RMAN不完全恢复的一般流程


 1、启动到mount状态下
 2、设置一种恢复类型进行恢复
    run {
  set until time=.... 或者
         set until scn ...    或者
  set until sequence ...
  restore ...
  recover ...
  alter database open resetlogs;
    }


    例:
 SQL> set time on
 13:49:36 SQL> drop user scott cascade;


 13:49:48 SQL> select * from scott.emp;
 select * from scott.emp
                     *
 ERROR at line 1:
 ORA-00942: table or view does not exist

 MAN> run {
 2> set until time="to_date('2012-05-05 13:49:33',
  'yyyy-mm-dd hh24:mi:ss')";
 3> restore database;
 4> recover database;
 5> }


 SQL> alter database open resetlogs;


    例:恢复误删除的表空间
 SQL> create table t1 tablespace test
  as select * from scott.dept;
 SQL> alter system switch logfile;
 
 SQL> create table t2 tablespace test
  as select * from scott.dept;
 SQL> alter system switch logfile;

 SQL> create table t3 tablespace test
  as select * from scott.dept;
 SQL> alter system switch logfile;

 SQL> create table t4 tablespace test
  as select * from scott.dept;
 SQL> alter system switch logfile;

 14:11:48 SQL> drop tablespace test including contents and datafiles;
 
 RMAN> run {
 2> set until time="to_date('2012-05-05 14:11:45',
  'yyyy-mm-dd hh24:mi:ss')";
 3> restore database;
 4> recover database;
 5> }
 这样直接恢复是有问题的
 主要原因是,不能拿当前的控制文件来恢复误删除的表空间
 要拿 drop tablespace 之前的控制文件来恢复

 那就说先要恢复drop tablespace 之前的控制文件
 再恢复表空间
 RMAN> shutdown immediate;
 RMAN> startup nomount;

 RMAN> restore controlfile from
  '/u03/rman/ctlbak/c-1307704375-20120505-0b';

 RMAN> alter database mount;
 RMAN> run {
 2> set until time="to_date('2012-05-05 14:11:45',
  'yyyy-mm-dd hh24:mi:ss')";
 3> restore database;
 4> recover database;
 5> }
 RMAN> alter database open resetlogs;


13. 将数据库恢复到另一个机器


    大致过程:
 1、在源库作数据库的完整备份
 2、在目标机器上创建数据库的运行环境(如安装oracle软件,设置一
    些参数,创建运行目录)
 3、恢复数据库到目标机器,并以resetlogs打开
 
  例:将183数据库备份到28机器上恢复

    183机器上的操作:
 RMAN> backup as backupset database format
   '/u03/rman/%d_%T_%s_%p';

 SQL> create table test3 as select * from scott.dept;
 SQL> alter system switch logfile;
 
 RMAN> backup as backupset archivelog all format
  '/u03/rman/archlog_%d_%I_%T';

    28机器上的操作:

      1)创建数据库运行的目录 
 su - oracle
 [oracle@t28 oracle]$ cd $ORACLE_BASE
  
 [oracle@t28 oracle]$ mkdir admin
 [oracle@t28 oracle]$ mkdir oradata
 [oracle@t28 oracle]$ cd admin

 [oracle@t28 admin]$ mkdir orcl
 [oracle@t28 admin]$ cd orcl
 [oracle@t28 orcl]$ mkdir adump bdump cdump dpdump pfile udump

 [oracle@t28 oracle]$ cd $ORACLE_BASE
 [oracle@t28 oracle]$ mkdir oradata/orcl

 [oracle@t28 oracle]$ exit
 [root@t28 ~]# mkdir /u02
 [root@t28 ~]# mkdir /u02/arch_log
 [root@t28 ~]# mkdir /u03
 [root@t28 ~]# mkdir /u03/rman/
 [root@t28 ~]# mkdir /u03/rman/ctlbak
 [root@t28 ~]# chown oracle:oinstall /u03 -R
 [root@t28 ~]# chown oracle:oinstall /u02 -R
 [root@t28 ~]# su - oracle
 
      2)复制ORACLE参数文件,密码文件和数据库及日志的备份
 [oracle@t28 dbs]$ scp 10.1.0.183:/u01/app/oracle/
  product/10.2/db_1/dbs/spfileorcl.ora ./ 

  [oracle@t28 dbs]$ scp 10.1.0.183:/u01/app/oracle/
  product/10.2/db_1/dbs/orapworcl ./

 [oracle@t28 dbs]$ scp -r 10.1.0.183:/u03/rman/*  /u03/rman/


      3)进行恢复
 SQL> startup nomount
 
 [oracle@t28 ~]$ uniread rman target sys/oracle
 RMAN> restore controlfile from '/u03/rman/ctlbak
  /c-1307704375-20120505-0e';

  RMAN> run {
 2> set until sequence 5;   #这个序号因机器而异
 3> restore database;
 4> recover database;
 5> }


也可以通过RMAN的 duplicate 来实现
 具体过程:目标机器创建相关目录,设置环境,源机器备份,两边设置
          网络服务名,rman 登录时同时登录到两个库
          rman target sys/oracle@tar auxiliary sys/oracle@aux
   RMAN> run
  {
   duplicate target database to orcl2;
                         --把目标库复制到aux 同时库名为orcl2
  }


恢复目录:
 恢复目录不是一个什么磁盘目录,它也是一个数据库,不过这个数据库
 不存业务数据,它存放的是其它数据库的备份信息,通常用在多数据库
 的情况下,数据库比较少的情况下很少用恢复目录。

 数据库的备份信息可以保存在控制文件中也可以保存恢复目录中
 没有恢复目录就保存在控制文件,有的话,就保存两份:本机控制文件
 一份,恢复目录一份。但控制文件保存的时间比较短(取决于参数:
 control_file_record_keep_time,默认7天),但恢复目录就可以突
 破这些限制:
 
恢复目录创建
    本例中:t183为target数据库,t28为catalog数据库

    1、准备一个恢复目录的数据库,并配好监听。

    2、执行rman 操作的机器上配置到目录标数据库和恢复目录数据的tnsnames.ora

    3、恢复目录的数据库上创建与恢复目录相关的表空间、用户、并给用户授权
 SQL> create tablespace rcat_tbs datafile
  '/u02/rcat_tab01.dbf' size 200m;
 

 SQL> create user rcat_owner identified by oracle
  default tablespace rcat_tbs;
 
 SQL> grant connect,resource to rcat_owner;

  SQL> grant recovery_catalog_owner to rcat_owner;

     4、登录到catalog 数据库,创建恢复目录
 [oracle@t183 ~]$ rman catalog rcat_owner/oracle@t28
 RMAN> create catalog tablespace rcat_tbs;
 
     5、把目标数据库target注册到恢复目录数据库中
 rman target sys/oracle catalog rcat_owner/oracle@t28
 RMAN> register database;


 之后备份话要同时连到两个数据库,备份信息也就同时写到两个数据库
 了(目标库的控制文件和恢复目录数据库)
 
 有时可能忘了连恢复目录,事先进行两个库之间的数据库同步
 rman target sys/oracle catalog rcat_owner/oracle@t28
 RMAN> resync catalog;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值