您的位置:首页 > 数据库 > Oracle

Oracle 10g RAC系列之   FAILOVER(故障转移)

2014-06-10 15:45 477 查看
机器配置:
机器名称 ip地址 vip地址 备注
RAC1 192.168.1.10 192.168.1.110 rac集群节点1
RAC2 192.168.1.11 192.168.1.111 rac集群节点2
BOSS 192.168.1.220 ------------- 共享存储节点、客户端机器
一.客户端连接时故障转移(client-side connect time failover)
在Tnsnames.ora中设置failover=on(failover=on是默认选项),用户首先选择地址列表中的第一个节点连接,如果不成功的话,会选择地址列表的第二个地址,以此类推。正如名称定义,一旦建立连接,当连接节点发生故障时,是不会故障转移的,需要用户重新建立连接。
客户端BOSS(192.168.1.220)tnsnames.ora中配置如下:
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac)
)
)

[oracle@boss admin]$ sqlplus /nolog
SQL> conn system/oracle@rac
Connected.
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac1

由于所有节点都是正常状态,所以连接会到节点1,也就是地址列表中的第一个IP地址,关闭节点rac1
[oracle@rac1 ~]$ srvctl stop instance -d rac -i rac1 -o abort

再次回到BOSS,执行查询报错,等待一段时间执行,还是报错,如果用户想要操作,需要重新建立连接,再连接时会连接到rac2
SQL> select instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel

SQL> select instance_name from v$instance;
ERROR:
ORA-03114: not connected to ORACLE

SQL> select instance_name from v$instance;
ERROR:
ORA-03114: not connected to ORACLE

SQL> conn system/oracle@rac
Connected.
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac2

二.透明应用故障转移TAF(transparent application failover)
客户端连接故障切换最大的问题是,建立连接后如果节点发生故障,是不能做到故障转移的,这样数据库的可用性就会大打折扣,所以oracle又提供了TAF的方法来解决连接时的故障切换,TAF分为客户端的TAF和服务器端的TAF,在这个章节当中,我们简要说明客户端的TAF。既然叫客户端的TAF,就需要在客户端的tnsnames.ora文件中添加FAILOVER_MODE配置,其中的属性主要有四个:
METHOD
BASIC --->感知到节点故障时才创建到其他实例的连接
PRECONNECT --->同时建立多个连接,发生故障时可以立即切换到其他的连接上,比较消耗资源
TYPE
不管TYPE取什么样的值,对于没有提交的事物都要自动回滚
SESSION 当执行查询时,所连接节点出现故障,oracle会自动切换到其他节点,查询需要重新执行
SELECT 当执行查询时,所连接节点出现故障,oracle会自动切换到其他节点,查询会继续返回剩
下的没有返回的结果,给用户的感觉是操作没有中断,当然oracle要保留游标,上下文等
信息所以比较消耗资源
DELAY 重试时间间隔
RETRIES 重试次数
客户端tnsnames.ora中配置如下:
1.如果METHOD选择BASIC
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
2.如果METHOD选择PRECONNECT
TESTRAC_PRE1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac)
(FAILOVER_MODE=(TYPE=SELECT)
(METHOD = PRECONNECT)
(BACKUP = TESTRAC_PRE2)
)
)
)

TESTRAC_PRE2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac)
(FAILOVER_MODE=(TYPE=SELECT)
(METHOD = PRECONNECT)
(BACKUP = TESTRAC_PRE1)
)
)
)

三.服务端应用故障转移TAF(transparent application failover)
客户端的TAF实现起来并不麻烦,配置也很简单,但如果客户端机器很多,如果failover_mode配置需要做出改动,那所有的机器就要维护,基于这样的考虑,Oracle引入了服务器端TAF,通过和service配合使用,把failover mode的配置信息保存在数据库的数据字典中,这样就减少了维护的成本。
关于service,他的作用不仅仅是为了实现failover,但在这个章节中我们只讨论failover的部分。
可以使用DBCA工具创建和管理service,配置完成后,service信息会加入到OCR和数据库的数据字典,并且service会自动启动,由于DBCA是完全图形的操作,比较简单,这里不再介绍。当然也可以使用srvctl工具添加service。无论使用DBCA工具还是使用srvctl命令来管理service,都无法配置TAF的TYPE、DELAY、RETRIES属性,必须使用dbms_service包来修改这些属性
通过数据字典信息确认数据库中应经存在的服务(service)
SQL> @/home/oracle/workshop/service #service.sql的语句在最后
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG
使用SRVCTL工具添加service,service只会把信息记录到OCR中,但是不会记录在数据字典里,也不会启动sevice
[oracle@rac1 ~]$ srvctl add service -d rac -s ts -r rac1 -a rac2 -P basic
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 10:53:25 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> @/home/oracle/workshop/service
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
[oracle@rac1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.rac.db application ONLINE ONLINE rac2
ora....c1.inst application ONLINE ONLINE rac1
ora....c2.inst application ONLINE ONLINE rac2
ora.rac.tjs.cs application ONLINE ONLINE rac2
ora....ac1.srv application ONLINE ONLINE rac2
ora.rac.ts.cs application OFFLINE OFFLINE
ora....ac1.srv 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
使用命令启动service,这时service的信息会记录到数据字典dba_service当中
[oracle@rac1 ~]$ srvctl start service -d rac -s ts
[oracle@rac1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.rac.db application ONLINE ONLINE rac2
ora....c1.inst application ONLINE ONLINE rac1
ora....c2.inst application ONLINE ONLINE rac2
ora.rac.tjs.cs application ONLINE ONLINE rac2
ora....ac1.srv application ONLINE ONLINE rac2
ora.rac.ts.cs application ONLINE ONLINE rac1
ora....ac1.srv application ONLINE ONLINE rac1
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 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 10:54:21 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> @/home/oracle/workshop/service
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG
ts NONE LONG

使用DBMS_SERVICE包修改FAILOVER配置选项
SQL> begin
2 dbms_service.modify_service(
3 service_name=>'ts',
4 failover_method =>dbms_service.failover_method_basic,
5 failover_type =>dbms_service.failover_type_select,
6 failover_retries =>180,
7 failover_delay=>5);
8 end;
9 /
PL/SQL procedure successfully completed.

SQL> @/home/oracle/workshop/service
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG
ts BASIC SELECT NONE LONG

将来客户端连接的时候,可以有两种选择:
1.通过tnsnames.ora ,只需要在客户端连接字符串中提供服务名就可以
RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ts)
)
)

2.使用Oracle的EASY CONNECT方法就可以连接到数据库,客户端不需要做配置,只要提供刚刚配置好的服务名,就可以连接,并且具备failover的功能
SQL> conn system/oracle@192.168.1.10/ts
Connected.
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac1

在节点1,使用shutdown abort命令关闭实例rac1,模拟故障,再做查询时,连接自动切换到rac2实例。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac2

删除服务时,服务应该是在关闭状态,否则会报错
[oracle@rac1 ~]$ srvctl remove service -d rac -s ts
ts PREF: rac1 AVAIL: rac2
Remove service ts from the database rac? (y/
) y
PRKP-1024 : The service ts is still running.

[oracle@rac1 ~]$ srvctl stop service -d rac -s ts
[oracle@rac1 ~]$ srvctl remove service -d rac -s ts
ts PREF: rac1 AVAIL: rac2
Remove service ts from the database rac? (y/
) y
[oracle@rac1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.rac.db application ONLINE ONLINE rac2
ora....c1.inst application ONLINE ONLINE rac1
ora....c2.inst application ONLINE ONLINE rac2
ora.rac.tjs.cs application ONLINE ONLINE rac2
ora....ac1.srv application ONLINE ONLINE rac1
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

使用srvctl删除服务,只是清掉OCR中的信息,数据库的数据字典中信息依然存在,需要通过dbms_service.delete_service删除
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 11:07:17 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> @/home/oracle/workshop/service
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG
ts BASIC SELECT NONE LONG
SQL> exec dbms_service.delete_service('ts');
PL/SQL procedure successfully completed.
SQL> @/home/oracle/workshop/service
NAME FAILOVER_M FAILOVER_T GOAL CLB_G
---------------------------------------- ---------- ---------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
seeddataXDB LONG
seeddata.regress.rdbms.dev.us.oracle.com LONG
racXDB LONG
rac LONG
tjs BASIC SELECT LONG

service.sql脚本内容:
SQL> get /home/oracle/workshop/service.sql
set linesize 120
col name for a40
col failover_method for a10
col failover_type for a10
select name,failover_method,failover_type,goal,clb_goal from dba_services;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: