RAC+ASM环境配置DataGuard

 

RAC、DATAGUARD、Stream作为ORACLE高可用体系中的三辆马车,每种模式都有自己独特的功能,根据不同的需求可以根据各个功能侧重点进行搭配。

RAC主要特点在于,对外服务的高可用性,在多个实例对外服务的环境下可以避免单实例故障带来的停机,并且多个实例可以有效地解决单点负责均衡。RAC方案在7*24小时的核心系统很常见。RAC模式下,虽然解决了单实例下因故障而带来的停机问题,但RAC模式下数据库只有一份。虽然可以通过存储RAID方式对数据进行镜像冗余,但却解决不了整个数据库出现故障后迅速恢复可用问题,也解决不了数据库容灾问题。

DATAGUARD通过日志同步机制来同步主数据库和备数据库之间的同步,这种同步可以是实时的、延时的、同步、异步方式。DATAGUARD常用于异地容灾方案和小企业单实例备库的高可用方案。DATAGUARD模式下,主数据库正常处理各种在线事务,但备数据库只可以出于恢复模式,数据库仅为只读模式。个别对数据库仅查询事务的应用也可迁移到备数据库上来,但DATAGUARD设计的初衷并不为了解决性能问题。Stream方案是以ORACLE ADVANCED QUEUE为基础实现数据同步的,由于是数据应用层面的同步,所以可以灵活地进行配置,如除了系统表空间的数据库级别、表空间级别、表级别等。关于Stream模式我在以后搭建完实验环境后再进行学习和分享。

在DATAGUARD模式中,至少有两个数据库,其中一个数据库出于OPEN状态,正常对外进行服务,我们把这个数据库叫primary database,另一个数据库则处于恢复模式下,叫standby database。primary database数据库在线事务处理所产生的联机重做日志和归档日志都会传送到standby database,standby database在接收到日志之后将对这些日志进行重演来达到与primary database同步。primary database 和standby database只是个角色概念并不固定在某个数据库当中,在日常软件硬件升级中,可以对它们进行切换。

在上面的描述当中,DATAGUARD模式下实现同步主要围绕着以下三点:

1.primary database日志发送,redo send。

2.standby database日志接收,redo receive。

3.日志应用,redo apply。

下面引用一张框架图:

                       

简单介绍一下配置的环境:

RAC

RAC1:

PUBLICE IP:192.168.1.111/24

private IP:10.10.10.31/24

service_names :devdb_rac, devdb

INSTANCE:devdb1

DB_NAME:devdb

datafile、controlfile、redofile: ASM

RAC2:

PUBLICE IP:192.168.1.122/24

private IP:10.10.10.32/24

service_names :devdb_rac, devdb

INSTANCE:devdb2

DB_NAME:devdb

datafile、controlfile、redofile: ASM

SINGLE

IP:192.168.1.133/24

INSTANCE:devdb3

service_names:devdb_single

DB_NAME:devdb

datafile、controlfile、redofile: OS FILESYSTEM

single为单机数据库,并且安装了和RAC一样的数据库版本,只安装数据库软件,不建库。好了,在准备好环境情况下,我们开始一步一配置,具体要点在建设时进行说明。

一, 配置RAC和SINGLE的tnsname.ora文件。

也就是配置节点1,节点2,单机的上共3个tnsname.ora文件,并且这3个文件配置基本一样。# tnsnames.ora.rac2 Network Configuration File: /u01/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora.rac2
# Generated by Oracle configuration tools.

DEVDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = devdb)
(INSTANCE_NAME = devdb2)
)
)

DEVDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = devdb)
(INSTANCE_NAME = devdb1)
)

)

devdb_single =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = devdb3_single)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = devdb_single)
(INSTANCE_NAME = devdb3)
)
)

LISTENERS_DEVDB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

二. 接着修改listener.ora,由于RAC本身就已经启用监听,所以不需要作修改。single数据库能启动监听程序的话,使用默认配置也可以。

single的listener.ora文件如下:

# listener.ora Network Configuration File: /u01/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
三.修改RAC主数据库为归档模式。

RAC数据库必须在归档模式下。

关闭RAC所有节点,必须滴。

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

启动其中一个节点
SQL> startup mount
SQL> alter database archivelog;

SQL> alter database open;

10GR2以前,在RAC环境下修改归档必须先把设置参数cluster_database=false,把数据库设置为归档后再把该参数设置为true,但这个步骤在10GR2可以省略。

由于RAC归档模式在之前搭建RAC环境时已配置完,所以这里没有太详细进行说明。原来配置占用了“LOG_ARCHIVE_DEST_1”,“LOG_ARCHIVE_DEST_2”。

四. 在RAC各个节点中添加和修改参数文件。

可以通过直接的在线修改或者把spfile创建为pfile再慢慢修改。下面介绍spfile创建为pfile:

SQL> create pfile='/u01/pfile831' from spfile;

File created.

rac-> more /u01/pfile831
devdb1.__db_cache_size=100663296
devdb2.__db_cache_size=62914560
devdb1.__java_pool_size=4194304
devdb2.__java_pool_size=4194304
devdb1.__large_pool_size=4194304
devdb2.__large_pool_size=4194304
devdb1.__shared_pool_size=96468992
devdb2.__shared_pool_size=134217728
devdb1.__streams_pool_size=0
devdb2.__streams_pool_size=0
*.audit_file_dest='/u01/oracle/admin/devdb/adump'
*.background_dump_dest='/u01/oracle/admin/devdb/bdump'
*.cluster_database_instances=2
*.cluster_database=TRUE
*.compatible='10.2.0.1.0'
*.control_files='+DG1/devdb/controlfile/current.260.756332873','+RECOVERYDEST/devdb/controlfile/current.256.756332873'
*.core_dump_dest='/u01/oracle/admin/devdb/cdump'
*.db_block_size=8192
*.db_create_file_dest='+DG1'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_file_name_convert='/u01/oradata/devdb3/devdb3data','+DG1/devdb/datafile','/u01/oradata/devdb3/devdb3temp','+DG1/devdb/tempfile'

--由于RAC使用的文件系统为ASM,SINGLE使用的文件系统为操作系统文件系统。所以两边的文件路径不相同,所以db_file_name_convert参数就可以翻译两边路径了。
*.db_name='devdb'
*.db_recovery_file_dest='+RECOVERYDEST'
*.db_recovery_file_dest_size=1572864000
*.dispatchers='(PROTOCOL=TCP) (SERVICE=devdbXDB)'
devdb1.fal_client='devdb1'
devdb2.fal_client='devdb2'
*.fal_server='devdb_single'

--由于在日志传输过程中可能会出现传输失败导致日志缺裂,这叫做传说中的“裂缝”,这时候就发生了"归档裂缝(archive Gap)",DATAGUARD能够自动检测,并修复。从上面参数看出,如果当某天进行切换后,RAC数据库为standby database,而当发生归档裂缝时,如RAC节点1就是fal_client='devdb1',然后向fal_server='devdb_single'取日志。以上参数配置的是ORACLE NET NAME,所以tnsname.ora务必配置准确。
devdb2.instance_number=2
devdb1.instance_number=1
*.job_queue_processes=10
*.log_archive_config='DG_CONFIG=(devdb,devdb_single)'

--这个参数非常重要,配置错误也会导致重做日志传输失败,主要配置primary database和private database 两个数据库的DB_UNIQUE_NAME
devdb2.log_archive_dest_1='location=/u01/archive2'
devdb1.log_archive_dest_1='location=/u01/archive1'
devdb2.log_archive_dest_2='service=devdb1'
devdb1.log_archive_dest_2='service=devdb2'

--这些归档路径参数是配置归档模式时配置的,可选。
*.log_archive_dest_3='service=devdb_single VALID_FOR=(online_LOGFILES,primary_ROLES) DB_UNIQUE_NAME=devdb_single'

--这个归档路径主要用于传输DATAGUARD传输归档日志用的主要路径。devdb_single通过tnsname指定。VALID_FOR定义primary database和private database 两个数据库转换时角色的转换。
*.log_archive_format='%t_%s_%r.arc'
*.log_file_name_convert='/u01/oradata/devdb3/devdb3log','+DG1/devdb/onlinelog'

--由于RAC使用的文件系统为ASM,SINGLE使用的文件系统为操作系统文件系统。所以两边的文件路径不相同,所以db_file_name_convert参数就可以翻译两边路径了。
*.open_cursors=300
*.pga_aggregate_target=60817408
*.processes=150
*.remote_listener='LISTENERS_DEVDB'
*.remote_login_passwordfile='EXCLUSIVE'
*.service_names='devdb_rac'
*.sga_target=209715200
devdb1.standby_archive_dest='/u01/archive2'
devdb2.standby_archive_dest='/u01/archive1'

--指定从primary database传送到standby database的归档日志路径。
*.standby_file_management='AUTO'

--如果有新的datafile在primary database上创建,standby会自动创建相同的datafile。
devdb2.thread=2
devdb1.thread=1
*.undo_management='AUTO'
devdb1.undo_tablespace='UNDOTBS1'
devdb2.undo_tablespace='UNDOTBS2'
*.user_dump_dest='/u01/oracle/admin/devdb/udump'

db_unique_name=devdb

修改完参数后,把参数文件复制到各节点,然后关闭各个节点数据库:

SQL>shutdown immediate

然后使用新修改的pfile启动各个节点数据库。

SQL>startup pfile='/u01/pfile831';

然后创建spfile保证下次启动数据库这些参数都被加载。

SQL>create spfile from pfile='/u01/pfile831';

完毕!

五.创建standby database 的参数文件

[root@localhost u01]# more pfile830_2
devdb3.__db_cache_size=134217728
devdb3.__java_pool_size=4194304
devdb3.__large_pool_size=4194304
devdb3.__shared_pool_size=62914560
devdb3.__streams_pool_size=0
*.audit_file_dest='/u01/oracle/admin/devdb/adump'
*.background_dump_dest='/u01/oracle/admin/devdb/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/oracle/controlfile/devdb3.ctl'#Restore Controlfile
*.core_dump_dest='/u01/oracle/admin/devdb/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_file_name_convert='+DG1/devdb/datafile','/u01/oradata/devdb3/devdb3data','+DG1/devdb/tempfile','/u01/oradata/devdb3/devdb3temp'

--配置要跟RAC反过来。
*.db_name='devdb'
*.db_recovery_file_dest='+RECOVERYDEST'
*.db_recovery_file_dest_size=1572864000
*.db_unique_name='devdb_single'

--注意修改
*.dispatchers='(PROTOCOL=TCP) (SERVICE=devdbXDB)'
*.fal_client='devdb_single'
*.fal_server='devdb1','devdb2'

--注意修改
*.job_queue_processes=10
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(devdb,devdb_single)'
*.log_archive_dest_1='location=/u01/archive1'

--归档路径1用于自己归档
*.log_archive_dest_2='service=devdb1 VALID_FOR=(online_LOGFILES,primary_ROLES) DB_UNIQUE_NAME=devdb'

--归档路径2用于DATABUARD重做日志传输
*.log_archive_format='%t_%s_%r.arc'
*.log_file_name_convert='+DG1/devdb/onlinelog','/u01/oradata/devdb3/devdb3log'

--注意修改
*.open_cursors=300
*.pga_aggregate_target=60817408
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.service_names='devdb_single'
*.sga_target=209715200
*.standby_archive_dest='/u01/archive'
*.standby_file_management='AUTO'
*.thread=1

--注意修改
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'

--注意修改,否则出错!
*.user_dump_dest='/u01/oracle/admin/devdb/udump'

以上是用过修改RAC参数文件所得的,可以通过对比删去RAC相关的参数,修改SINGLE数据库独有配置。

然后复制到传输文件的位置。

参考位置:/u01/oracle/product/10.2.0/db_1/dbs/initdevdb3.ora

注意,文件名要参考当初安装实例时起的名字!init<SID>.ora

六.创建备份

在RAC其中一个节点执行。

rac2-> rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Wed Aug 31 15:54:54 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: DEVDB (DBID=661062857)

RMAN> run
2> {
3> allocate channel c1 device type disk format '/soft/%U';
4> backup database plus archivelog delete all input;
5> }

然后再备份控制文件:

RMAN> run
2> {
3> allocate channel c1 device type disk format '/soft/con%U';
4> backup current controlfile for standby;
}

查看备份集:

rac1-> ll
total 732824
-rw-r----- 1 oracle oinstall 15532032 Aug 29 14:59 10ml7d3a_1_1
-rw-r----- 1 oracle oinstall 15532032 Aug 29 15:01 12ml7d5e_1_1
-rw-r----- 1 oracle oinstall 703037440 Aug 29 15:08 16ml7dhv_1_1
drwxr-xr-x 2 oracle oinstall 4096 Aug 22 01:21 archivelog
-rw-r----- 1 oracle oinstall 15532032 Aug 29 15:08 con18ml7dk5_1_1

复制到SINGLE主机上:

rac1-> scp 10ml7d3a_1_1 12ml7d5e_1_1 16ml7dhv_1_1 con18ml7dk5_1_1 192.168.1.133:/soft/

SINGLE主机务必创建相应的文件路径。

七.在SINGLE主机上恢复备份集

localhost-> rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Fri Jan 1 08:22:50 1988

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: DEVDB (DBID=661062857, not open)

RMAN> restore controlfile from '/soft/con18ml7dk5_1_1';

接下来恢复数据库,由于控制文件已经恢复了,相关的RMAN备份信息已经在控制文件里面了,所以直接使用命令:

RMAN> restore database;

恢复完毕!

八.在备库添加standby redo log

把single主机设成恢复状态。

SQL> alter database recover managed standby database disconnect from session;

Database altered

注意,logfile文件size必须与日志文件大小一致!

可以查看RAC数据库日志大小:

SQL> select bytes/1024/1024 from v$log;

BYTES/1024/1024
---------------
50
50
50
50

得知日志文件为50m.

然后可以在single主机上创建standby redo log

在本例,每一个thread的联机日志都是2组,所以,需要添加6组standby redo log:

SQL> alter database recover managed standby database cancel;

alter database add standby logfile thread 1 group 5 ('//u01/oradata/devdb3/devdb3log/st_1_5.log') size 50m;
alter database add standby logfile thread 1 group 6 ('//u01/oradata/devdb3/devdb3log/st_1_6.log') size 50m;
alter database add standby logfile thread 1 group 7 ('//u01/oradata/devdb3/devdb3log/st_1_7.log') size 50m;
alter database add standby logfile thread 2 group 8 ('//u01/oradata/devdb3/devdb3log/st_2_8.log') size 50m;
alter database add standby logfile thread 2 group 9 ('//u01/oradata/devdb3/devdb3log/st_2_9.log') size 50m;
alter database add standby logfile thread 2 group 10 ('//u01/oradata/devdb3/devdb3log/st_2_10.log') size 50m;

九.检查运行情况

在RAC节点上各个节点查看:SQL> select dest_name,status,error from v$archive_dest;

DEST_NAME
--------------------------------------------------------------------------------
STATUS ERROR
--------- -----------------------------------------------------------------
LOG_ARCHIVE_DEST_1
VALID

LOG_ARCHIVE_DEST_2
BAD PARAM ORA-16052: DB_UNIQUE_NAME attribute is required

LOG_ARCHIVE_DEST_3
VALID

这个路径没报错的话证明传输没问题,如果报错的话,尝试查看所有参数是否有配置错误的,如果确定没有配置错误,重启RAC所有节点操作系统和SINGLE主机操作系统再看看。本人在配置的时候就出现这种情况,后来重启操作系统后就好了,唉,折腾了我大半天!

启动同步命令:alter database recover managed standby database disconnect from session;

取消同步命令:alter database recover managed standby database cancel;

十.总结

本人刚刚接触DATAGUARD时虽然有比较好的参考资料帮助搭建,但由于很多DATAGUARD的参数都不太熟悉,配置错误也不知道,所以不断不断尝试。从最开始的tnsname和listener配置就出现连接错误了,由于这一块的知识是大学的时候学习的,只记得概念而忘记了很多细节,摸索摸索解决了问题。我参考资料中,备份这一块使用的是auxiliary功能,但由于在远程连接的时候出现BUG,死活恢复不了standby数据库,最后自己摸索方法。恢复standby数据库后,由于参数配置有点错误,经过不断的调试,终于敲定准确无误。但死活还是归档日志传输错误。后来重启操作系统后就好了,唉,折腾了我大半天!总之还得感谢这些不平坦的路,倘若一切顺顺利利弄完我就不会再刻意去研究各个参数,倘若我不耐烦放弃了我就不可能完成这次的实验。哲理呀。。哲理呀。。。

 

posted @ 2013-05-20 21:59  wilson.han  阅读(709)  评论(0编辑  收藏  举报