阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 11g DG Broker配置服务的高可用

161次阅读
没有评论

共计 4115 个字符,预计需要花费 11 分钟才能阅读完成。

前提:

主库: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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计4115字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中