3.备份集和备份片
有一些基本的rman的基本概念需要了解,否则无法正常的使用和理解rman脚本:
3.1 备份集
顾名思义就是一次备份的集合,它包含本次备份的所有备份片,以oracle专有的格式保存。一个备份集根据备份的类型不同,可能构成一个完全备份或增量备份。
3.2 备份片
一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制,备份集就只由一个备份片构成。备份片的大小不能大于你的文件系统所支持的文件长度的最大值。
RMAN的备份文件可以是由许多备份片组成的一个备份集,也就是说一次备份产生多个备份文件,不同于EXP只有一次备份只生成一个DMP备份文件。
3.3 通道
通道(Channel)可以看作是一个IO的进程,所以多通道的方式一般是提供RMAN的backup的并行度,对于多IO支持的设备,效果明显。我们可以用allocate channel来给他们分配通道,默认情况下RMAN只有一个通道,我们可以通过执行多个allocate channel命令来分配多个通道。
4.使用RMAN进行备份
4.1 备份数据文件
为了更好的区别备份片,我们在备份数据文件的时候,最好单独指定备份片的格式,通过format方式指定备份集的路径和备份格式,如下,我们把备份集放在/oradata/rman/backupset目录下,我们这里指定的备份集的格式为dbfull_%d_%u_%p_%s.bak:
RMAN>backup database tag 'dbfullbackup' format '/oradata/rman/backupset/dbfull_%d_%u_%p_%s.bak' ---备份整个数据库
Starting backup at 11-MAY-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=1621 instance=orcl1 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00006 name=+DATE/orcl/datafile/zl9indexcis.dbf
input datafile fno=00005 name=+DATE/orcl/datafile/undotbs2.300.782241163
input datafile fno=00002 name=+DATE/orcl/datafile/undotbs1.301.782241003
input datafile fno=00007 name=+DATE/orcl/datafile/zl9cisrec.dbf
input datafile fno=00001 name=+DATE/orcl/datafile/system.260.782241001
input datafile fno=00003 name=+DATE/orcl/datafile/sysaux.267.782241003
input datafile fno=00004 name=+DATE/orcl/datafile/users.263.782241003
channel ORA_DISK_1: starting piece 1 at 11-MAY-12
在没有分配通道的情况下,RMAN会自动分配一个通道,如上面红色部分就是在分配通道。上面备份集格式中的%d_%u_%p_%s是RMAN定义的一些备份保存格式,具体的解释如下:
%c 备份片的拷贝数
%d 数据库名称
%D 位于该月中的第几天 (DD)
%M 位于该年中的第几月 (MM)
%F 一个基于DBID唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为日期,QQ是一个1-256的序列
%n 数据库名称,向右填补到最大八个字符
%u 一个八个字符的名称代表备份集与创建时间
%p 该备份集中的备份片号,从1开始到创建的文件数
%U 一个唯一的文件名,代表%u_%p_%c
%s 备份集的号
%t 备份集时间戳
%T 年月日格式(YYYYMMDD)
4.2 备份归档日志
为了防止归档日志被人为删除,我们在备份的时候可以考虑把归档日志一起备份,但是这要求备份预留空间要足够大,另外为了考虑DATAGUARD的需要,不建议备份完了就马上删除归档,而是保留一定的冗余,下面的语句为备份归档的命令。一般情况下,我们都要求不能直接删除归档日志,删除前进行备份:
RMAN>backup archivelog all format '/oradata/rman/backupset/arc_%U.bak'
4.3 重命名数据文件
在很多时候,由于备份和恢复的数据文件路径不一致,我们在恢复的时候需要通过RMAN重命名数据文件,方法如下
set newname for datafile<旧名称> to <新名称>
如我们想把RAC下ASM的数据文件恢复到单实例的文件系统中,我们就需要通过set newname for 对路径进行修改,如下:
RMAN> run {
2> set newname for datafile 6 to '/u01/oradata/orcl/ zl9indexcis.dbf';
3> restore database;
4> }
这里的datafile后的6是这个文件的编号,我们可以通过前面的备份的log文件中查找,如下,也可以通过v$datafile视图进行查询。
5.过期备份
对于RMAN备份集有EXPIRED和OBSOLETE两个状态,他们分别代表不同的含义,下面分别介绍下。
5.1 EXPIRED状态
对于EXPIRED状态的产生,与crosscheck命令是密切相关的,RMAN通过crosscheck命令检查备份是否存在于备份介质上,如果不存在,则状态由AVAILABLE改为EXPIRED,也就是说EXPIRED表示该备份集介质不存在。
其中状态的更新是通过crosscheck进行交叉校验,并更新备份集合的状态,状态的查询通过list命令进行查询,如下,我们手工删除一个备份集,在没有交叉校验时,该备份集的状态为AVAILABLE,如下例:
RMAN> list backup of database;---列出备份集
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1 Full 3.74G DISK 00:30:54 11-MAY-12
BP Key: 1 Status:AVAILABLE Compressed: NO Tag: DBFULLBACKUP
Piece Name: /u01/dbfull_ORCL_01nanpe8_1_1.bak
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 14997814 11-MAY-12 +DATE/orcl/datafile/system.260.782241001
2 Full 14997814 11-MAY-12 +DATE/orcl/datafile/undotbs1.301.782241003
3 Full 14997814 11-MAY-12 +DATE/orcl/datafile/sysaux.267.782241003
4 Full 14997814 11-MAY-12 +DATE/orcl/datafile/users.263.782241003
5 Full 14997814 11-MAY-12 +DATE/orcl/datafile/undotbs2.300.782241163
6 Full 14997814 11-MAY-12 +DATE/orcl/datafile/zl9indexcis.dbf
7 Full 14997814 11-MAY-12 +DATE/orcl/datafile/zl9cisrec.dbf
RMAN> crosscheck backup of database;---交叉校验备份集
using channel ORA_DISK_1
crosschecked backup piece: found to be 'EXPIRED'
backup piece handle=/u01/dbfull_ORCL_01nanpe8_1_1.bak recid=1 stamp=783018922
RMAN> list backup of database;---再次列出备份集
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1 Full 3.74G DISK 00:30:54 11-MAY-12
BP Key: 1 Status:EXPIRED Compressed: NO Tag: DBFULLBACKUP
Piece Name: /u01/dbfull_ORCL_01nanpe8_1_1.bak
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 14997814 11-MAY-12 +DATE/orcl/datafile/system.dbf
2 Full 14997814 11-MAY-12 +DATE/orcl/datafile/undotbs1.dbf
3 Full 14997814 11-MAY-12 +DATE/orcl/datafile/sysaux.dbf
4 Full 14997814 11-MAY-12 +DATE/orcl/datafile/users.dbf
5 Full 14997814 11-MAY-12 +DATE/orcl/datafile/undotbs2.dbf
6 Full 14997814 11-MAY-12 +DATE/orcl/datafile/zl9indexcis.dbf
7 Full 14997814 11-MAY-12 +DATE/orcl/datafile/zl9cisrec.dbf
因此,真实的反应备份集介质是否存在,必须先对备份集进行校验,才能得到真实的结果。
5.2 OBSOLETE状态
对于obsolete状态,是针对RMAN备份保留策略来说的,超过了这个保留策略的备份,会被标记为obsolete,但其状态依旧为AVAILABLE,我们可以使用report obsolete来查看已废弃的备份。例如如果保留策略冗余数为1,如果有2个完整的备份集,则较早的一个备份集,就会被标记为obsolete。
6.备份脚本举例
前面对一些备份的关键点进行了讲解,接下来我们以一个实际环境中的备份脚本,给他们进行直观的讲解,rman的备份脚本是通过run {…}脚本进行定义,示例如下:
run
{
allocate channel c1 type disk; ---分配通道c1
allocate channel c2 type disk; ---分配通道c2
allocate channel c3 type disk; ---分配通道c3
allocate channel c4 type disk; ---分配通道c4
sql 'alter system archive log current'; ---备份前强制归档,为了保持文件头一致
backup database tag 'dbfullbackup' format '/oradata/rman/backupset/dbfull_%d_%u_%p_%s.bak' ; ---全库备份数据文件
backup current controlfile format '/oradata/rman/backupset/ctl_%d_%T_%s';
---备份当前控制文件
backup archivelog all format '/oradata/rman/backupset/arc_%U.bak';
---备份归档日志
crosscheck archivelog all; ---对当前归档日志进行检查,交叉校验,更新归档状态
crosscheck backup of database; ---对已经有的备份集进行检查,交叉校验,更新备份集状态
delete expired backup; ---删除expired状态的备份集
delete obsolete redundancy=1; ---删除冗余备份集
release channel c1;---关闭通道c1
release channel c2;---关闭通道c2
release channel c3;---关闭通道c3
release channel c4;---关闭通道c4
}
7.案例
接下来我们就通过一个案例对RMAN的备份和恢复进行详细的演示和讲解,实施这个案例有两个前提条件:
1.一台配置不太差的备用服务器;还需要保证与生产环境相同的物理空间。
2.数据库处于归档模式,关于如何将数据库设置为归档模式,请参考前文。
整个过程大致有以下几个步骤:
1.在生产库上使用RMAN进行全库备份,例如:
C:\Users\wzy>rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Tue May 1514:53:472012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connectedto target database: SOURCE (DBID=2877619169)
RMAN> run
2> {
3> allocate channel c1 type disk;
4> allocate channel c2 type disk;
5> allocate channel c3 type disk;
6> allocate channel c4 type disk;
7> backup database format 'd:\backup\dbfull_%d_%s_%U.bak' ;
8> release channel c1;
9> release channel c2;
10> release channel c3;
11> release channel c4;
12> }
released channel: ORA_DISK_1
released channel: ORA_DISK_2
allocated channel: c1
channel c1: sid=142 devtype=DISK
allocated channel: c2
channel c2: sid=141 devtype=DISK
allocated channel: c3
channel c3: sid=140 devtype=DISK
allocated channel: c4
channel c4: sid=139 devtype=DISK
Starting backup at 15-MAY-12
channel c1: starting full datafile backupset
channel c1: specifying datafile(s) in backupset
input datafile fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\SYSTEM01.DBF
channel c1: starting piece 1 at 15-MAY-12
channel c2: starting full datafile backupset
channel c2: specifying datafile(s) in backupset
input datafile fno=00002
……省略部分内容..
channel c3: backup set complete, elapsed time: 00:00:02
Finished backup at 15-MAY-12
released channel: c1
released channel: c2
released channel: c3
released channel: c4
2.备份控制文件,也可以与第一步全并到一起,但一定要在数据文件备份完成以后,因为我们使用的是控制文件来代替catalog,控制文件只在数据文件备份完成后,才会包括数据文件的备份情况。
RMAN> backup current controlfile format 'd:\backup\ctl_%d_%U.bak';
Starting backup at 15-MAY-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=142 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=141 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current control file in backupset
channel ORA_DISK_1: starting piece 1 at 15-MAY-12
channel ORA_DISK_1: finished piece 1 at 15-MAY-12
piece handle=D:\BACKUP\CTL_SOURCE_3MNB25JN_1_1.BAK tag=TAG20120515T151919 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 15-MAY-12
我们来查看一下生成的备份文件集:
CTL_SOURCE_3MNB25JN_1_1.BAK为控制文件备份集文件,其他的为数据文件备份集文件。
3.在应急/备份服务器还原数据库。
将数据文件和控制文件备份传输到备份服务器上,如果都是windows服务器,可以直接使用操作系统的复制/粘贴,如果是Unix/Linux服务器,可以使用ftp/sftp工具进行文件传输。注意备份的存储目录与生产环境保持一致。
4.在应急/备份服务器还原数据库。
应急/备份服务器需要安装与生产库相同版本的Oracle数据库,且建立一个数据库名称相同的空实例。建立空实例的最简的方法就是使用dbca建立实例后,将数据库关闭,并删除所有的数据文件,但注意要保留目录。
接下来将空实例启动到nomount状态:
SQL> connect / as sysdba;
Connected to an idle instance.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 293601280 bytes
Fixed Size 1296332 bytes
Variable Size 134219828 bytes
Database Buffers 150994944 bytes
Redo Buffers 7090176 bytes
接下来,需要恢复控制文件:
C:\Users\wzy>rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Tue May 15 15:33:12 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: source (not mounted)
RMAN> restore controlfile from 'D:\backup\CTL_SOURCE_3MNB25JN_1_1.BAK';
Starting restore at 15-MAY-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=157 devtype=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:04
output filename=D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\CONTROL01.CTL
output filename=D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\CONTROL02.CTL
output filename=D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\CONTROL03.CTL
Finished restore at 15-MAY-12
这个时候我们就能在目录中看到控制文件了:
恢复了控制文件了,数据库就可以mount了,在rman中将数据库置于mount状态:
RMAN> sql 'alter database mount';
sql statement: alter database mount
released channel: ORA_DISK_1
使用restore命令还原数据库:
RMAN> restore database;
Starting restore at 15-MAY-12
Starting implicit crosscheck backup at 15-MAY-12
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=155 devtype=DISK
Crosschecked 31 objects
Crosschecked 9 objects
Finished implicit crosscheck backup at 15-MAY-12
Starting implicit crosscheck copy at 15-MAY-12
using channel ORA_DISK_1
using channel ORA_DISK_2
Finished implicit crosscheck copy at 15-MAY-12
searching for all files in the recovery area
cataloging files...
cataloging done
List of Cataloged Files
=======================
File Name: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_22_7V4188KN_.ARC
File Name: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_23_7V4189J4_.ARC
File Name: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_24_7V418HN6_.ARC
File Name: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_25_7V418K13_.ARC
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00002 to D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\UNDOTBS01.DBF
channel ORA_DISK_1: reading from backup piece D:\BACKUP\DBFULL_SOURCE_113_3HNB25EN_1_1.BAK
channel ORA_DISK_2: starting datafile backupset restore
channel ORA_DISK_2: specifying datafile(s) to restore from backup set
restoring datafile 00003 to D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\SYSAUX01.DBF
channel ORA_DISK_2: reading from backup piece
……省去若干内容..…
channel ORA_DISK_2: restore complete, elapsed time: 00:00:40
Finished restore at 15-MAY-12
可以看到,我们只需要简单的敲入restore database命令,RMAN工具就会自动将数据文件还原到正确的文件夹中了:
虽然备份数据库虽然有了数据文件和控制文件,但是不能打开的,只能在mount状态,因为我们的物理备份是“热备份”,各个数据文件之间是“不一致”的。我现在需要做的就是等待,等到正式升级时,将物理备份到正式升级之间的归档日志拷贝到备份服务器进行“应用”,也就是通常所说的“恢复”操作。
将物理备份到关闭了生产数据库之间的归档日志传输到备份服务器上,并应用这部分日志来完成恢复。如果是Unix或Linux服务器,可以使用ftp工具或scp/rcp远程拷贝命令。
注意一定将归档日志传输到备份数据库的归档目录,否则在恢复时需要指定归档日志路径。
5.在备份数据库执行恢复操作。
将归档日志传输到备份数据库归档目录后,就可以执行recovery操作了,由于我们执行的是“不完全恢复”,需要使用resetlogs方式打开数据库;同时控制文件是在归档日志产生之前还原的,需要使用using backup controlfile选项:
SQL> connect / as sysdba;
Connected.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 2673694 generated at 05/15/2012 15:16:39 needed for thread 1
ORA-00289: suggestion :
D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_22_%U_.ARC
ORA-00280: change 2673694 for thread 1 is in sequence #22
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
Auto
使用基于取消的方式进行恢复,使用的命令是:
recover database until cancel using backup controlfile;
Oracle会提示我们如何指定归档日志,我们这里输入’AUTO’,让Oracle自己去找合适的归档日志文件。如果我们的没有将归档日志拷到正确的目录,必须手工输入归档日志文件名。
输入auto后,Oracle就会自动开始恢复:
ORA-00279: change 2675406 generated at 05/15/2012 15:26:00 needed for thread 1
ORA-00289: suggestion :D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_23_%U_.ARC
ORA-00280: change 2675406 for thread 1 is in sequence #23
ORA-00278: log file'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_22_7V4188KN_.ARC' no longer needed for this recovery
ORA-00279: change 2675408 generated at 05/15/2012 15:26:01 needed for thread 1
ORA-00289: suggestion :D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_24_%U_.ARC
ORA-00280: change 2675408 for thread 1 is in sequence #24
ORA-00278: log file'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_23_7V4189J4_.ARC' no longer needed for this recovery
ORA-00279: change 2675413 generated at 05/15/2012 15:26:07 needed for thread 1
ORA-00289: suggestion :D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_25_%U_.ARC
ORA-00280: change 2675413 for thread 1 is in sequence #25
ORA-00278: log file'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_24_7V418HN6_.ARC' no longer needed for this recovery
ORA-00279: change 2675416 generated at 05/15/2012 15:26:08 needed for thread 1
ORA-00289: suggestion :D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_26_%U_.ARC
ORA-00280: change 2675416 for thread 1 is in sequence #26
ORA-00278: log file'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_25_7V418K13_.ARC' no longer needed for this recovery
ORA-00308: cannot open archived log'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\SOURCE\ARCHIVELOG\2012_05_15\O1_MF_1_26_%U_.ARC'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系统找不到指定的文件。
最后Oracle会报一个错误,因为我们这里执行的是“不完全恢复”,这个错误不用去管他。
使用resetlogs方式打开数据库:
SQL> alter database open resetlogs;
Database altered.
SQL>
至此主要的工作就已经完成了,数据库中的数据就与生产库完全一样了。但如果我们要真正使用这个数据库,还需要添加临时文件(temp file),因为rman是不备份临时文件的;只需要直接添加即可。
SQL> alter tablespace temp add tempfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SOURCE\TEMP02.DBF' size 40m ;
8.结语
通过本文的介绍,详细大家对RMAN的备份和恢复有了详细的了解,RMAN作为ORACLE推荐的备份和恢复工具在使用中有非常大的优势,建议大家以后在日常工作中多加应用,一定会带来理想的效果。