oracle rac 备份

RAC环境数据库的备份与恢复

RAC环境的备份、恢复和普通数据库的备份、恢复是有一些区别的。这个区别主要体现在RAC环境的特殊性上。根据OracleRAC环境的不同,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,直接recoverOracle自动会去找到合适的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

[@more@]

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

转载于:http://blog.itpub.net/13879334/viewspace-1034904/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值