rman备份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> run

2> {

3> allocate channel c1 device type diskformat '/data1/backup/%U' connect sys/test@testrac1;

4> allocate channel c2 device type diskformat '/data1/backup/%U' connect sys/test@testrac2;

5> backup database plus archivelogdelete all input;

6> }

恢复部分:

下面准备通过RMAN进行数据库的恢复。由于RAC的备份是同时备份到两个节点的本地硬盘上,因此恢复的时候也应该两个节点同时进行RESTORE操作。

可以在两个节点上分别启动RMAN,将数据库处于STARTUP MOUNT状态,然后就可以在任意一个节点上执行RESTORE操作:

分别在两个节点上如下操作:

$ rman target /

RMAN> startup mount

在任意节点上恢复数据文件

RMAN> run

2> {

3> allocate channel c1 device type diskformat '/data1/backup/%U' connect sys/test@testrac1;

4> allocate channel c2 device type diskformat '/data1/backup/%U' connect sys/test@testrac2;

5> restore database;

6> }

下面恢复归档日志:

RMAN> run

2> {

3> allocate channel c1 device type diskformat '/data1/backup/%U' connect sys/test@testrac1;

4> allocate channel c2 device type diskformat '/data1/backup/%U' connect sys/test@testrac2;

5> restore (archivelog sequence between179 and 183 thread 1)

6> (archivelog sequence between 99 and103 thread 2);

7> }

现在面临一个问题,对于还原(RESTORE)操作,可以两个实例同时进行,但是对于恢复(RECOVER)操作,只能一个实例完成。

这就要求一个实例必须能同时看到两个实例的归档日志。可以通过nfs mount等方式来实现,这里采用最简单的方法,将节点2上的归档拷贝到节点1的归档目录下。

首先关闭数据库,然后将两个实例都启动到mount状态,然后通过RMAN进行恢复。

RMAN> host 'rcp172.25.198.223:/data1/archivelog/* /data1/archivelog'

2> ;

主机命令完成

RMAN> run

2> {

3> allocate channel c1 device type diskformat '/data1/backup/%U' connect sys/test@testrac1;

4> allocate channel c2 device type diskformat '/data1/backup/%U' connect sys/test@testrac2;

5> recover database;

6> }

二、归档日志在本地放一份,在ASM上放一份

由于日志文件的备份和还原只能通过本地的实例进行,而对于恢复的实例来说,并非所有的归档日志都是可见的。这就要求归档日志在还原完成之后,必须通过手工的方式同步到恢复站点,就不仅增加了恢复的复杂性,而且效率比较低,还要求用户必须清楚的知道需要还原的归档日志有哪些。

解决方法一:将归档日志放到ASM上

如果将归档日志放到ASM上,那么备份和恢复RAC数据库就像备份和恢复一个单实例数据库一样简单了。不过ASM有ASM的缺点,个人感觉ASM目前的bug还相对多一些,也许11g的时候,ASM会更加成熟。因此,把数据文件放到ASM上还是有风险的,不过将归档放到ASM上就相对安全一些了。不过如果ASM出现了故障,仍然会导致无法完成归档使得数据库停止响应。个人认为,最稳妥的方法仍然是将归档设置在本地的磁盘上,同时两个实例设置第二归档目的地:ASM。利用RMAN的归档定位自动FAILOVER功能,来实现归档的备份和恢复。

设置log_archive_dest_2到ASM上:

SQL> alter system set log_archive_dest_2= 'LOCATION=+DISK/testrac/';

备份部分:

1、先备份一次本地的日志,并删除

RMAN> run

2> {

3> allocate channel c1 device type sbtconnect sys/test@testrac1;

4> allocate channel c2 device type sbtconnect sys/test@testrac2;

5> backup archivelog all delete allinput;

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 archivelogdelete 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> }

问题:

但是这种备份方式存在问题,BACKUPDATABASE PLUS ARCHIVELOG DELETE ALL INPUT由于只连接一个实例,因此只会清除当前实例上的归档日志和ASM上的归档日志,对应另一个实例上的归档则无法清除。

解决这个问题的最简单的办法是在备份数据库的时候不要使用DELETE语句,在备份完成后,另外分配合适的CHANNEL来删除所有的归档日志。

三、归档日志放在本地,使用NFS解决

Oracle的官方文档给出的方法就是通过NFS MOUNT方式来实现。

准备部分:

采用这个方法需要保证每个节点的归档目的地都是唯一的,并将这个归档目的地以NFS MOUNT方式加载到远端站点。

首先在两个节点上分别建立归档的目的目录:

# su - oracle

Sun Microsystems Inc. SunOS 5.8 GenericPatch October 2001

$ mkdir /data1/archivelog1/data1/archivelog2

$ exit

# hostname

racnode1

# su - oracle

SunMicrosystems Inc. SunOS 5.8 Generic Patch October 2001

$ mkdir /data1/archivelog1/data1/archivelog2

$ exit

# hostname

racnode2

在节点一设置目录的共享:

# share -F nfs -o rw=racnode2/data1/archivelog1

在节点二设置目录的共享:

# share -F nfs -o rw=racnode1/data1/archivelog2

在节点一加载节点二的目录:

# mount racnode2:/data1/archivelog2/data1/archivelog2

在节点二加载节点一的目录:

# mount racnode1:/data1/archivelog1/data1/archivelog1

分别在节点一和节点二上执行df –k,确保NFS MOUNT已经加载成功。

注意,如果需要配置在系统重启后生效,应该将share命令和mount命令的修改添加到主机的/etc/dfs/dfstab文件和/etc/vfstab。详细内容可以参考:http://yangtingkun.itpub.net/post/468/284160

如果希望系统重启后自动进行mount,那么在nfs客户端,需要修改/etc/vfstab文件:

racnode2:/data1/archivelog - /archivelog2nfs - yes -

为了保证nfs的服务器端重启后,share信息不丢失,可以在/etc/dfs/dfstab文件中添加:

share -F nfs -o rw=racnode1/data1/archivelog

下面修改数据库的初始化参数:

$ sqlplus "/ as sysdba"

SQL> col value format a50

SQL> select inst_id, value fromgv$parameter where name = 'log_archive_dest_1';

INST_ID VALUE

------------------------------------------------------------

2LOCATION=/data1/archivelog

1 LOCATION=/data1/archivelog

SQL> alter system set log_archive_dest_1= 'LOCATION=/data1/archivelog1' sid = 'testrac1';

SQL> alter system set log_archive_dest_1= 'LOCATION=/data1/archivelog2' sid = 'testrac2';

备份部分:

备份现有归档日志,确保新的设置对以后的备份生效。

RMAN> run

2> {

3> allocate channel c1 device type sbtconnect sys/test@testrac1;

4> allocate channel c2 device type sbtconnect sys/test@testrac2;

5> backup archivelog all delete allinput;

6> }

下面就可以在任意一个节点上进行备份:

RMAN> run

2> {

3> allocate channel c1 device type sbt;

4> allocate channel c2 device type sbt;

5> backup database plus archivelogdelete 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> recover database;

7> }

问题:

由于在主机上进行了NFSmount,数据库的备份和恢复可以通过一个节点进行。但是这种情况存在着一个比较严重的问题。就是NFS mount在一个节点没有启动的情况下,会极大的影响另一个节点的性能。也就是说,如果RAC一个节点出现故障,导致机器无法正常启动的话,另一个节点不但要承担全部的数据库压力,而且还会受到nfs mount带来的性能负载,基本上导致这个节点无法正常工作。

由于性能上的考虑,使用NFSmount的时候一定要慎重。

RAC归档日志的几种处理方法

在RAC数据库中,RMAN备份的时候需要找到所有的归档日志,如何让RMAN发现所有的归档日志呢?

下面是几个常用的方法:

1、最简单就是使用OCFS了,但是目前只能限于WINDOWS和Linux上面,当然UNIX上也有相应的clusterfilesystem,但是都是要付费的,OCFS是免费的,一直听说Oracle要发布Solaris上面的OCFS,但是到现在还没有消息。

如果如用OCFS作为归档日志存放地,那么每个节点的实例都把归档日志放到同一个OCFS上面,这样RMAN备份就可以

RMAN>backup archivelog all delete allinput format '.......';

因为RMAN可以发现所有的归档日志。

2、使用UNIX使用NFS,WINDOWS使用网络驱动器方式。这样也可以做到,在一个节点上RMAN就能发现所有的归档日志了。

3、使用cross-instance archival方式,比如有两个RAC实例:rac1和rac2

rac1和rac2的log_archive_dest_1='location=c:\arch'

可以设置

rac1的 log_archive_dest_2='service=rac2 arch'

rac2的 log_archive_dest_2='service=rac1 arch'

类似standby数据库的设置,这样也可以做到每个节点都有所有的归档日志。

4、归档日志就存放在本地的硬盘上面,这也,任何节点只有它自己的归档日志。

处理结果:

对于方式1、2 RMAN备份归档日志很简单,只需要分配一个通道就可以了,并且备份完成后RMAN可以删除所有节点上的归档日志。

对于3,虽然可以只用一个通道就可以备份说有的归档日志,但是RMAN删除的时候不会把所有归档日志删除,而是保留每个实例通过log_archive_dest_2得到归档日志。不过这样也有一个好处:在数据库recover的时候,不用restore归档日志。

对于4,如果没有带库,要使用下面的方法来备份归档日志:

run

{

allocate channel type d1 type disk connect 'sys/sys@rac1';

allocate channel type d2 type disk connect 'sys/sys@rac2';

backup archivelog all delete all input format '........';

release channel d1;

release channel d2;

}

阅读更多
个人分类: oracle专栏
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭