国庆之前就准备做这个实验了。后来时间不够,就没搞了。6天的长假一放,都散漫的不成样子了。懒散了很多。今天7号。上班也没啥精神,但是该做的实验还得继续。
Oracle高可用性的三个主要体现是:RAC, Data Guard和Stream.所以熟练掌握这些技术就是评价DBA的标准一个。RAC + Data Guard主要用在灾备或者报表服务器上。比如用RAC+逻辑standby做报表,从而减轻RAC系统的压力。
关于Data Guard的一些原理知识可以参考:
Oracle Data Guard理论知识
http://blog.csdn.net/xujinyang/article/details/6833263
Oracle Data Gurad Physical Standby相关说明
http://blog.csdn.net/xujinyang/article/details/6829549
RAC的知识参考:
RAC的一些概念性和原理性的知识
http://blog.csdn.net/xujinyang/article/details/6837273
Redhat 5.4 + ASM + RAW+ Oracle 10g RAC安装文档
http://blog.csdn.net/xujinyang/article/details/6837265
RAC和Data Guard的组合有4种情况:
组合 | Primary | Standby |
1 | Single Instance | Single Instance |
2 | Single Instance | RAC |
3 | RAC | Single Instance |
4 | RAC | RAC |
在RAC + DG平台下,重用的几个视图:
(1)v$archive_dest_status:在Standby Database上可以在这个视图中查看接收的日志编号,恢复的日志编号,从而可以了解Standby Database和Primary Database日志的差别。如果standby比Primary滞后太多,可以考虑增加恢复进程。该视图中的recovery_mode列也显示了是否使用了实时恢复(Real-Time Apply).
(2)v$archive_dest:这个视图中的error列可以用于辅助诊断。
(3)v$managed_standby:这个视图可以确认standby RAC中,哪个实例是执行recover的实例。
下面实验是RAC + Single standby的模式。
一.测试环境
1.1RAC Primary Database环境
RAC primary | Rac1 | Rac2 |
Public IP | 10.85.10.1 | 10.85.10.2 |
Private IP | 192.168.1.200 | 192.168.1.201 |
Virtual IP | 10.85.10.3 | 10.85.10.4 |
Instance | Orcl1 | Orcl2 |
DB_NAME | Orcl | |
Data,Control File, Redo File | ASM |
1.2Standby Database环境
Single Instance Standby | 说明 |
IP | 10.85.10.5 |
Oracle | 非RAC版本 |
Instance | Orcl |
Data,Control File,Redo File | /u01 |
二.配置说明
1.3switchover之前,这时RAC是Primary Database
(1)RAC的每个实例都要配置日志发送,目的地指向Standby。
(2)确认日志发送的方法。如:LGWR
(3)Standby配置日志接收方法,如:standby redo log。
(4)启动MRP
1.4switchover之后,此时,rac是standby database
如果Standby是RAC,则日志接收和日志恢复可以是不同的Instance。因此Oracle在术语上把这两种实例分别叫作Receive Instance和Recover Instance。在这个实验中,放在一个实例上进行。
(1)Single Instance的日志只发送到RAC的一个实例。
(2)确认RAC的日志接收方法,如:Standby Redo Log。
(3)在RAC的一个实例上启动MRP.
三.开始搭建
3.1主库归档模式设置
Data Guard用的归档日志来完成同步,所以在实验之前,主库必须是归档模式。这里就RAC的归档。关于RAC的归档参考Blog RAC之RMAN备份中的1.2节。设置归档就那么几步,设置好归档目录,然后关闭所以节点,最后在一个节点上将模式设置为归档就ok了。
RAC之RMAN备份
http://blog.csdn.net/xujinyang/article/details/6837226
3.2准备备库环境
安装Oracle软件,并建立实例的相关目录。Linux平台上Oracle的安装参考blog:
linux平台下oracle数据库安装
http://blog.csdn.net/xujinyang/article/details/6830215
在备库创建相关目录
mkdir -p$ORACLE_BASE/oradata/orcl/datafile
mkdir -p$ORACLE_BASE/oradata/orcl/tempfile
mkdir -p$ORACLE_BASE/admin/orcl/adump
mkdir -p$ORACLE_BASE/admin/orcl/bdump
mkdir -p$ORACLE_BASE/admin/orcl/cdump
mkdir -p$ORACLE_BASE/admin/orcl/dpdump
mkdir -p$ORACLE_BASE/admin/orcl/hdump
mkdir -p$ORACLE_BASE/admin/orcl/pfile
mkdir -p$ORACLE_BASE/admin/orcl/udump
这里要注意的地方:
因为RAC主库是用ASM来存放的,所以这里设置的目录,与ASM目录是不一致的,这种情况下,我们就需要在参数文件里用db_file_name_convert和log_file_name_convert参数来进行转换。
3.3配置主备库的监听,修改tnsnames.ora和listener.ora文件
主备库的tnsnames.ora文件是一致的。修改成如下:
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl2)
)
)
ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
(INSTANCE_NAME = orcl1)
)
)
ORCL_ST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =10.85.10.5 )(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
这里要注意RAC实例和单实例配置上的区别。上面以用红色标出。
用net manager工具,在备库创建一个监听。也可以手动的在listener.ora文件里添加如下内容:
SID_LIST_LISTENER_RAC2 =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.85.10.5)(PORT = 1521))
)
注意:SID_LIST_LISTENER配置的是静态注册,如果没有该参数,而且Data Guard启动顺序又不正确,那么在主库可能会报PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514.错误,导致归档无法完成。
Oracle Listener动态注册与静态注册
http://blog.csdn.net/xujinyang/article/details/6829560
3.4在主库上创建备库的密码文件和控制文件,并将文件传到备库的相关位置
3.4.1密码文件:
[oracle@rac2 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@rac2 bin]$ orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle
[oracle@rac2 bin]$ cd $ORACLE_HOME/dbs/
[oracle@rac2 dbs]$ ls
ab_+ASM2.datinit+ASM2.orainitorcl2.oraorapworcl1
hc_+ASM2.datinitdw.oraorapw+ASM2orapworcl2
hc_orcl2.datinit.oraorapworclsnapcf_orcl2.f
缺省情况下,win下口令文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感)
参考:
Oracle OS认证口令文件密码丢失处理
http://blog.csdn.net/xujinyang/article/details/6830312
传送文件:
[oracle@rac2 dbs]$ scp orapworcl 10.85.10.5://u01/app/oracle/product/10.2.0/db_1/dbs
orapworcl100% 15361.5KB/s00:00
[oracle@rac2 dbs]$
3.4.2控制文件
[oracle@rac1 admin]$ export ORACLE_SID=orcl1
[oracle@rac1 admin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 03:39:00 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
SQL> conn system/oracle;
Connected.
SQL> alter database create standby controlfile as '/u01/control01.ctl';
Database altered.
SQL>
--判断一个数据库是Primary还是Standby,就是通过控制文件来判断的。
传送文件:
[oracle@rac1 u01]$ scp control01.ctl 10.85.10.5://u01/app/oracle/oradata/orcl/datafile
control01.ctl100%15MB1.4MB/s00:11
在备库上将控制文件复制2份,并命名为control02.ctl, control03.ctl
[oracle@rac3 orcl]$ cp control01.ctl control02.ctl
[oracle@rac3 orcl]$ cp control01.ctl control03.ctl
[oracle@rac3 orcl]$ ls
control01.ctlcontrol02.ctlcontrol03.ctl
3.5参数文件
3.5.1主库的参数文件
先用spfile来创建pfile文件。这里要注意的,不要直接用create pfile from spfile来创建。至于为什么参考Blog:
RAC修改spfile参数
http://blog.csdn.net/xujinyang/article/details/6837210
[oracle@rac1 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 04:33:51 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> create pfile='/u01/tmp.ora' from spfile;
File created.
SQL> !
[oracle@rac1 u01]$cd /u01
[oracle@rac1 u01]$ls
appdave.logRAC_hot_database_backup.sh.out
backupdave.oratianlesoftware.dmp
control01.ctlimpdp.logtmp.ora
dave_2010929.dmpRAC_hot_database_backup.sh
[oracle@rac1 u01]$more tmp.ora
通过more命令,我们就可以看到rac pfile参数的内容,对于RAC主库,我们不需要做什么修改,只需要添加如下内容:
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_3='service=orcl_stVALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl_st'
*.db_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/datafile',
' /u01/app/oracle/oradata/orcl/tempfile','+DATA/orcl/tempfile'
*.log_file_name_convert=' /u01/app/oracle/oradata/orcl/datafile', '+DATA/orcl/datafile'
*.standby_file_management=auto
*.fal_server='orcl_st'
orcl1.fal_client='orcl1'
orcl2.fal_client='orcl2'
这里要注意的地方:如果之前配置了实例之间归档文件的互相传送,那么这里需要加上db_unique_name参数:
orcl2.log_archive_dest_2='service=orcl1 db_unique_name=orcl'
orcl1.log_archive_dest_2='service=orcl2 db_unique_name=orcl'
不然在启动时会报如下错误:
BAD PARAM ORA-16052: DB_UNIQUE_NAME attribute is required
查询Data Guard的db_unique_name可以通过v$dagatuard_config视图:
SQL> select * from v$dataguard_config;
DB_UNIQUE_NAME
------------------------------
orcl
orcl_st
如果之前没有添加,可以通过修改pfile,在用pfile创建spfile,或者用SQL,如:
SQL> alter system set log_archive_dest_2='service=orcl1 db_unique_name=orcl' sid='orcl2';
关于这些参数的意义,可以参考:
Oracle Data Guard理论知识
http://blog.csdn.net/xujinyang/article/details/6833263
一些说明:
(1)使用ASM作存储时,datafile和tempfile是分别放在两个目录下的,所以在standby上也单独创建一个tempdata目录,并在db_file_convert中作相应的设置。
(2)在使用ASM的RAC中,注意不要修改db_unique_name的参数值,因为ASM存放文件的规则,是按照+diskgroup_name/database_unique_name/file_type/tag_name.file_number.incarnation这样一个规则存放的,但是第二项database_unique_name并不是db_name;如果改变了db_unique_name,则之后创建的数据文件会放到新的目录下,会导致db_file_convert的失败,这一点需要特别注意。
(3)如果RAC中使用db_create_online_dest_n系列的参数,要相应调整standby上的log_file_name_convert参数。
第一点里提到ASM分开存放文件,我们可以用asmcmd命令连上ASM验证一下:
[oracle@rac2 +ASM]$ export ORACLE_SID=+ASM2
[oracle@rac2 +ASM]$ asmcmd
ASMCMD> ls
DATA/
FLASH_RECOVERY_AREA/
ASMCMD> cd DATA
ASMCMD> ls
ORCL/
ASMCMD> cd ORCL/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileorcl.ora
ASMCMD> cd TEMPFILE
ASMCMD> ls
TEMP.283.730181265
3.5.2备库的参数文件
备库的初始化文件,在主库的基础上修改一下,把不用的删除掉就可以了。对于设计到Data Guard的参数,修改一下参数的值就可以了。最终备库的参数如下:
[oracle@rac3 dbs]$ more initorcl.ora
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/orcl/datafile/control01.ctl','/u01/app/oracle/oradata/orcl/
datafile/control02.ctl','/u01/app/oracle/oradata/orcl/datafile/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=/u01/arch'
*.log_archive_dest_state_2='ENABLE'
*.open_cursors=300
*.pga_aggregate_target=59768832
*.processes=150
*.remote_login_passwordfile='exclusive'
*.sga_target=179306496
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/orcl/udump'
*.db_unique_name=orcl_st--注意,这个值要和主库参log_archive_dest_n里设置的一致,不然会报错误:ORA-16047: DGID mismatch between destination
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_2='service=orcl1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=orcl1'
*.db_file_name_convert='+DATA/orcl/datafile','/u01/app/oracle/oradata/orcl/datafile','+DATA/orcl/tem
pfile','/u01/app/oracle/oradata/orcl/tempfile'
*.log_file_name_convert='+DATA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile',
'+FLASH_RECOVERY_AREA/orcl/onlinelog','/u01/app/oracle/oradata/orcl/datafile'
*.standby_file_management=auto
*.standby_archive_dest='/u01/arch'
*.fal_server='orcl1','orcl2'
*.fal_client='orcl2'
这里面关于log_file_name_conver参数:
先从主库查看v$logfile:
SQL>Select * from v$logfile;
GROUP# STATUSTYPEMEMBER
---------- ------- ------- -----------------------------------------------------
2ONLINE+DATA/orcl/onlinelog/group_2.282.730181191
2ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1ONLINE+DATA/orcl/onlinelog/group_1.281.730181173
1ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3ONLINE+DATA/orcl/onlinelog/group_3.285.730181443
3ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4ONLINE+DATA/orcl/onlinelog/group_4.286.730181451
4ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
如果这里除了+DATA,还有+FLASH_RECOVERY_AREA,那么这些redo都需要在参数里指定进行转换。不然通过rman,这些路径也会被复制过去,但是standby上是无法访问这些路径的,所以在做switchover切换的时候,就会报错。这点是要注意的地方。
3.6RMAN备份主库并将备份文件传到standby上
这里用的是RMAN复制的方法来搭建standby环境。可以参考我的Blog:
用RMAN复制搭建物理Data Gurad环境
http://blog.csdn.net/xujinyang/article/details/6833249
备份文件,放在/u01/rmanback目录下,我们在rac1节点进行备份。在standby节点也需要建同样的目录,还需要把备份文件copy到这个目录下。
[oracle@rac1 bin]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 12:13:07 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
connected to target database: ORCL (DBID=1257961898)
RMAN> RUN {
allocate channel c1 type disk;
allocate channel c2 type disk;
sql 'alter system archive log current';
backup current controlfile for standby format='/u01/rmanbackup/control_%U';
BACKUP FORMAT '/u01/rmanbackup/orcl_%U_%T' skip inaccessible filesperset 5 DATABASE ;
sql 'alter system archive log current';
BACKUP FORMAT '/u01/rmanbackup/arch_%U_%T' skip inaccessible filesperset 5 ARCHIVELOG ALL DELETE INPUT;
release channel c2;
release channel c1;
}
SCP拷贝到standby上:
[oracle@rac1 rmanbackup]$ scp * 10.85.10.5://u01/rmanbackup/
RMAN备份有一些注意事项,具体参考我的blog:
RAC之RMAN备份
http://blog.csdn.net/xujinyang/article/details/6837226
3.7用之前创建的初始化参数文件将备库启动到nomount状态:
启动监听:
[oracle@rac3 admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 08-OCT-2010 12:41:43
Copyright (c) 1991, 2005, Oracle.All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.5)(PORT=1521)))
STATUS of the LISTENER
------------------------
AliasLISTENER
VersionTNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date08-OCT-2010 12:41:43
Uptime0 days 0 hr. 0 min. 0 sec
Trace Leveloff
SecurityON: Local OS Authentication
SNMPOFF
Listener Parameter File/u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File/u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.85.10.5)(PORT=1521)))
The listener supports no services
The command completed successfully
启动数据库:
[oracle@rac3 u01]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Oct 8 12:37:08 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount pfile=?/dbs/initorcl.ora
ORACLE instance started.
Total System Global Area180355072 bytes
Fixed Size1218388 bytes
Variable Size62916780 bytes
Database Buffers113246208 bytes
Redo Buffers2973696 bytes
SQL>
3.8 rman还原数据库:
[oracle@rac1 admin]$ rman target / auxiliary sys/oracle@orcl_st
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 8 13:25:31 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
connected to target database: ORCL (DBID=1257961898)
connected to auxiliary database: ORCL (not mounted)
RMAN> duplicate target database for standby;
…
Finished Duplicate Db at 09-OCT-10
3.9检查standby数据库
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/datafile/system.276.730181051
/u01/app/oracle/oradata/orcl/datafile/undotbs1.278.730181053
/u01/app/oracle/oradata/orcl/datafile/sysaux.277.730181053
/u01/app/oracle/oradata/orcl/datafile/users.279.730181053
/u01/app/oracle/oradata/orcl/datafile/undotbs2.284.730181347
/u01/app/oracle/oradata/orcl/datafile/tianlesoftware.dbf
/u01/app/oracle/oradata/orcl/datafile/anhuianqing.dbf
7 rows selected.
SQL> select name from v$tempfile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/tempfile/temp.283.730181265
将备库启动到mount standby状态,并启动MRP进程:
SQL> startup nomount;
ORACLE instance started.
Total System Global Area180355072 bytes
Fixed Size1218388 bytes
Variable Size62916780 bytes
Database Buffers113246208 bytes
Redo Buffers2973696 bytes
SQL> alter database mount standby database;
Database altered.
SQL> recover managed standby database disconnect from session;
Media recovery complete.
SQL>
3.10添加standby redo log日志
RAC每个Redo Thread都需要创建对应的Standby Redo Log。创建原则和单实例一样,包括日志文件大小相等,日志组数量要多1组。
在RAC里查看联机日志:
[oracle@rac2 rmanbackup]$export ORACLE_SID=orcl2
[oracle@rac2 rmanbackup]$sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 03:49:49 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
SQL> conn/ as sysdba;
Connected.
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD#GROUP# BYTES/1024/1024
---------- ---------- ---------------
1150
1250
2350
2450
从上面的结果看出,RAC有两个Redo Thread,每个Thread有两个日志组,每个日志文件大小有50MB,所以要针对每个thread需要创建3组Standby Redo Log,大小为50MB。
Alter database add standby logfile thread 1 group 5 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_05.log') size 50m;
Alter database add standby logfile thread 1 group 6 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_06.log') size 50m;
Alter database add standby logfilethread 1group 7 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_07.log') size 50m;
Alter database add standby logfilethread 2group 8 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_08.log') size 50m;
Alter database add standby logfile thread 2 group 9 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_09.log') size 50m;
Alter database add standby logfile thread 2 group 10 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_10.log') size 50m;
添加完可以用:select * from v$logfile查看日志情况。
3.11先停止RAC实例,然后用之前创建的pfile启动rac实例。
[oracle@rac1 u01]$ cd /u01/app/oracle/product/crs/bin/
[oracle@rac1 bin]$ srvctl stop database -d orcl
[oracle@rac1 bin]$ crs_stat -t
NameTypeTargetStateHost
------------------------------------------------------------
ora.orcl.dbapplicationOFFLINEOFFLINE
ora....oltp.cs applicationOFFLINEOFFLINE
ora....cl1.srv applicationOFFLINEOFFLINE
ora....cl2.srv applicationOFFLINEOFFLINE
ora....l1.inst applicationOFFLINEOFFLINE
ora....l2.inst applicationOFFLINEOFFLINE
ora....SM1.asm applicationONLINEONLINErac1
ora....C1.lsnr applicationONLINEONLINErac1
ora.rac1.gsdapplicationONLINEONLINErac1
ora.rac1.onsapplicationONLINEONLINErac1
ora.rac1.vipapplicationONLINEONLINErac1
ora....SM2.asm applicationONLINEONLINErac2
ora....C2.lsnr applicationONLINEONLINErac2
ora.rac2.gsdapplicationONLINEONLINErac2
ora.rac2.onsapplicationONLINEONLINErac2
ora.rac2.vipapplicationONLINEONLINErac2
[oracle@rac1 bin]$ export ORACLE_SID=orcl1
[oracle@rac1 bin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 9 05:27:55 2010
Copyright (c) 1982, 2005, Oracle.All rights reserved.
SQL> conn / as sysdba;
Connected to an idle instance.
SQL> create spfile from pfile='/u01/tmp.ora';
File created.
启动所有节点:
SQL> startup
ORACLE instance started.
Total System Global Area180355072 bytes
Fixed Size1218388 bytes
Variable Size109054124 bytes
Database Buffers67108864 bytes
Redo Buffers2973696 bytes
Database mounted.
Database opened.
这里有遇到了点麻烦,参考:
ORA-01677 standby file name convert parameters differ from other instance错误
http://blog.csdn.net/xujinyang/article/details/6836783
3.12在主库查看日志传送情况
SQL> Select dest_name,status,error from v$archive_dest;
DEST_NAMESTATUSERROR
-------------------- --------- -------------------------------------------------
LOG_ARCHIVE_DEST_1VALID
LOG_ARCHIVE_DEST_2VALID
LOG_ARCHIVE_DEST_3VALID
LOG_ARCHIVE_DEST_4INACTIVE
LOG_ARCHIVE_DEST_5INACTIVE
LOG_ARCHIVE_DEST_6INACTIVE
LOG_ARCHIVE_DEST_7INACTIVE
LOG_ARCHIVE_DEST_8INACTIVE
LOG_ARCHIVE_DEST_9INACTIVE
LOG_ARCHIVE_DEST_10INACTIVE
10 rows selected.
两个节点都正常。
3.13验证同步情况
在主备库分别切换日志:
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
15
16
SQL> alter system switch logfile;
System altered.
SQL> select sequence# from v$archived_log;
SEQUENCE#
----------
…
17
18
在备库进行验证:
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APP
---------- ---
…
13 YES
4 NO
14 YES
15 YES
16 YES
18 NO
16 YES
17 YES
18 YES
19 YES
同步成功。至此RAC为主库的,备库为单实例的Oracle的Data Guard环境已经搭建完成。
四.Switchover切换
之前blog上的一篇单实例间切换的例子:
Oracle Data Guard Switchover切换
http://blog.csdn.net/xujinyang/article/details/6833235
RAC环境下,切换Primary和Standby时,只能有一个实例是活动的,其他实例必须关闭。
这里我们关闭rac2节点。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl2
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
在RAC1节点将主库切换到备库:
SQL>select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl1
SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
SQL>alter database commit to switchover to physical standby with session shutdown;
Database altered.
SQL> shutdown immediate;
将备库切换成主库:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY with session shutdown;
SQL> shutdown immediate;
在rac1(原来的主库)节点上创建standby redo log file:
SQL> select thread#,group#,bytes/1024/1024 from v$log;
THREAD#GROUP# BYTES/1024/1024
---------- ---------- ---------------
1150
1250
2350
2450
SQL> alter database add standby logfile thread 1 group 5 size 50m;
SQL> alter database add standby logfile thread 1 group 6 size 50m;
SQL> alter database add standby logfile thread 1 group 7 size 50m;
SQL> alter database add standby logfile thread 2 group 8 size 50m;
SQL> alter database add standby logfile thread 2 group 9 size 50m;
SQL> alter database add standby logfile thread 2 group 10 size 50m;
添加之后可以通过v$logfile视图查看:
SQL> select * from v$logfile;
rows will be truncated
GROUP# STATUSTYPEMEMBER
---------- ------- ------- -----------------------------------------------------
2ONLINE+DATA/orcl/onlinelog/group_2.282.730181191
2ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1ONLINE+DATA/orcl/onlinelog/group_1.281.730181173
1ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3ONLINE+DATA/orcl/onlinelog/group_3.285.730181443
3ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4ONLINE+DATA/orcl/onlinelog/group_4.286.730181451
4ONLINE+FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
5STANDBY +DATA/orcl/onlinelog/group_5.292.731930683
5STANDBY +FLASH_RECOVERY_AREA/orcl/onlinelog/group_5.268.73193
…
Standby日志添加完之后,就可以启动实例了。同样要注意的是,如果standby是RAC环境,MRP只能在一个实例上执行,这和RAC的恢复操作一样,而其他实例只能运行RFS。
这种切换的意义并不大,RAC本身就是一个高可用性的系统,它有多个节点可以规避宕机的风险。RAC +逻辑standby这种用法还是比较常见。我们公司目前也是用这种搭配方法,逻辑standby用来做报表数据库。
这个实验捣鼓了3天的时间,从十一放假回来就开始捣鼓。本本上跑了三个虚拟机,4G的内存也是很吃紧,RAC在家里跑不起来,启动之后总有一个节点会宕机,看了log也是和网络有点什么关系。只能在公司里才能正常使用。所以都是上班时间去公司捣鼓这些东西。今天下班之前总算折腾完了。
结束语:路漫漫其修远兮,吾将上下而求索!
------------------------------------------------------------------------------