oracle11g dg broker配置服务的高可用

来源:这里教程网 时间:2026-03-03 13:58:53 作者:

前提: 主库:10.9.21.178 db_name :db2 dg库:10.9.21.179 db_name :db1 一:oracle DG 服务的自动故障切换操作整体步骤: 1.配置先创建服务dbha 2.创建触发器 自动在主库启动hbha服务 3.在primary库上设置service的TAF功能 4.修改程序 中的 url,实现服务的自动切换 二:解释几个概念 1.TAF(Transparent Application Failover)即透明应用程序故障转移技术。当初始化连接出现问题无法连接时,该功能可以保证应用程序重新连接到可用服务。在重新连接过程中,之前的活动事务将会被回滚,但在“具体条件”下TAF可以保证SELECT语句不被终止。 TAF的特性: 1:TAF是ORACLE客户端提供的一项特性,使用TAF,对客户端的环境有一定的要求,比如JAVA的JDBC驱动、Oracle客户端的版本等(8i开始支持TAF); 2:大致上TAF可以分为2种,连接时的TAF和会话建立后TAF; 3:TAF本身与是否RAC环境无关,但一般都用在RAC环境,最小程度的减少最应用的影响,单实例环境下也可以使用TAF,这样使用PL/SQL developer连接数据库,即使数据库实例重启,也不需要重新连接; 4:TAF配置可以在客户端也可以在服务器端,也就是在连接数据库的时候,比如程序url添加, 或者tnsname.ora中配置FAILOVER_MODE=(TYPE = SELECT)(METHOD = BASIC)(RETIRES = 180)(DELAY = 15))),这就是客户端的配置,那么服务端配置的话就是在服务端修改每个服务的属性! begin dbms_service.modify_service ('dbha', FAILOVER_METHOD=>'BASIC', FAILOVER_TYPE=>'SELECT', FAILOVER_RETRIES=>15, FAILOVER_DELAY=>5); end; / 5:配置listener.ora文件的GLOBAL_DBNAME参数后将会禁用TAF; 6:oracle TAF特性和scan ip failover的区别是,scan ip连接的话如果scan ip所在的节点故障, 那么该连接就断开了,如果程序中没有自动重连机制,或者程序连接池中的timeout值还没有 到时间,那么你就必须重启服务以便于重连数据库,但是TAF的话不会让程序报错,只是会回滚 没有提交的事务,自动重连另一个节点,并且FAILOVER_TYPE=>'SELECT'这种方式下select是不会 停的,继续在另一个节点查出结果! 三:具体流程如下: 3.1在主库添加并启动服务,注意这个服务是要给程序中配置URL使用的! 先添加,然后启动该服务,如果不启动,那么show parameter service_name 看不到,启动后service_name参数中就出现了新的服务,并且pmon进程自动完成监听注册上这个服务,并且重启数据库后添加的服务就消失了,失效了! 添加服务的程序包如下: DBMS_SERVICE.CREATE_SERVICE( service_name IN VARCHAR2, network_name IN VARCHAR2, goal IN NUMBER DEFAULT NULL, dtp IN BOOLEAN DEFAULT NULL, aq_ha_notifications IN BOOLEAN DEFAULT NULL, failover_method IN VARCHAR2 DEFAULT NULL, failover_type IN VARCHAR2 DEFAULT NULL, failover_retries IN NUMBER DEFAULT NULL, failover_delay IN NUMBER DEFAULT NULL, clb_goal IN NUMBER DEFAULT NULL, edition IN VARCHAR2 DEFAULT NULL); --The network name of the service as used in SQLNet connect descriptors for client connections. This is limited to the NET 具体执行:其中第一个dbha是添加服务的名字,第二个是网络服务名 1.添加服务 begin dbms_service.create_service('dbha','dbha'); end; / 2.启动服务 begin DBMS_SERVICE.START_SERVICE('dbha'); end; / 这时候你去看监听的状态,你会发现刚添加的服务已经被pmon进程动态注册了 3.停止服务: begin DBMS_SERVICE.STOP_SERVICE('dbha'); end; / 4.删除服务: begin DBMS_SERVICE.DELETE_SERVICE('dbha'); end; / 3.2.在主库添加触发器,该触发器的作用是判断这个实例为主库角色(read write)则启动前边添加的 服务(dbha) create trigger tri_startservice after startup on database declare dg_role varchar(30); begin select database_role into dg_role from v$database; if dg_role='PRIMARY' then DBMS_SERVICE.START_SERVICE('dbha'); end if; end; / 3.3在主库给前面添加的服务开启TAF特性: begin dbms_service.modify_service ('dbha', FAILOVER_METHOD=>'BASIC', FAILOVER_TYPE=>'SELECT', FAILOVER_RETRIES=>15, FAILOVER_DELAY=>5); end; / 3.4.修改程序的URL datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.9.21.178)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=10.9.21.179)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=dbha)(FAILOVER_MODE=(TYPE=SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5)) ) ) 如果是oracle rac 的话: datasource.url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.216)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.217)(PORT = 1521))(LOAD_BALANCE = yes)(FAILOVER = yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = cbl)(FAILOVER_MODE=(TYPE = SELECT)(METHOD = BASIC)(RETIRES = 180)(DELAY = 15)))) 至此oracle 11g adg服务高可用配置完毕 总结:这时候可以测试下,当你主库shutdown abort的时候,你的从库自动转换成主库,然后触发器启动dbha服务,然后pmon自动注册监听,然后由于你配置了TAF特性,所以你的服务并不会报错(ORA-0133:ORACLE initialization or shutdown in progress错误),而是自动的连接到新的主库! 验证过程: 1.客户端配置tnsnames.ora dbha= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.9.21.178)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 10.9.21.179)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dbha) ) ) 2.使用dbha服务连接数据库, [oracle@beijing-fuli-hadoop-02 admin]$ sqlplus liuwenhe/liuwenhe@dbha SQL*Plus: Release 11.2.0.4.0 Production on Sat Jul 13 17:11:55 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 确认连接的是主库db2 SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- db2 3.异常关闭db2 SQL> shu abort ORACLE instance shut down. 4.在之前连接好的会话继续查询实例名字,不报错但是卡着,因为主库db2已经关闭了,而dg库 db1还在自动转换中,所以都无法提供服务(大概10秒),然后连接上了db1: SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- db2 SQL> select instance_name from v$instance; -----卡了10秒大概之后显示了db1 INSTANCE_NAME ---------------- db1

相关推荐