RAC环境的备份、恢复和普通数据库的备份、恢复是有一些区别的。这个区别主要体现在RAC环境的特殊性上。根据Oracle的RAC环境的不同,RMAN备份、恢复操作也是不同的。如果RAC环境是建立在CLUSTER文件系统上的,或者是建立在ASM上的,那么备份和恢复过程可能会很简单,基本上和普通的数据库环境没有太多的区别。如果RAC环境是建立在裸设备上的,由于归档日志无法存储在裸设备上,那么归档日志文件必须放在多个节点的本地硬盘上,这时备份和恢复就变得和普通的数据库环境有所差异。
1. 这里先讨论一下ASM环境上建立的RAC数据库的备份。如果将归档日志放在ASM上,那么两个节点都是可以备份的,这个时候,备份和普通的单实例数据库没有差别。
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST_1 ------------------------------------ ----------- ------------------------------ log_archive_dest_1 string LOCATION=+DISK/testrac/
$ rman target /
RMAN> configure channel device type disk format '/data1/backup/%U';
RMAN> backup database plus archivelog delete all input;数据库的恢复也很简单,先修改一些数据:
SQL> CONN TEST/TEST已连接。 SQL> SELECT COUNT(*) FROM T;
COUNT(*) ---------- 0
SQL> INSERT INTO T SELECT ROWNUM FROM DBA_OBJECTS;已创建51880行。
SQL> COMMIT;提交完成。下面开始还原和恢复:
$ rman target /
RMAN> startup mount RMAN> restore database; RMAN> restore archivelog sequence between 134 and 136 thread 1; ====这个可以省略 RMAN> restore archivelog sequence between 56 and 58 thread 2; ====这个可以省略 RMAN> recover database; RMAN> alter database open;检查恢复是否已经完成:
$ sqlplus "/ as sysdba"
SQL> startup SQL> CONN TEST/TEST已连接。 SQL> SELECT COUNT(*) FROM T;
COUNT(*) ---------- 51880
===说明
restore archivelog all会恢复所有的归档。其实对于分rac数据库,根本没有必要去restore archivelog,直接recover,Oracle自动会去找到合适的archivelog去恢复。
2. 基于裸设备的RAC环境下的备份。对于建立在裸设备上的RAC环境,由于归档不能存放到裸设备上,因此,所有的归档都必须保存在本地的磁盘上。直接通过RMAN备份会导致错误。首先模仿裸设备的情况,修改原来LOG_ARCHIVE_DEST_1的配置,将每个实例的归档改在本地硬盘:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data1/archivelog' SID ='testrac1';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data1/archivelog' SID ='testrac2';然后尝试直接备份数据库:
$ rman target /
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> backup database plus archivelog delete all input; 5> }使用目标数据库控制文件替代恢复目录分配的通道: c1通道 c1: sid=301 实例=testrac1 devtype=DISK启动 backup 于 11-5月 -07当前日志已存档释放的通道: c1 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: backup plus archivelog 命令 (在 05/11/2007 16:08:09 上) 失败 RMAN-06059: 没有找到预期的归档日志, 归档日志的丢失将影响可恢复性 ORA-19625: 识别文件/data1/archivelog/2_89_618591128.dbf时出错 ORA-27037: 无法获得文件状态 SVR4 Error: 2: No such file or directory Additional information: 3
RMAN>由于节点1上无法访问到节点2上的归档,所以出现了上面的错误。对于这种情况,可以使用带CONNECT语句的ALLOCATE来分配CHANNEL:
RMAN> run 2> {3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> backup database plus archivelog delete all input; 6> }
RMAN>采用这种方法后可以成功的备份。而在恢复之前,需要将数据库关闭,通过rman启动实例并准备恢复:
$srvctl stop db -d testrac下面准备通过RMAN进行数据库的恢复。由于RAC的备份是同时备份到两个节点的本地硬盘上,因此恢复的时候也应该两个节点同时进行RESTORE操作。可以在两个节点上分别启动RMAN,将数据库处于STARTUP MOUNT状态,然后就可以在任意一个节点上执行RESTORE操作:
$ rman target /
RMAN> startup mount
RMAN> exit另一个节点:
$ rman target /
RMAN> startup mount
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> restore database; 6> }如果只启动了RAC的一个节点,则会导致RMAN出现下面的错误:
MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 05/11/2007 17:55:17 上) 失败 RMAN-06026: 有些目标没有找到 - 终止恢复 RMAN-06100: 没有通道来恢复数据文件14的备份或是副本 RMAN-06100: 没有通道来恢复数据文件13的备份或是副本 RMAN-06100: 没有通道来恢复数据文件11的备份或是副本 RMAN-06100: 没有通道来恢复数据文件7的备份或是副本 RMAN-06100: 没有通道来恢复数据文件4的备份或是副本 RMAN-06100: 没有通道来恢复数据文件3的备份或是副本 RMAN-06100: 没有通道来恢复数据文件2的备份或是副本下面恢复归档日志:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> restore archivelog sequence between 179 and 183 thread 1 6> archivelog sequence between 99 and 103 thread 2; 7> }现在面临一个问题,对于还原(RESTORE)操作,可以两个实例同时进行(一个实例mount,一个实例mount+restore),但是对于恢复(RECOVER)操作,只能一个实例完成。 这就要求 一个实例必须能同时看到两个实例的归档日志。可以通过nfs mount等方式来实现,这里采用最简单的方法,将节点2上的归档拷贝到节点1的归档目录下(我们在节点1进行恢复)。
RMAN> host 'rcp 172.25.198.223:/data1/archivelog/* /data1/archivelog';主机命令完成
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> recover database; 6> }
RMAN>如果没有将归档日志文件拷贝到恢复节点上,则会出现下面的错误:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> recover database; 6> }分配的通道: c1通道 c1: sid=313 实例=testrac1 devtype=DISK分配的通道: c2通道 c2: sid=316 实例=testrac2 devtype=DISK启动 recover 于 14-5月 -07正在开始介质的恢复存档日志线程 1 序列 179 已作为文件 /data1/archivelog/1_179_618591128.dbf 存在于磁盘上存档日志线程 1 序列 180 已作为文件 /data1/archivelog/1_180_618591128.dbf 存在于磁盘上存档日志线程 1 序列 181 已作为文件 /data1/archivelog/1_181_618591128.dbf 存在于磁盘上存档日志线程 1 序列 182 已作为文件 /data1/archivelog/1_182_618591128.dbf 存在于磁盘上存档日志线程 1 序列 183 已作为文件 /data1/archivelog/1_183_618591128.dbf 存在于磁盘上存档日志文件名 =/data1/archivelog/1_179_618591128.dbf 线程 =1 序列 =179通道 c2: 正在启动到默认目标的存档日志恢复通道 c2: 正在恢复存档日志存档日志线程 =2 序列=99通道 c2: 正在恢复存档日志存档日志线程 =2 序列=100通道 c2: 正在读取备份段 /data1/backup/2pihmq8b_1_1通道 c2: 已恢复备份段 1段句柄 = /data1/backup/2pihmq8b_1_1 标记 = TAG20070514T112919通道 c2: 恢复完成, 用时: 00:00:25故障转移到上一个备份存档日志文件名 =/data1/archivelog/2_99_618591128.dbf 线程 =2 序列 =99释放的通道: c1释放的通道: c2 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: recover 命令 (在 05/14/2007 15:01:38 上) 失败 RMAN-11003: 在分析/执行 SQL 语句期间失败: alter database recover logfile '/data1/archivelog/2_99_618591128.dbf' ORA-00308: 无法打开归档日志 '/data1/archivelog/2_99_618591128.dbf' ORA-27037: 无法获得文件状态 SVR4 Error: 2: No such file or directory Additional information: 3
4. 带库状态下RAC数据库的备份和恢复
RAC环境备份到带库如果是基于CLUSTER文件系统或者ASM,那么和备份到本地硬盘的区别不大,只需要在安装了带库驱动(备份软件)的节点上进行备份和恢复就可以了。如果是建立在裸设备上的RAC环境,那么最简单的方式是在两个节点上都安装备份软件,这样,每个节点都可以同时进行备份,不但配置简单,而且可以提高备份的效率。
$ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期四 5月 17 09:40:04 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到目标数据库: TESTRAC (DBID=4291216984)
RMAN> { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup database plus archivelog delete all input; }对于带库的恢复过程,首先仍然是先备份现有的所有日志文件:
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup archivelog all delete all input; }对于数据库日志文件的恢复仍然是通过两个实例同时进行(两个instance都在mount状态下):
$ srvctl stop db -d testrac $ srvctl start inst -d testrac -i testrac1 -o mount $ srvctl start inst -d testrac -i testrac2 -o mount
$ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期四 5月 17 13:33:02 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已连接到目标数据库: TESTRAC (DBID=4291216984, 未打开)
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore database; restore archivelog sequence between 205 and 208 thread 1 archivelog sequence between 123 and 126 thread 2; }首先关闭数据库,然后将两个实例都启动到mount状态,然后通过RMAN进行恢复。
RMAN> host 'rcp racnode1:/data1/archivelog/* /data1/archivelog';主机命令完成
RMAN> run { allocate channel c1 device type sbt; recover database; }需要注意的是,如果尝试在一个实例上恢复所有的日志,将会出现类似下面的错误:
RMAN> run { allocate channel c1 device type sbt; allocate channel c2 device type sbt; restore archivelog sequence between 205 and 208 thread 1; restore archivelog sequence between 123 and 126 thread 2; }分配的通道: c1通道 c1: sid=305 实例=testrac2 devtype=SBT_TAPE通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)分配的通道: c2通道 c2: sid=311 实例=testrac2 devtype=SBT_TAPE通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)启动 restore 于 17-5月 -07通道 c1: 正在启动到默认目标的存档日志恢复通道 c2: 正在启动到默认目标的存档日志恢复通道 c1: 正在恢复存档日志存档日志线程 =1 序列=205通道 c2: 正在恢复存档日志存档日志线程 =1 序列=207通道 c2: 正在恢复存档日志存档日志线程 =1 序列=208通道 c2: 正在读取备份段 4jihutok_1_1通道 c1: 正在恢复存档日志存档日志线程 =1 序列=206通道 c1: 正在读取备份段 4hihujs0_1_1故障转移到上一个备份释放的通道: c1释放的通道: c2 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 05/17/2007 16:46:59 上) 失败 RMAN-06026: 有些目标没有找到 - 终止恢复 RMAN-06025: 未找到要恢复的日志线程 1 seq 208 lowscn 4324373343 的备份 RMAN-06025: 未找到要恢复的日志线程 1 seq 207 lowscn 4324334789 的备份 RMAN-06025: 未找到要恢复的日志线程 1 seq 206 lowscn 4324326867 的备份 RMAN-06025: 未找到要恢复的日志线程 1 seq 205 lowscn 4324259225 的备份很多时候,为了性能考虑,会将最近的备份在本地磁盘上保留一段时间。也就是说,在备份的时候,首先备份到本地磁盘上,然后在备份到带库中。但是这种方式对于RAC环境并非是那么简单。由于备份集和Oracle数据库的数据文件、日志文件不同。Oracle并不能区分备份集存储在那个实例的节点上,因此,即使配置了CONNECT连接,在备份时经常会碰到下面的错误:
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup backupset all delete all input; }分配的通道: c1通道 c1: sid=297 实例=testrac1 devtype=SBT_TAPE通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)分配的通道: c2通道 c2: sid=293 实例=testrac2 devtype=SBT_TAPE通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304) ...... RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03009: backup 命令 (unknown 通道上, 在 05/18/2007 14:56:04 上) 失败 RMAN-12009: 由于找不到某些备份片段, 因此命令中止 RMAN-12008: 无法定位备份段 /data1/backup/53ii1lk9_1_1 RMAN-12008: 无法定位备份段 /data1/backup/54ii1lk5_1_1 RMAN-12008: 无法定位备份段 /data1/backup/4vii1knl_1_1 RMAN-12008: 无法定位备份段 /data1/backup/52ii1lbt_1_1 RMAN-12008: 无法定位备份段 /data1/backup/51ii1lbp_1_1 RMAN-12008: 无法定位备份段 /data1/backup/50ii1knh_1_1为了解决这个问题,必须通过crosscheck命令使得Oracle了解结果集的分布情况,完整的步骤如下:
$ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期五 5月 18 16:51:33 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到目标数据库: TESTRAC (DBID=4291216984)
RMAN> run { allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup database plus archivelog delete all input; }备份到磁盘后,开始将磁盘上的备份集备份到带库中:
RMAN> allocate channel for maintenance device type disk format '/data1/backup/%U' connect sys/test@testrac1;
RMAN> crosscheck backupset device type disk;
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; backup backupset all delete all input; }
RMAN> allocate channel for maintenance device type disk format '/data1/backup/%U' connect sys/test@testrac2;
RMAN> crosscheck backupset device type disk;
RMAN> run { allocate channel c2 device type sbt connect sys/test@testrac2; backup backupset all delete all input; }
RMAN>至此,备份集以及成功的备份到带库上。其实本地的备份集如果备份到了带库上,那么就和直接备份到带库上的备份没有什么区别。整个恢复过程如下:
$ srvctl stop db -d testrac $ srvctl start inst -d testrac -i testrac1 -o mount $ srvctl start inst -d testrac -i testrac2 -o mount保证两个实例都启动到mount状态,就可以进行数据文件的还原了,仍然是两个实例同时进行还原操作:
$ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期一 5月 21 15:22:01 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已连接到目标数据库: TESTRAC (DBID=4291216984, 未打开)
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore database; }
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore archivelog sequence between 134 and 136 thread 2 archivelog sequence between 216 and 220 thread 1; }
RMAN> host 'rcp racnode1:/data1/archivelog/*.dbf /data1/archivelog';
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; recover database; }在备份、恢复过程中,发现了一个小问题。备份到磁盘上的备份集要比直接备份到带库上的备份集要小。备份到磁盘的数据文件的备份集每个只有15G左右,加在一起是30G。而如果直接备份到带库上,那么每个备份集都有27G左右,加在一起是54G。可能备份到磁盘可以更方便的压缩备份集的大小。同时备份集的大小也直接影响了备份和恢复时间。如果直接备份到带库上,大约需要45分钟。而将磁盘上的备份集备份到带库上只需要30分钟。当然,直接备份到本地磁盘还需要将近15分钟的时间。可以认为对于备份来说,二者消耗的时间差不多。但是恢复由于只需要一个步骤,因此备份集越小恢复速度就越快。恢复时间分别是30分钟和45分钟。综合考虑备份和恢复,发现先备份到磁盘虽然麻烦一下,但是备份和恢复的速度更快,而且更省空间。
5. 最为省事的一种恢复对于备份到磁盘上的备份,如果将备份集都拷贝到一个节点上,是可以通过一个节点来完成恢复的。
$ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期一 5月 21 17:22:25 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到目标数据库: TESTRAC (DBID=4291216984)
RMAN> run { allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup database plus archivelog delete all input; }为了取保一个节点上可以完成所有的恢复,还应该把当前的所有归档日志备份一下,并拷贝到目标节点上:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup archivelog all delete all input; 6> }将所有的备份集拷贝到节点1上
$ rcp racnode2:/data1/backup/* /data1/backup/下面完全可以通过节点1来独立进行恢复过程。
$ srvctl stop db -d testrac $ rman target /恢复管理器: Release 10.2.0.3.0 - Production on 星期四 5月 24 11:18:55 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已连接到目标数据库 (未启动)
RMAN> startup mount
Oracle 实例已启动数据库已装载系统全局区域总计 2147483648 字节
Fixed Size 2031480 字节 Variable Size 318767240 字节 Database Buffers 1811939328 字节 Redo Buffers 14745600 字节
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> allocate channel c2 device type disk format '/data1/backup/%U'; 5> restore database; }
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> allocate channel c2 device type disk format '/data1/backup/%U'; 5> recover database; }对于这种情况,甚至不需要去单独还原归档日志,而可以直接使用RECOVER命令,由Oracle自动来完成所需归档日志的还原工作。 链接地址:http://www.oralandba.cn/a/zuiaiOracle/Oraclegaokeyongxing/2010/0304/622.html 物理standby滚动升级: http://www.oralandba.cn/a/zuiaiOracle/Oraclegaokeyongxing/2010/0302/617.html 跳跃式索引(Skip Scan Index):http://www.oralandba.cn/a/zuiaiOracle/Oraclegaokeyongxing/2010/0305/635.html |