Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852298
  • 博文数量: 524
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2483
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-25 18:36
个人简介

打杂

文章分类

全部博文(524)

文章存档

2022年(3)

2021年(9)

2019年(1)

2018年(32)

2017年(11)

2016年(152)

2015年(198)

2014年(118)

分类: Oracle

2014-12-23 14:02:09

一、归档日志分别存放在本地
备份
部分:
对于建立在裸设备上的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> 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进行数据库的恢复。由于RAC的备份是同时备份到两个节点的本地硬盘上,因此恢复的时候也应该两个节点同时进行RESTORE操作。
可以在两个节点上分别启动RMAN,将数据库处于STARTUP MOUNT状态,然后就可以在任意一个节点上执行RESTORE操作:

分别在两个节点上如下操作:
$ 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> }

下面恢复归档日志:
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)操作,可以两个实例同时进行,但是对于恢复(RECOVER)操作,只能一个实例完成。
这就要求一个实例必须能同时看到两个实例的归档日志。可以通过nfs mount等方式来实现,这里采用最简单的方法,将节点2上的归档拷贝到节点1的归档目录下。
首先关闭数据库,然后将两个实例都启动到mount状态,然后通过RMAN进行恢复。
RMAN> host 'rcp 172.25.198.223:/data1/archivelog/* /data1/archivelog'
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> recover database;
6> }

二、归档日志在本地放一份,在ASM上放一份
由于日志文件的备份和还原只能通过本地的实例进行,而对于恢复的实例来说,并非所有的归档日志都是可见的。这就要求归档日志在还原完成之后,必须通过手工的方式同步到恢复站点,就不仅增加了恢复的复杂性,而且效率比较低,还要求用户必须清楚的知道需要还原的归档日志有哪些。
解决方法一:将归档日志放到ASM
如果将归档日志放到ASM上,那么备份和恢复RAC数据库就像备份和恢复一个单实例数据库一样简单了。不过ASMASM的缺点,个人感觉ASM目前的bug还相对多一些,也许11g的时候,ASM会更加成熟。因此,把数据文件放到ASM上还是有风险的,不过将归档放到ASM上就相对安全一些了。不过如果ASM出现了故障,仍然会导致无法完成归档使得数据库停止响应。个人认为,最稳妥的方法仍然是将归档设置在本地的磁盘上,同时两个实例设置第二归档目的地:ASM。利用RMAN的归档定位自动FAILOVER功能,来实现归档的备份和恢复。
设置log_archive_dest_2ASM上:
SQL> alter system set log_archive_dest_2 = 'LOCATION=+DISK/testrac/';

备份部分:
1
、先备份一次本地的日志,并删除
RMAN> run
2> {
3> allocate channel c1 device type sbt connect sys/test@testrac1;
4> allocate channel c2 device type sbt connect sys/test@testrac2;
5> backup archivelog all delete all input;
6> }
2
、再整库+归档日志备份,因本地日志已找不到,RMAN会找存在于ASM上的归档日志
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> backup database plus archivelog delete all input;
6> }

恢复部分:
$ srvctl stop db -d testrac
$ rman target /
RMAN> startup mount
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> restore database;
6> }
由于设置了ASM,可以不必还原归档,而直接进行恢复:
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> recover database;
6> }

问题:
但是这种备份方式存在问题,BACKUP DATABASE PLUS ARCHIVELOG DELETE ALL INPUT由于只连接一个实例,因此只会清除当前实例上的归档日志和ASM上的归档日志,对应另一个实例上的归档则无法清除。
解决这个问题的最简单的办法是在备份数据库的时候不要使用DELETE语句,在备份完成后,另外分配合适的CHANNEL来删除所有的归档日志。


阅读(1578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~