使用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驱动的程序,则需要配置service的TAF就可以实现客户端透明切换;使用JDBC thin方式的应用,则应该在应用程序写入这样的重连机制,例如weblogic连接池重连机制。
这个方案就是将两边的数据库的service name都设置成test,应用使用test这个服务名连接数据库。当发生角色转换时,由触发器在主数据库角色下,startup的时候修改动态service_names参数并重新注册。
5.在primary库上设置service的TAF功能
begin
dbms_service.modify_service
('test',
FAILOVER_METHOD=>'BASIC',
FAILOVER_TYPE=>'SELECT',
FAILOVER_RETRIES=>15,
FAILOVER_DELAY=>5);
end;
/