作者:gototop这篇文章是去年写的了,最初发表在chinaunix.net的oracle论坛里,收录在旧版文集中,可能很多没有看到,总有人写信要,今天乘改版之际就把它单独拿出来了。(gototop 2003.6.24注)RMAN(Recovery Manager)是DBA的一个重要工具,用于备份、还原和恢复oracle数据库,前一段时间有网友找我要,可惜没时间,趁这两天出差在外没什么事,就写了一下,供初学的朋友参考。本文将介绍RMAN 的基本操作,更多的信息请参考《Oracle8i Backup & Recovery Guide》及RMAN 手册,或者是OCP Student Guide M09096《Backup and Recovery Workshop》Volume 2,也可以通过 [email protected] 和我联系。Oracle 自带的例子参考$ORACLE_HOME/rdbms/demo 目录下的*.rcv脚本。一、RMAN 简介RMAN 可以用来备份和恢复数据库文件、归档日志和控制文件,也可以用来执行完全或不完全的数据库恢复。RMAN有三种不同的用户接口:COMMAND LINE方式、GUI 方式(集成在OEM 中的备份管理器)、API 方式(用于集成到第三方的备份软件中)。具有如下特点:
1)功能类似物理备份,但比物理备份强大N倍,从下面的特点可以看到;
2)可以压缩空块;
3)可以在块水平上实现增量;
4)可以把备份的输出打包成备份集,也可以按固定大小分割备份集;
5)备份与恢复的过程可以自动管理;
6)可以使用脚本(存在Recovery catalog 中)
7)可以做坏块监测二、相关术语解释
1)Backup sets 备份集
备份集顾名思义就是一次备份的集合,它包含本次备份的所有备份片,以oracle专有的格式保存。一个备份集根据备份的类型不同,可能构成一个完全备份或增量备份。
2)Backup pieces 备份片
一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制, 备份集就只由一个备份片构成。备份片的大小不能大于你的文件系统所支持的文件长度的最大值。
3)Image copies 映像备份
映像备份不压缩、不打包、直接COPY 独立文件(数据文件、归档日志、控制文件),类似操作系统级的文件备份。而且只能COPY 到磁盘,不能到磁带。可以作为增量备份的0级,一般用来备份控制文件。
4)Full backup 全备份
全备份是指对数据文件中使用过的数据块进行备份,没有使用过的数据块是不做备份的,也就是说,RMAN 进行备份是进行压缩的。
5)Incremental backup 增量备份
增量备份是指备份数据文件中自从上一次同一级别的或更低级别的备份以来被修改过的数据块。与完全备份相同,增量备份也进行压缩。增量备份虽然概念很好,备份也很简单,但恢复起来却是另外一回事,不仅麻烦而且容易出错,所以实际中越来越少使用,到了Oracle 9i已经建议不再使用,以后版本会逐渐取消对增量备份的支持。
6)Recovery catalog 恢复目录
恢复目录用于记录RMAN 使用过程中的控制信息,恢复目录应该经常被同步(这在后面会讲到)。尽管我们可以使用nocatalog 方式来使用RMAN,此时控制信息记录在目标数据库的控制文件中,但这样毕竟不安全,因为一旦目标数据库的控制文件损坏就意味着所有的RMAN 备份失效。同样的道理恢复目录应该建立在另外一个数据库中,在下面的例子中我们称作“目录数据库”。三、创建恢复目录
1、在目录数据库中创建恢复目录所用表空间
SQL> create tablespace rmants datafile 'c:\oracle\oradata\cc\rmants.ora' size 20M ;
表空间已创建。
2、在目录数据库中创建RMAN 用户并授权
SQL> create user rman identified by rman default tablespace rmants temporary tablespace temp quota
unlimited on rmants;
用户已创建
SQL> grant recovery_catalog_owner to rman ;
授权成功。
3、在目录数据库中创建恢复目录
C:\>rman catalog rman/rman
恢复管理器:版本8.1.7.0.0 - Production
RMAN-06008:连接到恢复目录数据库
RMAN-06428:未安装恢复目录
RMAN>create catalog tablespace rmants;
RMAN-06431:恢复目录已创建
4、注册目标数据库到恢复目录
注意哦,这里我的目标数据库使用的服务名称是rman,意思为要使用RMAN 进行备份的数据库,而目录
数据库使用的服务名称是CC。
C:\>rman target sys/sys@rman
恢复管理器:版本8.1.7.0.0 - Production
RMAN-06005:连接到目标数据库:RMAN (DBID=1303772234)
RMAN>connect catalog rman/rman@cc
RMAN-06008:连接到恢复目录数据库
RMAN>register database;
RMAN-03022:正在编译命令:register
RMAN-03023:正在执行命令:register
RMAN-08006:注册在恢复目录中的数据库
RMAN-03023:正在执行命令:full resync
RMAN-08002:正在启动全部恢复目录的resync
RMAN-08004:完成全部resync
好了,到此为止前面的准备工作都做好了,下面就可以使用RMAN 来进行备份和恢复了。四、使用RMAN
下面通过具体的例子来说明RMAN 的使用,这里会涉及到除了恢复以外的所有RMAN 操作,关于使用RMAN 进行恢复的内容请参考我以前写的另外一篇文章:RMAN 恢复实践。
1、备份整个数据库
RMAN>run {
2> allocate channel c1 type disk;
3> backup database format 'e:\dbbackup\2db.dmp';
4> }
2、复制数据文件
RMAN>run {
2> allocate channel c1 type disk;
3> copy datafile 'c:\oracle\oradata\rman\users01.dbf' to 'e:\dbbackup\u.dbf' tag
=u1215;
4> }

解决方案 »

  1.   

    3、查看备份及复制的信息
    RMAN>list backup;
    RMAN-03022:正在编译命令:list
    备份集列表
    关键字Recid 标记LV 集合标记集合计数完成时间
    ------- ---------- ---------- -- ---------- ---------- ----------------------
    216 1 417347013 0 417346992 1 26-12 月-00
    备份段列表
    关键字Pc# Cp# 状态完成时间段名
    ------- --- --- ----------- ---------------------- ------------------------
    217 1 1 AVAILABLE 26-12 月-00 E:\DBBACKUP\2DB.DMP
    数据文件包括列表
    文件名称LV 类型检查点SCN 检查点时间
    ---- ------------------------------------- -- ---- ---------- -------------
    1 C:\ORACLE\ORADATA\RMAN\SYSTEM01.DBF 0 Full 33224 26-12 月-00
    2 C:\ORACLE\ORADATA\RMAN\RBS01.DBF 0 Full 33224 26-12 月-00
    3 C:\ORACLE\ORADATA\RMAN\USERS01.DBF 0 Full 33224 26-12 月-00
    4 C:\ORACLE\ORADATA\RMAN\TEMP01.DBF 0 Full 33224 26-12 月-00
    5 C:\ORACLE\ORADATA\RMAN\TOOLS01.DBF 0 Full 33224 26-12 月-00
    6 C:\ORACLE\ORADATA\RMAN\INDX01.DBF 0 Full 33224 26-12 月-00
    RMAN>list copy of datafile 'c:\oracle\oradata\rman\users01.dbf';
    RMAN-03022:正在编译命令:list
    数据文件备份列表
    关键字文件状态完成时间检查点SCN 检查点时间名称
    ------- ---- - --------------- ---------- --------------- ------
    226 3 A 26-12 月-00 33226 26-12 月-00 E:\DBBACKUP\U.DBF
    4、在备份是设置相关参数
    format --文件输出格式,
    %d--database name,
    %s--backup sets sequence number,
    %p--backup pieces sequence number
    filesperset --每个备份集中所包括的文件数
    更多参数请参考本文开始时列出的书。
    RMAN>run {
    2> allocate channel c1 type disk;
    3> set limit channel c1 kbytes 8000;
    4> backup
    5> format 'e:\dbbackup\db_%d_%s_%p.bck'
    6> (database filesperset=2 );
    7> }
    RMAN-03022:正在编译命令:allocate
    RMAN-03023:正在执行命令:allocate
    RMAN-08030:分配的通道:c1
    RMAN-08500:通道c1:sid=9 devtype=DISK
    RMAN-03022:正在编译命令:set limit
    RMAN-03023:正在执行命令:set limit
    RMAN-03022:正在编译命令:backup
    RMAN-03023:正在执行命令:backup
    RMAN-08008:通道c1:正在启动full 数据文件备份集
    RMAN-08502:set_count=6 set_stamp=417351064 creation_time=26-12 月-00
    RMAN-08010:通道c1:正在指定备份集中的数据文件
    RMAN-08522:输入数据文件fno=00003 name=C:\ORACLE\ORADATA\RMAN\USERS01.DBF
    RMAN-08522:输入数据文件fno=00005 name=C:\ORACLE\ORADATA\RMAN\TOOLS01.DBF
    RMAN-08013:通道c1:已创建1 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_6_1.BCK comment=NONE
    RMAN-08525:备份集完成,经过时间:00:00:03
    RMAN-08008:通道c1:正在启动full 数据文件备份集
    RMAN-08502:set_count=7 set_stamp=417351067 creation_time=26-12 月-00
    RMAN-08010:通道c1:正在指定备份集中的数据文件
    RMAN-08522:输入数据文件fno=00002 name=C:\ORACLE\ORADATA\RMAN\RBS01.DBF
    RMAN-08522:输入数据文件fno=00006 name=C:\ORACLE\ORADATA\RMAN\INDX01.DBF
    RMAN-08013:通道c1:已创建1 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_7_1.BCK comment=NONE
    RMAN-08525:备份集完成,经过时间:00:00:04
    RMAN-08008:通道c1:正在启动full 数据文件备份集
    RMAN-08502:set_count=8 set_stamp=417351071 creation_time=26-12 月-00
    RMAN-08010:通道c1:正在指定备份集中的数据文件
    RMAN-08522:输入数据文件fno=00001 name=C:\ORACLE\ORADATA\RMAN\SYSTEM01.DBF
    RMAN-08011:备份集中包括当前控制文件
    RMAN-08013:通道c1:已创建1 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_1.BCK comment=NONE
    RMAN-08013:通道c1:已创建2 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_2.BCK comment=NONE
    RMAN-08013:通道c1:已创建3 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_3.BCK comment=NONE
    RMAN-08013:通道c1:已创建4 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_4.BCK comment=NONE
    RMAN-08013:通道c1:已创建5 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_5.BCK comment=NONE
    RMAN-08013:通道c1:已创建6 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_6.BCK comment=NONE
    RMAN-08013:通道c1:已创建7 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_8_7.BCK comment=NONE
    RMAN-08525:备份集完成,经过时间:00:00:19
    .... ....
    RMAN-08008:通道c1:正在启动full 数据文件备份集
    RMAN-08502:set_count=9 set_stamp=417351090 creation_time=26-12 月-00
    RMAN-08010:通道c1:正在指定备份集中的数据文件
    RMAN-08522:输入数据文件fno=00004 name=C:\ORACLE\ORADATA\RMAN\TEMP01.DBF
    RMAN-08013:通道c1:已创建1 段
    RMAN-08503:段handle=E:\DBBACKUP\DB_RMAN_9_1.BCK comment=NONE
    RMAN-08525:备份集完成,经过时间:00:00:07
    RMAN-03023:正在执行命令:partial resync
    RMAN-08003:启动部分恢复目录的resync
    RMAN-08005:完成部分resync
    RMAN-08031:释放的通道:c1
    5、使用脚本功能
    使用脚本的目的在于方便我们操作中的方便,操作上和存储过程相似。
    RMAN>create script l0dbbackup {
    2> allocate channel c1 type disk;
    3> backup
    4> format 'e:\dbbackup\db_%d_%s_%p.bck'
    5> (database filesperset=2 );
    6> }
    RMAN-03022:正在编译命令:create script
    RMAN-03023:正在执行命令:create script
    RMAN-08085:已创建脚本l0dbbackup
    RMAN>run {execute script l0dbbackup; }
     
      

  2.   

    这篇文章 也是去年写的,最初发表在原来的个人网站上,收录在旧版文集中,可能很多没有看到,总有人写信要,今天乘改版之际就把它单独拿出来了。(gototop 2003.6.24注)无论是看书还是在网上看别人写的关于数据库备份与恢复的文章,大多数都是讲如何进行备份,而真正考验DBA的恢复却很少有人写,不知道是为什么。我们都常说备份是管理,而恢复才是技术,今天就让我们来共同探讨一下Oracle 数据库的恢复技术。如果各位网友有兴趣可以和我联系。关键词:Oracle、恢复、RMAN 谈恢复肯定离不开备份,不过今天我们的重点不在于此,我在在这里将备份分为两类:操作系统备份和数据库备份,而数据库备份工作我们大部分都是用RMAN 来做。对于使用RMAN 我强烈建议使用catalog mode。测试环境:WIN2K ADV+ORACLE817RMAN:target database named ORA,catalog database named RCVDB 一、Control file的恢复说明:RMAN 的备份必须在catalog mode下进行,否则备份了control file也没有用;但即使是这样有时候可能还会出现很多问题。建议:control file 用SQL或操作系统的方式做备份和恢复。1、RMAN备份的恢复备份:run {allocate channel c1 type disk;backup current controlfile;}恢复:run {allocate channel c1 type disk;restore controlfile to '/oracle/oradata/ora/control01.ctl';replicate controlfile from '/oracle/oradata/ora/control01.ctl';restore database;sql 'alter database mount';recover database until cancel;sql 'alter database open resetlogs';release channel c1;}使用resetlogs之后需在catalog database 上进行reset database,原有备份信息将不可用,所以要及时进行新的完全备份。2、SQL备份的恢复备份:alter database backup controlfile to trace;恢复:先将数据库shutdown,然后从备份所产生的trace文件中拷出创建恢复所用的SQL执行一遍即可。如果你之前没有做这样的备份那也没关系,形式如下你可以照着写一个:#--------------------------------BEGIN-----------------------------------------# The following commands will create a new control file and use it# to open the database.# Data used by the recovery manager will be lost. Additional logs may# be required for media recovery of offline data files. Use this# only if the current version of all online logs are available.STARTUP NOMOUNTCREATE CONTROLFILE REUSE DATABASE "ORA" NORESETLOGSNOARCHIVELOGMAXLOGFILES 32MAXLOGMEMBERS 2MAXDATAFILES 32MAXINSTANCES 16MAXLOGHISTORY 680LOGFILEGROUP 1 ('C:\ORACLE\ORADATA\ORA\REDO01.LOG','C:\ORACLE\ORADATA\ORA\REDO01_1.LOG') SIZE 1M,GROUP 2 ('C:\ORACLE\ORADATA\ORA\REDO02.LOG','C:\ORACLE\ORADATA\ORA\REDO02_1.LOG') SIZE 1M,GROUP 3 ('C:\ORACLE\ORADATA\ORA\REDO03_1.LOG','C:\ORACLE\ORADATA\ORA\REDO03_2.LOG') SIZE 1MDATAFILE'C:\ORACLE\ORADATA\ORA\SYSTEM01.DBF','C:\ORACLE\ORADATA\ORA\RBS01.DBF','C:\ORACLE\ORADATA\ORA\USERS01.DBF','C:\ORACLE\ORADATA\ORA\TEMP01.DBF','C:\ORACLE\ORADATA\ORA\TOOLS01.DBF','C:\ORACLE\ORADATA\ORA\INDX01.DBF'CHARACTER SET ZHS16GBK;# Recovery is required if any of the datafiles are restored backups,# or if the last shutdown was not normal or immediate.RECOVER DATABASE# Database can now be opened normally.ALTER DATABASE OPEN;#----------------------------------END-----------------------------------------3、OS 备份的恢复备份:OS copy恢复:OS copy回来即可,要注意的是这个备份必须是最新有效的。二、Database的恢复A、To restore the database from host_a to host_b with the same file system#此处使用recovery catalog;#如果不是catalog mode,就用OS COPY直接将control file#copy过来并mount database。1、copy the init.ora file from host_a to host_b using o/s utility2、rman target sys/sys@host_b catalog rman/rman@rcat3、startup nomount4、run {allocate channel c1 type disk;restore controlfile;sql ‘alter database mount’;}5、select min(scn) from (select max(next_change#) scn from v$archived_loggroup by thread#);6、run {set until scn=500; #use appropriate SCN for incomplete recoveryallocate channel c1 type ‘sbt_type’;restore database;recover database;sql ‘alter database open resetlogs’;}B、To restore the database from host_a to host_b with a different filesystem步骤和A差不多,不同的是在启动数据库之前要修改init.ora文件中所有和路径相关的参数,如:*_DEST,*_PATH 等。然后执行如下脚本:run {set until scn=500;allocate channel c1 type disk;set newname for datafile 1 to ‘/disk’/%U’;set newname for datafile 2 to ‘/disk’/%U’;set newname for datafile 3 to ‘/disk’/%U’;set newname for datafile 4 to ‘/disk’/%U’;set newname for datafile 5 to ‘/disk’/%U’;set newname for datafile 6 to ‘/disk’/%U’;set newname for datafile 7 to ‘/disk’/%U’;sql ‘alter database mount’;restore database;switch datafile all; #points the control file to the renamed datafilesrecover database;.... ....sql ‘alter database open resetlogs’;}三、Tablespace and datafile的恢复run {allocate channel c1 type disk;sql ‘alter tablespace users offline immediate’; #must be in archive log mode#如下改变datafile位置set newname for datafile 'c:/oracle/oradata/ora/users01.dbf'to 'c:/oracle/oradata/orabk/user01.dbf';restore tablespace users;switch datafile all;recover tablespace users;sql ‘alter tablespace users online’;}如果不在archive log mode下,执行以上SQL时会出错:ORA-01145。你将不得不shutdown。四、关于set until 选项set until后面可以跟time、scn和logseq三个不同的选项,当数据库运行在noarchivelogmode 下时可以使用until cancel选项进行数据库的不完全恢复。所有这些的具体过程和以上的数据库恢复都差不多,不再赘述。