ITPub博客

首页 > Linux操作系统 > Linux操作系统 > RMAN 常用命令 3 [final]

RMAN 常用命令 3 [final]

原创 Linux操作系统 作者:tolywang 时间:2011-08-01 18:09:58 0 删除 编辑


13.  使用RMAN进行恢复

在使用RMAN恢复数据库时,包括两个步骤:
A. 使用restore 读取备份文件中的数据块,根据数据块所属数据文件,将这些数
   据块放回到相应的数据文件中,完成还原工作。
B. 使用recover命令,把那些从备份以来生成的归档日志文件以及联机日志文件应
   用到还原出来的数据文件上,恢复到最新或指定的时间点。

备注:
a. 目标数据库如果是归档模式,可以是open及mounted状态进行备份
b. 目标数据库如果是非归档模式,必须是mounted状态进行备份
c. 目标数据库如果是归档模式,可以是open,mounted或close状态进行恢复 
d. 目标数据库如果是非归档模式,必须是mounted状态进行恢复

(1). 完全恢复

在使用RMAN进行恢复时,分为归档和非归档模式。
A. 如果目标库为非归档,那么只能是mount状态进行恢复 
B. 如果为归档模式,只要不是恢复undo,system表空间及控制文件,都可以在open进行。

(1.1) 还原SPFILE和控制文件

A. 启用了自动备份控制文件且备份集位于闪回恢复区域 
如果spfile和控制文件都丢失了,我们一般先还原spfile. 如果我们启用了自动
备份控制文件,那么每次备份时都会自动备份控制文件和spfile, 并且将这两种
文件放在同一个备份集中,如果我们丢失了spfile, 我们至少需要将库开启为
nomount , 那么我们必须先借助一个临时参数文件,将库启动到nomount

SQL> startup pfile='/u01/init_temp.ora'  nomount ;

因为默认情况下,spfile和控制文件所在的备份集位于闪回恢复区,该区域的文
件名都是随机产生的,记录元数据的控制文件也丢失了,所以找到含spfile的备
份集很难,我们只有通过它的大小来初步判断,一般spfile和控制文件大小比较
小,不超过10M,  那么我们可以大概找到spfile的备份集:

RMAN > restore spfile to '/u01/spfile_restore.ora' from '/u02/backup/05j0tr4v_1_1 ;

然后通过恢复的spfile开启到nomount状态,还原控制文件。
RMAN > restore controlfile to '/u01/controlfile01.ctl' from '/u02/backup/05j0tr4v_1_1 ;


B. 启用了自动备份控制文件且备份集位于指定的非闪回路径,如果我们修改了
自动备份控制文件的路径,比如 /u01/backup/%F, 那么在恢复spfile的时候可
以使用下面的命令进行: 

RMAN > set dbid=373937390 (如果使用恢复目录,则不需要set dbid)
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore spfile to '/u01/spfile.ora' from autobackup ;
}
还原完spfile以后,类似命令还原controlfile ,如下
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore controlfile to '/u01/control02.ctl' from autobackup ;
}

我们还可以直接根据备份中在spfile创建pfile
RMAN > restore spfile to pfile '/u01/spfile_restore.ora' from autobackup ;

C. 没有启动自动备份控制文件(默认是未启动)
如果没有启用自动备份控制文件,那么每次备份system空间文件时,都会强制备份控制
文件和spfile. 所以我们可以根据大小找到含有控制文件的备份片,进行还原:
RMAN> restore spfile to '/u01/spfile_restore.ora' from '/u01/bak/06j9uyft_1_1';
RMAN> restore controlfile to '/u01/control03.ctl' from '/u01/bak/06j9uyft_1_1';

 

 

14.  非归档模式下的完全恢复

A. 控制文件,联机日志文件,数据文件全部损坏
我们先利用spfile启动到nomount状态,然后恢复控制文件 

RMAN > set dbid=373937390 ;
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore controlfile  from autobackup ;
}
RMAN > sql 'alter database mount ' ; 
使用restore 命令还原所有的数据文件,还原所用到的备份元数据从恢复回来的控制
文件中获得。  
RMAN > restore database ;
(备注: restore database不能加from,需要让控制文件可以自动找到备份文件)
恢复数据库
RMAN > recover database noredo ; (联机日志文件损坏,所以加入noredo)
RMAN > alter database open resetlogs ;

B. 控制文件,联机日志文件完好,只是数据文件全部损坏我们将库启动到mount状态,
利用resoter 还原数据库
RMAN > resoter database ;
还原完成后,利用联机日志中的条目恢复数据库
RMAN > recover database ;
因为是非归档模式,如果当前的日志文件在备份后没有被覆盖,那么可以完全恢复数
据库。 但是如果当前日志文件在备份结束后内容被覆盖,我们只能使用:
RMAN > recover database until cancel ;
RMAN > alter database open resetlogs ;

C. 控制文件完好,联机日志文件和数据文件全部损坏我们将库启动到mount状态,
利用resoter 还原数据库
RMAN > resoter database ;
还原完成后,因为当前联机日志文件损坏,所以需要不完全恢复
RMAN > recover database until cancel ;
RMAN > alter database open resetlogs ;  

D. 数据文件所在磁盘损坏,需要转移数据文件 
将数据库启动到mount状态
SQL > alter database mount;
RMAN > run{
set newname for datafile '/u01/app/oradata/system01.dbf' to '/u02/system01.dbf' ;
set newname for datafile '/u01/app/oradata/undo01.dbf' to '/u02/undo01.dbf' ;
set newname for datafile '/u01/app/oradata/users01.dbf' to '/u02/users01.dbf' ;
set newname for datafile '/u01/app/oradata/sysaux01.dbf' to '/u02/sysaux01.dbf' ;
restore database;       -- 将数据文件还原到新的指定路径
switch datafile all ;   -- 将数据文件新路径写入控制文件
}
然后恢复数据库(利用redo log),开启(对照前面一些情况进行)。
RMAN > recover database ;
RMAN > alter database open;

 

 


15.  归档模式下的完全恢复

进行归档模式下的完全恢复的前提是必须具有从备份以来所有的归档日志以及联机
日志文件,如果缺少,只能进行不完全恢复。

如果在恢复过程中使用的是增量备份,过程和非增量备份一样,只是在执行restore
时,只会还原0级备份,完成还原后,再执行recover,则rman将增量备份及归档日
志文件应用到还原出来的0级备份上。

A. 非系统表空间损坏,控制文件,联机日志文件完好。

如果数据库是开启状态:
RMAN > run {
sql 'alter tablespace users offline immediate '; 
restore tablespace users ;
recover tablespace users;
sql 'alter tablespace users online' ;
}

如果数据库为关闭状态,那么需要将库开启到mount,离线那个表空间的datafile,
然后开启库,最后执行上面的程序 ; 
SQL> shutdown immediate
SQL> startup mount
SQL> alter database datafile 'D:\oracle\test\USERS01.DBF' offline ;
SQL> alter database open ;
RMAN > run {
sql 'alter tablespace users offline immediate '; 
restore tablespace users ;
recover tablespace users;
sql 'alter tablespace users online' ;
}


B. 某非系统数据文件损坏,控制文件,联机日志文件完好。
RMAN> run {
sql ' alter database datafile '/u01/app/oradata/users01.dbf' offline;
restore datafile  '/u01/app/oradata/users01.dbf' ;
recover datafile  '/u01/app/oradata/users01.dbf' ;
sql  'alter database datafile '/u01/app/oradata/users01.dbf' online; 
}
备注: 如果数据库为开启状态,可以直接进行数据文件级别的恢复,如果是关闭
状态,那么需要将库开启到mount, 将受损的数据文件离线, 然后开启库,最后执
行上面的程序 ;  具体步骤类似于上面表空间损坏的命令。


C. 系统表空间的数据文件损坏,控制文件和联机日志文件没有损坏
如果系统表空间损坏,那么只能将库启动到mount状态,进行数据文件的恢复。
RMAN > run {
alter database datafile '/u01/app/oradata/system01.dbf' offline;
restore datafile '/u01/app/oradata/system01.dbf' ;
recover datafile '/u01/app/oradata/system01.dbf' ;
sql  'alter database datafile '/u01/app/oradata/system01.dbf' online;
}


D. 所有数据文件损坏,控制文件和联机日志文件没有损坏
我们需要进行数据库级别的恢复,那么只能将库启动到mount状态,执行如下: 
RMAN > run {
restore database ;
recover database ;
alter database open ;
}

 

 

16.   不完全恢复 

使用RMAN进行不完全恢复的时候,只能在mount状态下进行,而且必须使用
基于数据库的还原, 即必须还原所有的数据文件。

A. 基于时间点

SQL > shutdown immeidate ; 
SQL > startup mount ;
RMAN > run {
set until time="to_date('2007-11-15 04:20:25','YYYY-MM-DD HH24:MI:SS')";
restore database;
recover database;
alter database open resetlogs;
}


B. 基于日志序列号 

SQL > shutdown immeidate ;
SQL > startup mount ;
RMAN > run {
set until sequence 55 thread 1 ;
restore database;
recover database;
alter database open resetlogs;
}


C. 基于SCN号

SQL > shutdown immeidate ;
SQL > startup mount ;
RMAN > run {
set until scn 657981;
restore database;
recover database;
alter database open resetlogs;
}


Restore Point ---
从Oracle10g开始,为了使我们更加方便的进行不完全恢复,Oracle提供了
restore point的概念。可以将之理解为某个时间点或某个SCN的别名,比如
我们要进行一个批量加载,如果该批量加载失败,我们必须将数据库恢复到
批量加载开始前的那个时间点,于是我们可以在批量加载前为这个时候的
SCN号创建一个别名,比如:
SQL > create restore point before_load ;

然后,我们启动批量加载,如果失败,需要恢复,那么我们可以:
SQL > shutdown immediate ;
SQL > startup mount;
RMAN > run {
restore database until restore point before_load ;
recover database until restore point before_load ;
alter database open resetlogs;
}
有关restore point的信息可以从v$restore_point中获得,它与SCN的关系保存
在控制文件中。

 

 


17.  配置恢复目录 (catalog) 

恢复目录是数据库中的一个schema,该schema下面包含多个表,视图以及存储过程。
在恢复目录中存放了RMAN的元数据,RMAN可以使用目标数据库中的的控制文件,将
数据库的结构,归档日志文件,备份集以及镜像副本等信息插入到恢复目录中相关
的表中去,这个过程也叫做同步。

恢复目录的优势: 可以存放多个目标数据库的RMAN元数据;可以在表中存放很长时
间的备份元数据,而控制文件默认只能存放7天。

如果我们决定使用恢复目录,则应该将恢复目录单独放在另一个数据库中,不要与
产品数据库放在一起,道理很简单,一旦产品库出现问题,恢复目录也无法访问,
这时尽管备份文件都存在,但是由于缺少了元数据而不能使用RMAN进行恢复,这时
候只能通过 dbms_backup_restore 程序包来完成了。

在恢复目录中也存在两个程序包: dbms_rcvman 和 dbms_rcvcat。 dbms_rcvman
与目标库中的dbms_rcvman 功能是一样的。实际上,RMAN在备份时可以通过目标
数据库中的dbms_rcvman 来访问目标数据库的控制文件,从而获得RMAN相关的元
数据。dbms_rcvcat则负责将备份信息写入恢复目录对应的数据表中。


我们使用下面的步骤创建恢复目录:
A .SQL> create tablespace rcat_tbs datafile '/u01/rman_tbs01.dbf' size 50M;
B. SQL> create user rcat_owner identified by oracle default tablespace
        rcat_tbs temporary tablespace temp ;
C. SQL> alter user rcat_owner quota unlimited on rcat_tbs;
D. SQL> grant recovery_catalog_owner to rcat_owner ;
   SQL> grant connect , resource to rcat_owner;
E. 创建恢复目录
   $rman  catalog  rcat_owner/oracle@catdb
   RMAN > create catalog tablespace rcat_tbs;
F. 通过RMAN连接到目标库和恢复目录后,将目标库注册到恢复目录中。
   $rman  target sys/oracle@ora10g  catalog  rcat_owner/oracle@catdb
   RMAN > register database ;

在使用恢复目录进行备份恢复的过程中,实际上总是先将RMAN的元数据保存一份
在控制文件中,然后再将控制文件中记录的元数据同步到恢复目录中相应的表中,
同步过程可以分为部分同步和完全同步两种。

在部分同步中,RMAN读取当前控制文件并只把发生变化的数据插入到恢复目录对
应的表中,不会同步数据库物理结构数据,包括比如数据文件,表空间,联机日
志文件等,当发出备份和恢复命令时,运行的就是部分同步。

在完全同步中,Oracle会将控制文件中的所有内容更新到恢复目录中,完全同步
的命令:
RMAN> resync catalog ;

通常我们应该是更改了数据库中的结构,比如添加或删除表空间,数据文件的,
应该进行一次完全同步。

在Oracle10g以前,如果我们完成了不完全恢复,resetlogs打开数据库以后,
在使用了恢复目录的情况下,需要发出下面的命令:
RMAN > reset database;

不过在Oracle10g或之后,已经可以使用发出resetlogs之前的备份和之后产生
的归档日志文件或联机日志文件,从而将数据库完全恢复,在这种情况下我们
不需要发出 reset database 命令。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-705807/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13472927