国庆之前就准备做这个实验了。 后来时间不够,就没搞了。 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.1 RAC 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.2 Standby Database 环境
Single Instance Standby |
说明 |
IP |
10.85.10.5 |
Oracle |
非RAC 版本 |
Instance |
Orcl |
Data,Control File,Redo File |
/u01 |
二.配置说明
1.3 switchover 之前,这时RAC是Primary Database
(1) RAC的每个实例都要配置日志发送,目的地指向Standby。
(2) 确认日志发送的方法。如:LGWR
(3) Standby 配置日志接收方法,如:standby redo log。
(4) 启动MRP
1.4 switchover 之后,此时,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.dat init+ASM2.ora initorcl2.ora orapworcl1
hc_+ASM2.dat initdw.ora orapw+ASM2 orapworcl2
hc_orcl2.dat init.ora orapworcl snapcf_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
orapworcl 100% 1536 1.5KB/s 00: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.ctl 100% 15MB 1.4MB/s 00: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.ctl control02.ctl control03.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
app dave.log RAC_hot_database_backup.sh.out
backup dave.ora tianlesoftware.dmp
control01.ctl impdp.log tmp.ora
dave_2010929.dmp RAC_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_st VALID_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# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
如果这里除了+DATA,还有+FLASH_RECOVERY_AREA, 那么这些redo 都需要在参数里指定进行转换。 不然通过rman ,这些路径也会被复制过去,但是standby上是无法访问这些路径的,所以在做switchover 切换的时候,就会报错。 这点是要注意的地方。
3.6 RMAN 备份主库并将备份文件传到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
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 08-OCT-2010 12:41:43
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
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 Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 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 Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 62916780 bytes
Database Buffers 113246208 bytes
Redo Buffers 2973696 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
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
从上面的结果看出, 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 logfile thread 1 group 7 ('/u01/app/oracle/oradata/orcl/datafile/redo_st_07.log') size 50m;
Alter database add standby logfile thread 2 group 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
Name Type Target State Host
------------------------------------------------------------
ora.orcl.db application OFFLINE OFFLINE
ora....oltp.cs application OFFLINE OFFLINE
ora....cl1.srv application OFFLINE OFFLINE
ora....cl2.srv application OFFLINE OFFLINE
ora....l1.inst application OFFLINE OFFLINE
ora....l2.inst application OFFLINE OFFLINE
ora....SM1.asm application ONLINE ONLINE rac1
ora....C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application ONLINE ONLINE rac1
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip application ONLINE ONLINE rac1
ora....SM2.asm application ONLINE ONLINE rac2
ora....C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application ONLINE ONLINE rac2
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip application ONLINE ONLINE rac2
[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 Area 180355072 bytes
Fixed Size 1218388 bytes
Variable Size 109054124 bytes
Database Buffers 67108864 bytes
Redo Buffers 2973696 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_NAME STATUS ERROR
-------------------- --------- -------------------------------------------------
LOG_ARCHIVE_DEST_1 VALID
LOG_ARCHIVE_DEST_2 VALID
LOG_ARCHIVE_DEST_3 VALID
LOG_ARCHIVE_DEST_4 INACTIVE
LOG_ARCHIVE_DEST_5 INACTIVE
LOG_ARCHIVE_DEST_6 INACTIVE
LOG_ARCHIVE_DEST_7 INACTIVE
LOG_ARCHIVE_DEST_8 INACTIVE
LOG_ARCHIVE_DEST_9 INACTIVE
LOG_ARCHIVE_DEST_10 INACTIVE
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
---------- ---------- ---------------
1 1 50
1 2 50
2 3 50
2 4 50
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# STATUS TYPE MEMBER
---------- ------- ------- -----------------------------------------------------
2 ONLINE +DATA/orcl/onlinelog/group_2.282.730181191
2 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.262.73018
1 ONLINE +DATA/orcl/onlinelog/group_1.281.730181173
1 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.261.73018
3 ONLINE +DATA/orcl/onlinelog/group_3.285.730181443
3 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.263.73018
4 ONLINE +DATA/orcl/onlinelog/group_4.286.730181451
4 ONLINE +FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.264.73018
5 STANDBY +DATA/orcl/onlinelog/group_5.292.731930683
5 STANDBY +FLASH_RECOVERY_AREA/orcl/onlinelog/group_5.268.73193
…
Standby 日志添加完之后,就可以启动实例了。 同样要注意的是, 如果standby 是RAC 环境, MRP 只能在一个实例上执行,这和RAC的恢复操作一样,而其他实例只能运行RFS。
这种切换的意义并不大,RAC 本身就是一个高可用性的系统,它有多个节点可以规避宕机的风险。 RAC + 逻辑standby 这种用法还是比较常见。 我们公司目前也是用这种搭配方法,逻辑standby 用来做报表数据库。
这个实验捣鼓了3天的时间,从十一放假回来就开始捣鼓。 本本上跑了三个虚拟机,4G 的内存也是很吃紧, RAC 在家里跑不起来,启动之后总有一个节点会宕机,看了log也是和网络有点什么关系。 只能在公司里才能正常使用。 所以都是上班时间去公司捣鼓这些东西。 今天下班之前总算折腾完了。
结束语: 路漫漫其修远兮,吾将上下而求索!
------------------------------------------------------------------------------