通过触发器实现dataguard的服务切换实现客户端的高可用连接

前面几篇文章主要写的是rac-rac的dg环境下的服务切换,同样适用于由grid管理的数据库(rac onenode或oracle restart)。那么如果是单纯的数据库(没有grid)情况下的dg如何实现基于角色的服务切换呢?

参考了一些专家的文档,可以通过触发器的方式进行服务名的切换实现客户端的高可用连接。(触发器的操作同样适用于rac或者grid管理的数据库环境)。

正常状态

1)在主库上配置一个TAF的service(服务名称service_pri)

此服务在数据库出现故障时会发送通知给客户端,允许查询语句在故障转移发生后继续运行。相关参数说明自行查看官方文档

begin
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'SERVICE_PRI',
network_name => 'SERVICE_PRI',
aq_ha_notifications => TRUE,
failover_method => 'BASIC',
failover_type => 'SELECT',
failover_retries => 15,
failover_delay => 5);
end;
/

2)创建在主库启动服务的存储过程

创建一个存储过程来实现此目的,如果当前数据库是主库它就启动此服务,如果是备库就停止。

主库执行:

create or replace procedure SERVICE_PRI is
v_role VARCHAR(30);
begin
select DATABASE_ROLE into v_role from V$DATABASE;
if v_role = 'PRIMARY' then
DBMS_SERVICE.START_SERVICE('SERVICE_PRI');
else
DBMS_SERVICE.STOP_SERVICE('SERVICE_PRI');
end if;
end;
/

3)创建一个触发器来确保服务运行

创建触发器,让数据库在启动或角色转换时运行此存储过程。用于当数据库open时,不需要重启数据库,如果是主库则执行存储过程。当数据库切换后,如果是主库则执行存储过程。

主库执行:

create or replace TRIGGER FSFO_TRIGGER
after startup or db_role_change on database
begin
SERVICE_PRI;
end;
/

4)启动新创建的service

在主库上执行该存储过程(或者重启数据库,在启动数据库时会触发执行触发器),在主库做日志的切换,将变化应用到备库。

主库执行:

SQL> exec SERVICE_PRI;
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01

主库的service pri服务已启动

从库并未启动对应的服务

客户端配置

客户端配置
#service_pri
service_pri =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = tcp)(HOST = 1xxxxxx9)(PORT = 1521))  #主库地址
        (ADDRESS = (PROTOCOL = tcp)(HOST = 1xxxxxx44)(PORT = 1521))  #从库地址
            (LOAD_BALANCE = off)
            (FAILOVER = on)
                (CONNECT_DATA =
                    (SERVER = DEDICATED)
                    (SERVICE_NAME = service_pri)
                (FAILOVER_MODE =
                    (TYPE = select)
                    (METHOD = basic)
                    (RETRIES = 180)
                    (DELAY = 5)
               )
        )
 )

切换测试

通过service_pri连接数据库模拟写入

执行切换(gadb-gadbstd)

执行切换动作
DGMGRL> validate database gadbstd

  Database Role:     Physical standby database
  Primary Database:  gadb

  Ready for Switchover:  Yes
  Ready for Failover:    Yes (Primary Running)

  Flashback Database Status:
    gadb   :  Off
    gadbstd:  Off

  Managed by Clusterware:
    gadb   :  YES            
    gadbstd:  YES            

DGMGRL> switchover to gadbstd
Performing switchover NOW, please wait...
Operation requires a connection to database "gadbstd"
Connecting ...
Connected to "gadbstd"
Connected as SYSDBA.
New primary database "gadbstd" is opening...
Oracle Clusterware is restarting database "gadb" ...
Connected to "gadb"
Connected to "gadb"
Switchover succeeded, new primary is "gadbstd"

切换完毕后服务已经在新主库启动

同时写入进程在切换过程中中断,当切换完毕后恢复写入操作。

切换后状态

综上测试,如果环境无法通过srvctl命令创建的服务,那么通过数据库里面创建对应的触发器即存储过程也可以实现应用在dataguard发生切换后的高可用连接。

举报
评论 0