Data Guard 环境中客户端的自动切换

来源:互联网 发布:傲梦编程 编辑:程序博客网 时间:2024/05/18 02:53

使用Data Guard架构时,当角色发生转换switchover,也就是主库成备库处于mount状态,备库成新主库open状态,这时客户端再连接时就会收到ORA-0133:ORACLE initialization or shutdown in progress错误,而不会选择下一个可用的地址,因为原来的主库处于mout状态,监听是可用的。

在switchover发生后,尽量不修改应用和数据库的配置所耽误的时间,则需要提前对应用和数据库做出一个合理的配置方案,使用应用能够自动重连新的主库,对于failover的情况,原主库得到修复后,起到mount状态应用间隔的日志时也是这样的状况。



一种方式是通过设置客户端和TNS和数据库service_names来访问

针对物理主库操作

步骤如下:

1.客户端的tnsnames.ora

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

2.设置连接超时

在客户端sqlnet.ora文件中添加以下内容:SQLNET.OUTBOUND_CONNECT_TIMEOUT=3

3.在primary数据库运行

begin       dbms_service.create_service('test','test');  end;  /begin       DBMS_SERVICE.START_SERVICE('test');  end;  /  停止为:begin       DBMS_SERVICE.STOP_SERVICE('test');  end;  /删除为:begin      DBMS_SERVICE.DELETE_SERVICE('test');  end;  /

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

create trigger test_trig 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('test');    end if;end;/

对于逻辑备库,则应使用DB_ROLE_CHANGE系统事件创建触发器。


另外使用OCI驱动的程序,则需要配置serviceTAF就可以实现客户端透明切换;使用JDBC thin方式的应用,则应该在应用程序写入这样的重连机制,例如weblogic连接池重连机制。

这个方案就是将两边的数据库的service name都设置成test,应用使用test这个服务名连接数据库。当发生角色转换时,由触发器在数据库角色下,startup的时候修改动态service_names参数并重新注册

5.在primary库上设置service的TAF功能

begindbms_service.modify_service('test',FAILOVER_METHOD=>'BASIC',FAILOVER_TYPE=>'SELECT',FAILOVER_RETRIES=>15,FAILOVER_DELAY=>5);end;/