暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 10g RAC Failover(四)

原创 黄宸宁 2013-04-17
810

oracle 10g RAC Failover(一)

oracle 10g RAC Failover(二)

oracle 10g RAC Failover(三)

三、Service-Side TAF

1、在使用services之前,需要首先检查集群的配置是否正确。

[oracle@orlrac1 ~]$ 
[oracle@orlrac1 ~]$ srvctl config database -d orcldb
orlrac1 orcldb1 /u01/oracle/product/10.2.0/db_1
orlrac2 orcldb2 /u01/oracle/product/10.2.0/db_1
[oracle@orlrac1 ~]$

2、查看service配置


[oracle@orlrac1 ~]$ 
[oracle@orlrac1 ~]$ srvctl config service -d orcldb
[oracle@orlrac1 ~]$
---目前未配置service
SQL>
SQL> show parameter service

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string orcldb
SQL>
SQL>
SQL>
SQL> set lines 200
SQL> set pages 200
SQL> col name for a40
SQL> col failover_method for a40
SQL> col failover_type for a40
SQL> col network_name for a40
SQL>
SQL> select name,failover_method,network_name,failover_type,goal,clb_goal from dba_services;

NAME FAILOVER_METHOD NETWORK_NAME FAILOVER_TYPE GOAL CLB_G
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
orcldbXDB orcldbXDB LONG
orcldb orcldb LONG

SQL>
SQL>
[oracle@orlrac1 ~]$
[oracle@orlrac1 ~]$ ps -ef|grep tns
root 13 2 0 Apr16 ? 00:00:00 [netns]
oracle 5056 1 0 Apr16 ? 00:00:00 /u01/oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER_ORLRAC1 -inherit
oracle 32442 30833 0 00:06 pts/1 00:00:00 grep tns
[oracle@orlrac1 ~]$
[oracle@orlrac1 ~]$
[oracle@orlrac1 ~]$ lsnrctl status LISTENER_ORLRAC1

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 17-APR-2013 00:06:46

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=orlrac1-vip)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
Alias LISTENER_ORLRAC1
Version TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date 16-APR-2013 22:57:22
Uptime 0 days 1 hr. 9 min. 24 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/oracle/product/10.2.0/db_1/network/log/listener_orlrac1.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.112)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.111)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "orcldb" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcldbXDB" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcldb_XPT" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@orlrac1 ~]$


[oracle@orlrac1 admin]$ cat listener.ora
# listener.ora.orlrac1 Network Configuration File: /u01/oracle/product/10.2.0/db_1/network/admin/listener.ora.orlrac1
# Generated by Oracle configuration tools.

LISTENER_ORLRAC1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac1-vip)(PORT = 1521)(IP = FIRST))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.111)(PORT = 1521)(IP = FIRST))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
)
)

[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

ORCLDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldb)
(INSTANCE_NAME = orcldb2)
)
)

ORCLDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldb)
(INSTANCE_NAME = orcldb1)
)
)

LISTENERS_ORCLDB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac2-vip)(PORT = 1521))
)

ORCLDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = orlrac2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldb)
)
)

[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$


[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.orcldb.db application ONLINE ONLINE orlrac2
ora....b1.inst application ONLINE ONLINE orlrac1
ora....b2.inst application ONLINE ONLINE orlrac2
ora....SM1.asm application ONLINE ONLINE orlrac1
ora....C1.lsnr application ONLINE ONLINE orlrac1
ora....ac1.gsd application ONLINE ONLINE orlrac1
ora....ac1.ons application ONLINE ONLINE orlrac1
ora....ac1.vip application ONLINE ONLINE orlrac1
ora....SM2.asm application ONLINE ONLINE orlrac2
ora....C2.lsnr application ONLINE ONLINE orlrac2
ora....ac2.gsd application ONLINE ONLINE orlrac2
ora....ac2.ons application ONLINE ONLINE orlrac2
ora....ac2.vip application ONLINE ONLINE orlrac2
[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$

A、利用dbca配置了orcltaf的service
利用dbca配置了orcltaf的service

1). 运行DBCA,选择ORACLE RAC Application Clusters database
2). 在第二个界面选择:Services Management
3). 第三个界面会出现RAC 数据库列表,用户可以在这个列表中选择要配置Service 的数据库
4). 在Serice配置界面中,单击Add 创建新的Service,输入service名字。在Instance列表框定义实例角色,选择那个service1 作为 Preferred(首选实例),
Service2 作为availiable(后备实例)。 TAF Policy有三个选项: None, Basic,Pre-connect。 我们选Basic。 最后点击Finish,完成Service 配置。
5)在结束Service配置后,服务会自动启动。

可以参考oracle 10g RAC Failover(一)中的图解

B、利用srvctl配置了orcltaf的service
1、利用srvctl命令创建service


Srvctl add service -d <database-name> -s <service-name> -r "preferred-instance-list" -a "available-instance-list" -P <TAF-policy>

srvctl add service -d orcldb -s orcltafsrv -r orcldb1 -a orcldb2 -P basic



[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ srvctl add service -d orcldb -s orcltafsrv -r orcldb1 -a orcldb2 -P basic
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ ./crs_stat.sh
Resource name Target State
-------------- ------ -----
ora.orcldb.db ONLINE ONLINE on orlrac2
ora.orcldb.orcldb1.inst ONLINE ONLINE on orlrac1
ora.orcldb.orcldb2.inst ONLINE ONLINE on orlrac2
ora.orcldb.orcltaf.cs ONLINE ONLINE on orlrac1
ora.orcldb.orcltaf.orcldb1.srv ONLINE ONLINE on orlrac1
ora.orcldb.orcltafsrv.cs OFFLINE OFFLINE ---新增的服务
ora.orcldb.orcltafsrv.orcldb1.srv OFFLINE OFFLINE ---新增的服务
ora.orlrac1.ASM1.asm ONLINE ONLINE on orlrac1
ora.orlrac1.LISTENER_ORLRAC1.lsnr ONLINE ONLINE on orlrac1
ora.orlrac1.gsd ONLINE ONLINE on orlrac1
ora.orlrac1.ons ONLINE ONLINE on orlrac1
ora.orlrac1.vip ONLINE ONLINE on orlrac1
ora.orlrac2.ASM2.asm ONLINE ONLINE on orlrac2
ora.orlrac2.LISTENER_ORLRAC2.lsnr ONLINE ONLINE on orlrac2
ora.orlrac2.gsd ONLINE ONLINE on orlrac2
ora.orlrac2.ons ONLINE ONLINE on orlrac2
ora.orlrac2.vip ONLINE ONLINE on orlrac2
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$

----srvctl创建服务后不会自动online,需要手动online

srvctl start service -d orcldb -s orcltafsrv

[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ srvctl start service -d orcldb -s orcltafsrv
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ ./crs_stat.sh
Resource name Target State
-------------- ------ -----
ora.orcldb.db ONLINE ONLINE on orlrac2
ora.orcldb.orcldb1.inst ONLINE ONLINE on orlrac1
ora.orcldb.orcldb2.inst ONLINE ONLINE on orlrac2
ora.orcldb.orcltaf.cs ONLINE ONLINE on orlrac1
ora.orcldb.orcltaf.orcldb1.srv ONLINE ONLINE on orlrac1
ora.orcldb.orcltafsrv.cs ONLINE ONLINE on orlrac1
ora.orcldb.orcltafsrv.orcldb1.srv ONLINE ONLINE on orlrac1
ora.orlrac1.ASM1.asm ONLINE ONLINE on orlrac1
ora.orlrac1.LISTENER_ORLRAC1.lsnr ONLINE ONLINE on orlrac1
ora.orlrac1.gsd ONLINE ONLINE on orlrac1
ora.orlrac1.ons ONLINE ONLINE on orlrac1
ora.orlrac1.vip ONLINE ONLINE on orlrac1
ora.orlrac2.ASM2.asm ONLINE ONLINE on orlrac2
ora.orlrac2.LISTENER_ORLRAC2.lsnr ONLINE ONLINE on orlrac2
ora.orlrac2.gsd ONLINE ONLINE on orlrac2
ora.orlrac2.ons ONLINE ONLINE on orlrac2
ora.orlrac2.vip ONLINE ONLINE on orlrac2
[oracle@orlrac1 rs]$

2、查看service的配置信息


srvctl config service -d database-name [-s service-name] [-a]

[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ srvctl config service -d orcldb -s orcltafsrv -a
orcltafsrv PREF: orcldb1 AVAIL: orcldb2 TAF: basic
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$ lsnrctl status LISTENER_ORLRAC1

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 17-APR-2013 16:01:33

Copyright (c) 1991, 2010, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=orlrac1-vip)(PORT=1521)(IP=FIRST)))
STATUS of the LISTENER
------------------------
Alias LISTENER_ORLRAC1
Version TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Start Date 17-APR-2013 10:56:02
Uptime 0 days 5 hr. 5 min. 31 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/oracle/product/10.2.0/db_1/network/log/listener_orlrac1.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.112)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.111)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "+ASM_XPT" has 1 instance(s).
Instance "+ASM1", status BLOCKED, has 1 handler(s) for this service...
Service "orcldb" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcldbXDB" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcldb_XPT" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcltaf" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
Service "orcltafsrv" has 1 instance(s).
Instance "orcldb1", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@orlrac1 rs]$
[oracle@orlrac1 rs]$

SQL>
SQL> set lines 200
SQL> set pages 200
SQL> col name for a40
SQL> col failover_method for a40
SQL> col failover_type for a40
SQL> col network_name for a40
SQL>
SQL> select name,failover_method,network_name,failover_type,goal,clb_goal from dba_services;

NAME FAILOVER_METHOD NETWORK_NAME FAILOVER_TYPE GOAL CLB_G
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
orcldbXDB orcldbXDB LONG
orcldb orcldb LONG
orcltaf BASIC orcltaf SESSION NONE LONG
orcltafsrv orcltafsrv NONE LONG

6 rows selected.

SQL>

查看tnsnames.ora和listener.ora文件,发现未像通过DBCA那样在自动在tnsnames中添加相应的内容


3、通过Dbms_service配置type、retries、delay


Begin
Dbms_service.modify_service(
SERVICE_NAME=>'orcltafsrv',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_session,
Failover_retries=>180,
Failover_delay=>5
);
End;


[oracle@orlrac1 admin]$
[oracle@orlrac1 admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.5.0 - Production on Wed Apr 17 16:20:28 2013

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL>
SQL> Begin
2 Dbms_service.modify_service(
3 SERVICE_NAME=>'orcltafsrv',
4 Failover_method=>dbms_service.failover_method_basic,
5 Failover_type=>dbms_service.failover_type_session,
6 Failover_retries=>180,
7 Failover_delay=>5
8 );
9 End;
10 /

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> set lines 200
SQL> set pages 200
SQL> col name for a40
SQL> col failover_method for a40
SQL> col failover_type for a40
SQL> col network_name for a40
SQL>
SQL> select name,failover_method,network_name,failover_type,goal,clb_goal from dba_services;

NAME FAILOVER_METHOD NETWORK_NAME FAILOVER_TYPE GOAL CLB_G
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ------------ -----
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
orcldbXDB orcldbXDB LONG
orcldb orcldb LONG
orcltaf BASIC orcltaf SESSION NONE LONG
orcltafsrv BASIC orcltafsrv SESSION NONE LONG

6 rows selected.

SQL>
SQL>

4、在客户端进行配置


ORCLTAFSRV =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.112)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.114)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcltafsrv)
)
)

5、测试failover
运行测试脚本,运行过程中abort 1号节点

[oracle@hcn10g script]$ 
[oracle@hcn10g script]$ cat loginfail3.sh
sqlplus -s scott/oracle@orcltafsrv <<EOF>fail3.log
set lines 200
col object_name for a40
select instance_name from v$instance
/
select object_name,object_id from dba_objects
/
select instance_name from v$instance
/
exit
EOF
[oracle@hcn10g script]$


[oracle@hcn10g script]$
[oracle@hcn10g script]$ ksh loginfail3.sh
[oracle@hcn10g script]$
[oracle@hcn10g script]$ head -5 fail3.log

INSTANCE_NAME
----------------
orcldb1

[oracle@hcn10g script]$
[oracle@hcn10g script]$ tail -20 fail3.log
---------------------------------------- ----------
SYS_LOB0000041714C00144$$ 41869
SYS_LOB0000041714C00143$$ 41867
SYS_LOB0000041714C00142$$ 41865
SYS_LOB0000041714C00141$$ 41863
SYS_LOB0000041714C00140$$ 41861
SYS_LOB0000041714C00139$$ 41859
SYS_LOB0000041714C00135$$ 41857
ERROR:
ORA-25401: can not continue fetches



41070 rows selected.


INSTANCE_NAME
----------------
orcldb2

[oracle@hcn10g script]$
[oracle@hcn10g script]$ cat fail3.log|wc -l
52289
[oracle@hcn10g script]$
[oracle@hcn10g script]$

由于配置的是session类型的TAF,所以1号节点abort以后可以直接切换到实例2上面,但是SQL语句会中断,测试select类型的TAF方法类似,只是在1号节点abort以后直接切换到实例2上面,SQL语句不会中断,会继续输出剩余的结果

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论