oracle 11G 客户端连接数据库 SCAN 和 TAF的方式和区别

本文介绍Oracle数据库中客户端和服务端透明应用故障转移(TAF)的多种配置方式及其实现效果,包括SCANIP、VIP连接等不同场景下的故障转移表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、客户端通过SCAN IP连接数据库

  客户端配置:

[html] view plain copy
  1. 214 =  
  2.   (DESCRIPTION =  
  3.     (ADDRESS_LIST =  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.214)(PORT = 1521))  
  5.     )  
  6.     (CONNECT_DATA =  
  7.       (SERVICE_NAME = orcl)  
  8.     )  
  9.   )  
  客户端连接

[html] view plain copy
  1. C:\Users\zylong>sqlplus sys/oracle@214 as sysdba  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac2                  orcl2  

  实例orcl2发生故障

[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  
  此时客户端的连接断开,需要重新连接数据库来实现故障转移

[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2. ORA-03113: 通信通道的文件结尾  
  3. 进程 ID: 12874  
  4. 会话 ID: 50 序列号: 49  
  5.   
  6. SQL> select host_name,instance_name from v$instance;  
  7. ERROR:  
  8. ORA-03114: 未连接到 ORACLE  
  9.   
  10. SQL> exit  
  11.   
  12. C:\Users\zylong>sqlplus sys/oracle@214 as sysdba  
  13.   
  14. SQL> select host_name,instance_name from v$instance;  
  15.   
  16. HOST_NAME                 INSTANCE_NAME  
  17. ------------------------- ----------------  
  18. 0906rac1                  orcl1  


二、客户端通过VIP连接数据库

  客户端配置:

[html] view plain copy
  1. 212-213 =  
  2.   (DESCRIPTION =  
  3.     (ADDRESS_LIST =  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.212)(PORT = 1521))  
  5.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.213)(PORT = 1521))  
  6.     )  
  7.     (CONNECT_DATA =  
  8.       (SERVICE_NAME = orcl)  
  9.     )  
  10.   )  
  11. 注:  
  12. 客户端连接会一直连上面的IP(212),后面不管开多少个连接都会连到第一个IP(212)上  
  13. 当客户端连接一个实例后,如果这个实例挂掉,客户端不能自动切换到另一个节点,需要客户端断掉后重新连接才能连接到另一个节点  
   客户端连接

[html] view plain copy
  1. C:\Users\zylong>sqlplus sys/oracle@212-213 as sysdba  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac1                  orcl1  
   实例orcl1发生故障
[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  
   此时客户端的连接断开,需要重新连接数据库来实现故障转移

[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2. ORA-03113: 通信通道的文件结尾  
  3. 进程 ID: 14841  
  4. 会话 ID: 35 序列号: 11  
  5.   
  6. SQL> select host_name,instance_name from v$instance;  
  7. ERROR:  
  8. ORA-03114: 未连接到 ORACLE  
  9.   
  10. SQL> exit  
  11.   
  12. C:\Users\zylong>sqlplus sys/oracle@212-213 as sysdba  
  13.   
  14. SQL> select host_name,instance_name from v$instance;  
  15.   
  16. HOST_NAME                 INSTANCE_NAME  
  17. ------------------------- ----------------  
  18. 0906rac2                  orcl2  

三、客户端通过Client Side TAF连接数据库,使用BASIC方式
   客户端配置:

[html] view plain copy
  1. 212_213 =  
  2.   (DESCRIPTION =  
  3.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.213)(PORT = 1521))  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.212)(PORT = 1521))  
  5.       (LOAD_BALANCE = on)  
  6.       (CONNECT_DATA =  
  7.          (SERVICE_NAME = orcl)  
  8.          (SERVER = DEDICATED)  
  9.          (FAILOVER_MODE =  
  10.             (TYPE = session)  
  11.             (METHOD =basic)  
  12.             (RETRIES=180)  
  13.             (DELAY=5)  
  14.           )  
  15.        )  
  16.     )  
   客户端连接

[html] view plain copy
  1. C:\Users\zylong>sqlplus sys/oracle@212_213 as sysdba  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac2                  orcl2  
   实例orcl2发生故障

[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  
   此时客户端的连接不会断开,但是会出现报错,接着转移到其他实例上。

  其实这个地方的切换连接会慢一点,但是不需要客户端重新连接。

[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2. ORA-25408: 无法安全重放调用  
  3.   
  4. SQL> select host_name,instance_name from v$instance;  
  5.   
  6. HOST_NAME                 INSTANCE_NAME  
  7. ------------------------- ----------------  
  8. 0906rac1                  orcl1  


四、客户端通过 Client Side TAF 连接数据库,使用preconnect 方式
   客户端配置:

[html] view plain copy
  1. 212_213 =  
  2.   (DESCRIPTION =  
  3.       (ADDRESS_LIST =  
  4.           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.213)(PORT = 1521))  
  5.        )  
  6.       (CONNECT_DATA =  
  7.          (SERVICE_NAME = orcl)  
  8.          (SERVER = DEDICATED)  
  9.          (FAILOVER_MODE =  
  10.             (TYPE = session)  
  11.             (METHOD = preconnect)  
  12.             (BACKUP = 212213)  
  13.           )  
  14.        )  
  15.     )  
  16.   
  17. 212213 =  
  18.   (DESCRIPTION =  
  19.       (ADDRESS_LIST =  
  20.           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.212)(PORT = 1521))  
  21.        )  
  22.       (CONNECT_DATA =  
  23.          (SERVICE_NAME = orcl)  
  24.          (SERVER = DEDICATED)  
  25.          (FAILOVER_MODE =  
  26.             (TYPE = session)  
  27.             (METHOD = preconnect)  
  28.             (BACKUP = 212_213)  
  29.           )  
  30.        )  
  31.     )  
   客户端连接

[html] view plain copy
  1. C:\Users\zylong>sqlplus sys/oracle@212_213 as sysdba  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac2                  orcl2  
   实例orcl2发生故障

[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  

  此时客户端的连接不会断开,但是会出现报错,接着转移到其他实例上。

  其实这个地方的切换连接会非常快,并且不需要客户端重新连接,但是需要消耗数据库连接数

[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2. ORA-25408: 无法安全重放调用  
  3.   
  4. SQL> select host_name,instance_name from v$instance;  
  5.   
  6. HOST_NAME                 INSTANCE_NAME  
  7. ------------------------- ----------------  
  8. 0906rac1                  orcl1  

 关于Client Side TAF配置Preconnect方式可以参考:

 How to Configure Client Side Transparent Application Failover with Preconnect Option (文档 ID 802434.1)

 

五、客户端通过 Server Side TAF 连接数据库,只能使用BASIC 方式
  在server端配置TAF

[html] view plain copy
  1. 添加服务  
  2. [oracle@0906rac2 ~]$ srvctl add service -d orcl -s server_taf -r "orcl1,orcl2" -P BASIC  
  3. 启动服务  
  4. [grid@0906rac1 ~]$ srvctl start service -d orcl -s server_taf  
  5. 查看服务状态  
  6. [grid@0906rac1 ~]$ crsctl stat res -t  
  7. --------------------------------------------------------------------------------  
  8. NAME           TARGET  STATE        SERVER                   STATE_DETAILS         
  9. --------------------------------------------------------------------------------  
  10. Local Resources  
  11. --------------------------------------------------------------------------------  
  12. ora.ARCH.dg  
  13.                ONLINE  ONLINE       0906rac1                                       
  14.                ONLINE  ONLINE       0906rac2                                       
  15. ora.CRS.dg  
  16.                ONLINE  ONLINE       0906rac1                                       
  17.                ONLINE  ONLINE       0906rac2                                       
  18. ora.DATA.dg  
  19.                ONLINE  ONLINE       0906rac1                                       
  20.                ONLINE  ONLINE       0906rac2                                       
  21. ora.LISTENER.lsnr  
  22.                ONLINE  ONLINE       0906rac1                                       
  23.                ONLINE  ONLINE       0906rac2                                       
  24. ora.asm  
  25.                ONLINE  ONLINE       0906rac1                 Started               
  26.                ONLINE  ONLINE       0906rac2                 Started               
  27. ora.gsd  
  28.                OFFLINE OFFLINE      0906rac1                                       
  29.                OFFLINE OFFLINE      0906rac2                                       
  30. ora.net1.network  
  31.                ONLINE  ONLINE       0906rac1                                       
  32.                ONLINE  ONLINE       0906rac2                                       
  33. ora.ons  
  34.                ONLINE  ONLINE       0906rac1                                       
  35.                ONLINE  ONLINE       0906rac2                                       
  36. ora.registry.acfs  
  37.                ONLINE  ONLINE       0906rac1                                       
  38.                ONLINE  ONLINE       0906rac2                                       
  39. --------------------------------------------------------------------------------  
  40. Cluster Resources  
  41. --------------------------------------------------------------------------------  
  42. ora.0906rac1.vip  
  43.       1        ONLINE  ONLINE       0906rac1                                       
  44. ora.0906rac2.vip  
  45.       1        ONLINE  ONLINE       0906rac2                                       
  46. ora.LISTENER_SCAN1.lsnr  
  47.       1        ONLINE  ONLINE       0906rac1                                       
  48. ora.cvu  
  49.       1        ONLINE  ONLINE       0906rac1                                       
  50. ora.oc4j  
  51.       1        ONLINE  ONLINE       0906rac1                                       
  52. ora.orcl.db  
  53.       1        ONLINE  ONLINE       0906rac1                 Open                  
  54.       2        ONLINE  ONLINE       0906rac2                 Open                  
  55. ora.orcl.server_taf.svc  
  56.       1        ONLINE  ONLINE       0906rac1                                       
  57.       2        ONLINE  ONLINE       0906rac2                                       
  58. ora.scan1.vip  
  59.       1        ONLINE  ONLINE       0906rac1  

[html] view plain copy
  1. SQL> show parameter service  
  2.   
  3. NAME                  TYPE        VALUE  
  4. --------------------- ----------- -------------  
  5. service_names         string      server_taf  
  6.   
  7. SQL> select name,service_id from dba_services where name = 'server_taf';   
  8.   
  9. NAME                           SERVICE_ID  
  10. ------------------------------ ----------  
  11. server_taf                              3  
  12.   
  13. col name format a15    
  14. col failover_method format a11 heading 'METHOD'   
  15. col failover_type format a10 heading 'TYPE'   
  16. col failover_retries format 9999999 heading 'RETRIES'   
  17. col goal format a10   
  18. col clb_goal format a8   
  19. col AQ_HA_NOTIFICATIONS format a5 heading 'AQNOT'   
  20. select name, failover_method, failover_type, failover_retries,goal, clb_goal,aq_ha_notifications from dba_services where service_id = 3;  
  21.   
  22. NAME            METHOD      TYPE        RETRIES GOAL       CLB_GOAL AQNOT  
  23. --------------- ----------- ---------- -------- ---------- -------- -----  
  24. server_taf      NONE        NONE              0 NONE       LONG     NO  
  25.   
  26. 配置参数  
  27. begin  
  28. dbms_service.modify_service (  
  29. service_name => 'server_taf',  
  30. aq_ha_notifications => true,  
  31. failover_method => dbms_service.failover_method_basic,  
  32. failover_type => dbms_service.failover_type_select,  
  33. failover_retries => 180,  
  34. failover_delay => 5,  
  35. clb_goal => dbms_service.clb_goal_long);   
  36. end;  
  37. /  
  38.   
  39. 删除方法  
  40. begin  
  41. DBMS_SERVICE.DELETE_SERVICE('server_taf');  
  42. end;  
  43. /  

  11G R2需要修改service配置

[html] view plain copy
  1. [oracle@0906rac2 ~]$ srvctl modify service -d ORCL -s server_taf -m BASIC -e SELECT -q TRUE -j LONG  
  2. [oracle@0906rac2 ~]$ srvctl config service -d orcl  
  3. Service name: server_taf  
  4. Service is enabled  
  5. Server pool: orcl_server_taf  
  6. Cardinality: 2  
  7. Disconnect: false  
  8. Service role: PRIMARY  
  9. Management policy: AUTOMATIC  
  10. DTP transaction: false  
  11. AQ HA notifications: true  
  12. Failover type: SELECT  
  13. Failover method: BASIC  
  14. TAF failover retries: 0  
  15. TAF failover delay: 0  
  16. Connection Load Balancing Goal: LONG  
  17. Runtime Load Balancing Goal: NONE  
  18. TAF policy specification: BASIC  
  19. Edition:   
  20. Preferred instances: orcl1,orcl2  
  21. Available instances:   

[html] view plain copy
  1. col name format a15    
  2. col failover_method format a11 heading 'METHOD'   
  3. col failover_type format a10 heading 'TYPE'   
  4. col failover_retries format 9999999 heading 'RETRIES'   
  5. col goal format a10   
  6. col clb_goal format a8   
  7. col AQ_HA_NOTIFICATIONS format a5 heading 'AQNOT'   
  8. select name, failover_method, failover_type, failover_retries,goal, clb_goal,aq_ha_notifications from dba_services where service_id = 3;  
  9.   
  10. NAME            METHOD      TYPE        RETRIES GOAL       CLB_GOAL AQNOT  
  11. --------------- ----------- ---------- -------- ---------- -------- -----  
  12. server_taf      BASIC       SELECT            0 NONE       LONG     YES  
  13.   
  14. 如果不生效,重新配置参数  
  15.   
  16. SQL> begin  
  17.   2  dbms_service.modify_service (  
  18.   3  service_name => 'server_taf',  
  19.   4  aq_ha_notifications => true,  
  20.   5  failover_method => dbms_service.failover_method_basic,  
  21.   6  failover_type => dbms_service.failover_type_select,  
  22.   7  failover_retries => 180,  
  23.   8  failover_delay => 5,  
  24.   9  clb_goal => dbms_service.clb_goal_long);   
  25.  10  end;  
  26.  11  /  
  27.   
  28. PL/SQL procedure successfully completed.  
  29.   
  30. SQL> col name format a15    
  31. SQL> col failover_method format a11 heading 'METHOD'   
  32. SQL> col failover_type format a10 heading 'TYPE'   
  33. SQL> col failover_retries format 9999999 heading 'RETRIES'   
  34. SQL> col goal format a10   
  35. SQL> col clb_goal format a8   
  36. SQL> col AQ_HA_NOTIFICATIONS format a5 heading 'AQNOT'   
  37. SQL> select name, failover_method, failover_type, failover_retries,goal, clb_goal,aq_ha_notifications from dba_services where service_id = 3;  
  38.   
  39. NAME            METHOD      TYPE        RETRIES GOAL       CLB_GOAL AQNOT  
  40. --------------- ----------- ---------- -------- ---------- -------- -----  
  41. server_taf      BASIC       SELECT          180 NONE       LONG     YES  

  查看service监听状态

[html] view plain copy
  1. [oracle@0906rac2 ~]$ lsnrctl services   
  2.   
  3. LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 18-OCT-2016 16:15:47  
  4.   
  5. Copyright (c) 1991, 2013, Oracle.  All rights reserved.  
  6.   
  7. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))  
  8. Services Summary...  
  9. Service "+ASM" has 1 instance(s).  
  10.   Instance "+ASM2", status READY, has 1 handler(s) for this service...  
  11.     Handler(s):  
  12.       "DEDICATED" established:0 refused:0 state:ready  
  13.          LOCAL SERVER  
  14. Service "orcl" has 1 instance(s).  
  15.   Instance "orcl2", status READY, has 1 handler(s) for this service...  
  16.     Handler(s):  
  17.       "DEDICATED" established:0 refused:0 state:ready  
  18.          LOCAL SERVER  
  19. Service "orclXDB" has 1 instance(s).  
  20.   Instance "orcl2", status READY, has 1 handler(s) for this service...  
  21.     Handler(s):  
  22.       "D000" established:0 refused:0 current:0 max:1022 state:ready  
  23.          DISPATCHER <machine: 0906rac2, pid: 15756>  
  24.          (ADDRESS=(PROTOCOL=tcp)(HOST=0906rac2)(PORT=19341))  
  25. Service "server_taf" has 1 instance(s).  
  26.   Instance "orcl2", status READY, has 1 handler(s) for this service...  
  27.     Handler(s):  
  28.       "DEDICATED" established:0 refused:0 state:ready  
  29.          LOCAL SERVER  
  30. The command completed successfully  
   客户端配置,使用VIP:

[html] view plain copy
  1. SERVER_TAF =  
  2.   (DESCRIPTION =  
  3.     (ADDRESS_LIST =  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.212)(PORT = 1521))  
  5.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.213)(PORT = 1521))  
  6.     )  
  7.     (CONNECT_DATA =  
  8.       (SERVICE_NAME = server_taf)  
  9.     )  
  10.   )  
   客户端连接

[html] view plain copy
  1. C:\Users\zylong>sqlplus system/oracle@server_taf  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac1                  orcl1  

  实例orcl1发生故障

[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  
   此时客户端的连接不会断开,也不会出现报错,使用BASIC方式转移到其他实例上。
[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2.   
  3. HOST_NAME                 INSTANCE_NAME  
  4. ------------------------- ----------------  
  5. 0906rac2                  orcl2  


   客户端配置,使用SCAN IP:

[html] view plain copy
  1. SCAN_TAF =  
  2.   (DESCRIPTION =  
  3.     (ADDRESS_LIST =  
  4.       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.214)(PORT = 1521))  
  5.     )  
  6.     (CONNECT_DATA =  
  7.       (SERVICE_NAME = server_taf)  
  8.     )  
  9.   )  
   客户端连接
[html] view plain copy
  1. C:\Users\zylong>sqlplus system/oracle@SCAN_TAF  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac1                  orcl1  
   实例orcl1发生故障

[html] view plain copy
  1. SQL> shutdown abort  
  2. ORACLE instance shut down.  
   此时客户端的连接不会断开,也不会出现报错,使用 BASIC方式 转移到其他实例上。
[html] view plain copy
  1. SQL> select host_name,instance_name from v$instance;  
  2.   
  3. HOST_NAME                 INSTANCE_NAME  
  4. ------------------------- ----------------  
  5. 0906rac2                  orcl2  

   关于Server  Side TAF配置 可以参考:

  How To Configure Server Side Transparent Application Failover (文档 ID 460982.1)

  但是Server Side TAF不能使用sqlplus sys/oracle@server_taf as sysdba 实现透明切换,如果要实现,需要特殊配置:

  SYSDBA Sessions Do Not Failover with SRVCTL TAF Configured (文档 ID 1342992.1)

[html] view plain copy
  1. C:\Users\zylong>sqlplus sys/oracle@server_taf as sysdba  
  2.   
  3. SQL> select host_name,instance_name from v$instance;  
  4.   
  5. HOST_NAME                 INSTANCE_NAME  
  6. ------------------------- ----------------  
  7. 0906rac1                  orcl1  
  8.   
  9. SQL> shutdown abort  
  10. ORACLE instance shut down.  
  11.   
  12. SQL> select host_name,instance_name from v$instance;  
  13. select host_name,instance_name from v$instance  
  14. *  
  15. 第 1 行出现错误:  
  16. ORA-03113: 通信通道的文件结尾  
  17. 进程 ID: 30737  
  18. 会话 ID: 32 序列号: 15  

  另外需要注意,Oracle JDBC thin驱动程序不支持TAF。 TAF仅受JDBC OCI驱动程序支持。

  Is Transparent Application Failover (TAF) Supported on the JDBC Thin Driver? (文档 ID 297490.1)

  WebLogic Server(WLS)使用Oracle Thin驱动程序,而不是OCI驱动程序,不支持TAF。

  Does WebLogic Server (WLS) Support Oracle RAC with TAF? (文档 ID 950174.1)

  使用JDBC OCI的配置方式,参考:

  How to Setup SQL Developer to support Transparent Application Failover (TAF) (文档 ID 1389747.1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值