如果一个应用系统使用Oracle DG作为数据库容灾方案,当主库发生故障并执行主备切换后,由于连接信息的改变,除了本系统应用连接数据库的配置需要调整,也需要通知有数据库调用关系的三方外围系统进行相应的数据库连接配置调整。
由于不同系统有着不同的负责主体,当某个系统数据库发生主备切换后,在实践中经常会出现调整数据库连接配置的通知和响应不及时,从而导致需要实时接口调用的外围系统调用接口失败,甚至导致系统间接口数据丢失或数据不一致的问题,后续需要花费大量精力来修复数据;
针对这个问题,我们其实可以通过触发器自动创建基于数据库主备角色的监听服务名,并将外围系统连接数据的信息调整为主库服务名来解决。每当进行主备切换的时候自动在新的主库上启动主库服务名监听,外围系统一次调整后连接信息后无需任何干预自动连接到新的主库上。
以上过程我们三个步骤即可实现:
1、创建主库服务名
sql> exec dbms_service.create_service('prim_db','prim_db');
2、创建触发器
sql> CREATE OR REPLACE TRIGGER startDgServices after startup on database
DECLARE
db_role VARCHAR(30);
db_open_mode VARCHAR(30);
BEGIN
SELECT DATABASE_ROLE, OPEN_MODE INTO db_role, db_open_mode FROM V$DATABASE;
IF db_role = 'PRIMARY' THEN DBMS_SERVICE.START_SERVICE('prim_db'); END IF;
IF db_role = 'PHYSICAL STANDBY' AND db_open_mode LIKE 'READ ONLY%' THEN DBMS_SERVICE.START_SERVICE('stby_db'); END IF;
END;
/
3、调整外围系统数据库连接信息
TNS连接示例:
prim_db=
(DESCRIPTION=
(ADDRESS_LIST=
(LOAD_BALANCE=NO)
(FAILOVER=YES)
(ADDRESS=(PROTOCOL=tcp)(HOST=主库IP)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=备库IP)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=prim_db)
)
)
JDBC连接示例:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON)
(ADDRESS=(PROTOCOL=TCP)(HOST=主库IP)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=备库IP)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=prim_db)(SERVER=DEDICATED)))