`
ppgunjack
  • 浏览: 81184 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何在data guard环境做到client的自动切换

阅读更多

使用dataguard作为HA方案,要解决的一个问题在于:后台数据库发生了切换,client连接如何做到自动切到新的primary数据库上?

如果做通用的方案,需要客户端自己提供自动重连的能力,这点大多数java的occi的连接池都有实现。

但这些已有实现大多是对同一连接配置发起重连,所以需要考虑为application提供透明的连接方式,而不让应用看到具体dataguard的多个ip和service name,这就需要做些额外的配置工作。

一种方式通过vip,真实转发的ip只挂靠在有效数据库的ip上。这种方式切换发生后,application在断连的旧connection上发起dml会获得ORA-3113 "end of file on communication channel"的错误,此时application可以尝试重连机制和新的primary建立连接。

在f5上可以通过设置心跳sql和期望的返回结果内容,以类似ping方式获取远端数据库是否可用,来决定ip是否应该转发到该物理ip上。

另一种方式是通过设置tns和数据库暴露的service name来访问,通过合理设置,甚至可以做到在发生切换时的select操作仅仅被阻塞一会,而完全意识不到数据库已经完成了主备切换。

步骤如下:

 1.客户端的tnsnames.ora中tns配置成

MYAPP =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = HostA)(PORT = 1521))
 (ADDRESS = (PROTOCOL = TCP)(HOST = HostB)(PORT = 1521))
 )
 (CONNECT_DATA =
 (SERVICE_NAME = myapp)
 )
 )

 

2.在primary数据库运行

 begin
 dbms_service.create_service('myapp','myapp');
end;
/
begin
 DBMS_SERVICE.START_SERVICE('myapp');
end;
/

 3.在primary数据库创建触发器:

create trigger myapptrigg after startup on database
declare
 v_role varchar(30);
begin
 select database_role into v_role from v$database;
 if v_role = 'PRIMARY' then
 DBMS_SERVICE.START_SERVICE('myapp');
 else
 DBMS_SERVICE.STOP_SERVICE('myapp');
 end if;
end;
/

解释下:这个方案的思路就是将两边的数据库的service name都设置成'myapp',当发生切换时,由触发器在数据库startup的时候把primary的实例以'myapp'的名字暴露,而把standby的'myapp'服务名给停掉,这样任何时刻只有主节点暴露名字为'myapp'的服务。

注意这里的plsql都是跑在primary,无需在standby上做任何设置,因为dataguard会自动将变化同步到standby数据库。

通过在primary数据库运行下面程序,可以让客户端在做select的时候甚至意识不到数据库的切换:

begin
 dbms_service.modify_service
 ('myapp',
 FAILOVER_METHOD => 'BASIC',
 FAILOVER_TYPE => 'SELECT',
 FAILOVER_RETRIES => 200,
 FAILOVER_DELAY => 1);
end;
/

注意如果在切换时有comit的提交事务发生,还是会出现失误提交失败,要求回滚的情况。

 

下面tns是另一种配置方式,使用这种方式,不需要在oracle server中跑任何plsql脚本,在DESCRIPTION_LIST中的两个数据库甚至根本不需要处于dataguard中,可以是任意两个数据库。driver会按顺序遍历list中的数据库,一直到能连接上为止。

MYAPP = 
(DESCRIPTION_LIST=
 (LOAD_BALANCE=off) 
  (FAILOVER=on) 
  (DESCRIPTION =(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=10)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = myapp1)
    )
  )
  (DESCRIPTION =(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=10)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = otherIP)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = myapp2)
    )
  )
)

 

这种方式需要注意的地方:

1.jdbc必须走oci的方式,如果为jdbc:thin+tns方式,则会出现

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 545
 at oracle.net.nl.NVTokens.parseTokens(Unknown Source)
 at oracle.net.nl.NVFactory.createNVPair(Unknown Source)

其原因在于jdbc的driver本身无法识别这种格式的tns内容。

此时即使以jdbc:thin+tns的方式访问其他正常的tns也会一样抛出这个错误,因为这导致了jdbc根本无法正确解析整个tnsnames.ora文件。

而jdbc:oci实际上负责解析tnsnames.ora和处理通信的是依赖oci.lib,因此就不存在这个问题。

2.这种配置适用于任何依赖oci通信的客户端,包括oci,occi,一些基于它们的wrap库,以及pl/sql developer此类的工具软件。

3.注意如果连接的数据库组属于manually switch的模式,而不是fail down导致的切换,比如tns中的a数据库是mount状态,b是primary,而tns的列表顺序是先a后b,则会出现尽管客户端连a时,抛出ORA-0133错误,但是不会按顺序去尝试连接b。

原因是在处理这个链接时,oci客户端会尝试通过listener和service建立连接。

如果listener是关闭的,或者客户端能连上listener但是找不到对应service,则都会尝试连接处于第二个的b,但是如果通过listener找到了对端的service,只是无法建立连接(如数据库处于mount状态),则此时不会尝试连接b,而直接会以抛出

ORA-0133:ORACLE initialization or shutdown in progress

终止连接尝试。

所以在使用这种tns的时候要确保通过tns列表能访问到的所有数据库都不会一直处于mount状态,否则连接它会打断对后面正常open数据库的连接尝试。

这也是为何手动切换的dataguard数据库,客户端不能依赖这种tns配置方法做自动切换,因为手动切换的dataguard数据库状态肯定是一个open一个mount,如果mount处于tns的列表靠前的位置,在连接它失败后会抛出ORA-0133异常阻止客户端尝试连接正常open的那个数据库。

分享到:
评论

相关推荐

    oracle data guard配置文档

    根据提供的文件信息,本文将详细解析Oracle Data Guard配置的关键步骤及技术要点,旨在帮助初学者更好地理解并实施Data Guard环境的构建。 ### 一、Oracle Data Guard简介 Oracle Data Guard是一种高可用性解决...

    Windows环境下配置oracle-11gR2-Data-Guard详细过程

    本配置指南适用于在Windows环境下配置Oracle 11g R2 Data Guard。以下是具体的服务器环境设置: - **硬件环境**:两台PC机 - **操作系统**:Windows Server 2008 R2 - **Oracle版本**:Oracle 11.2.0.3 for Win32 ...

    windows下安装dataGuard.pdf

    - 管理者(Broker):一个可选的高级组件,用于自动化配置和管理Data Guard环境。 - 网络:确保主数据库和备用数据库之间网络连通性,以便数据能够被复制和同步。 3. Data Guard的工作原理: Data Guard通过日志...

    RedHat AS 3上的Oracle9.2.0.4 的Data Guard实现

    在Red Hat Advanced Server 3 (RedHat AS 3) 上实现Oracle 9.2.0.4 数据守护(Data Guard)是一种提高数据库可用性和灾难恢复能力的技术。Data Guard通过创建物理备用数据库(standby database),在主数据库出现问题时...

    oracle 多网卡dataguard

    在实施多NIC的Data Guard环境中,需要为每个数据库实例(主库和备库)分配一个独立的网络接口。这些接口应配置为不同的子网,以避免网络冲突。此外,网络配置应确保即使在一个网络出现问题时,redo日志的传输和监控...

    ORACLE RAC数据库配置Dataguard环境(2).doc

    在配置Data Guard环境时,首先需要在主数据库上创建备用数据库的初始化参数文件(SPFILE)。这一步至关重要,因为SPFILE包含了数据库运行所需的所有配置信息。在示例中,通过Primary DB的SPFILE创建了一个Standby的...

    rac to rac dataguard setup in 11.2.0.4

    7. Data Guard Broker配置:Data Guard Broker是一个自动化和集中管理Data Guard配置的工具。通过它,管理员可以管理Data Guard的相关组件,如主备数据库、应用保护模式、角色转换等。 8. 创建Data Guard配置:在...

    instantclient版本集合大全

    11g引入了许多新特性,如Automatic Memory Management、Real Application Clusters (RAC) 的改进、Data Guard增强以及更好的性能优化。Instant Client 11.1同样提供了多种平台的支持,并且在安全性和性能上有所提升...

    Oracle11gDataguard实例精讲(绝对详细)

    3. 故障切换:在必要时,可以通过Data Guard进行主备角色切换,以确保业务连续性。 通过以上步骤,你可以建立一个完整的Oracle 11g Data Guard环境,实现数据库的高可用性和灾难恢复能力。记得在配置过程中,每个...

    Oracle 10G dataguard配置详细过程

    在Data Guard环境中,可以通过`SWITCHOVER`或`FAILOVER`操作实现主备角色的切换,以应对主库发生故障的情况。 总结,Oracle 10G Data Guard的配置涉及多个层面,包括数据库设置、文件备份、初始化参数配置以及备用...

    11GR2创建dataguard.docx

    本文将基于“11GR2创建dataguard.docx”文档中的信息,深入解析如何在Oracle 11gR2环境下搭建Data Guard,特别针对在Linux AS5操作系统上进行配置的过程。 ### 一、环境配置 #### 操作系统与数据库版本 - **操作...

    DATAGUARE 配置与管理

    【 DATAGUARD 配置与管理:...在实际环境中,配置Data Guard需要谨慎操作,确保所有步骤都符合最佳实践,以达到预期的高可用性和数据保护效果。同时,理解并熟练掌握RMAN的使用,对于数据库管理员来说是至关重要的。

    【DATAGUARD】物理dg配置客户端无缝切换 (八.3)--客户端TAF 配置.pdf

    在Oracle Data Guard环境中,确保应用客户端能够在主库(Primary Database)与物理备库(Physical Standby Database)之间实现无缝切换对于提高系统的可用性和减少业务中断时间至关重要。本文将详细介绍如何通过配置...

    dataguard安装配置

    - **作用**:这些命令用于确保数据库能够在归档模式下运行,归档模式是 Data Guard 必需的一个条件。 3. **添加 Standby Log Files** - **命令**: ``` ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/...

    (绝对干货)Oracle ADG数据库完整部署、切换、备份、运维手册

    在本文档中,我们将详细介绍如何在阿里云ECS服务器上部署Oracle Active Data Guard (ADG) 并实现节点故障自动切换功能。此外,还将介绍如何处理常见的数据库异常故障,例如死锁和数据误删除等。 **部署平台**: 阿里...

    dataguard搭建

    在Linux环境下搭建 Data Guard 的步骤如下: 1. **创建环境**: - 确定主数据库和物理备用数据库的IP地址、SID、DB_UNIQUE_NAME、数据库软件位置和数据文件路径。例如,主数据库(orclp)和物理备用数据库(orcls...

    薛忠权(erik)最新项目实战Oracle 11g RAC DG项目实战

    Oracle 11g RAC (Real ...通过薛忠权的实战教程,学习者将深入理解 Oracle RAC 和 Data Guard 的核心概念,以及如何在实际环境中部署和管理这些技术。这不仅有助于提升技能,还能为处理复杂的数据库环境提供实践经验。

    HAInstantClient Oracle、Client

    2. **高可用性**:支持高可用性特性,如Data Guard、RAC等,确保即使在数据库服务出现故障时,应用也能持续运行。 3. **易于部署**:HAInstantClient可以独立于数据库服务器安装,简化了部署过程,且更新时只需替换...

    ORACLE11G搭建DATAGUARD步骤.pdf

    Oracle 11g 数据守护(Data Guard)是一种高可用性和灾难恢复解决方案,它通过创建一个备用数据库来保护生产数据库,确保在出现故障时能够迅速切换到备用数据库,从而最大限度地减少数据丢失。以下是对搭建 Oracle ...

    WIN200X下ORACLE安装DATAGUARD文档.txt

    ### Oracle Data Guard在Windows ...Data Guard不仅能够提高数据的安全性和可靠性,还能够在主数据库发生故障时迅速切换到备用数据库,从而保证业务的连续性。希望本文档能帮助您顺利完成Oracle Data Guard的部署工作。

Global site tag (gtag.js) - Google Analytics