环境准备
主库:
PRIMARY_DB(主机:
primary_host,服务名:
primary_svc)
备库:
STANDBY_DB(主机:
standby_host,服务名:
standby_svc)
Oracle 19C ADG需要提前搭建同时处于正常同步状态,搭建过程不做展示。
步骤1:在主库和备库上配置服务
通过
DBMS_SERVICE包创建专用服务,用于DML重定向。
在主库执行:
BEGIN DBMS_SERVICE.CREATE_SERVICE( service_name => 'dml_redirect_svc', network_name => 'dml_redirect_svc', aq_ha_notifications => TRUE, failover_method => 'BASIC', failover_type => 'TRANSACTION', failover_retries => 5, failover_delay => 5 ); END; /
在备库执行:
BEGIN DBMS_SERVICE.CREATE_SERVICE( service_name => 'dml_redirect_svc', network_name => 'dml_redirect_svc', aq_ha_notifications => TRUE, failover_method => 'BASIC', failover_type => 'TRANSACTION', failover_retries => 5, failover_delay => 5 ); END; /
步骤2:配置客户端TNS别名
在客户端的
tnsnames.ora中添加以下条目,配置故障转移逻辑:
DML_REDIRECT = (DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = ON) (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = dml_redirect_svc) (FAILOVER_MODE = (TYPE = SELECT) # 故障转移类型为SELECT(会话级) (METHOD = BASIC) # 基本故障转移方法 (RETRIES = 180) # 最多重试180次 (DELAY = 5) # 每次重试间隔5秒 ) ) )
步骤3:验证服务状态
在主库和备库上启动服务并检查状态:
-- 在主库启动服务 ALTER SYSTEM SET SERVICE_NAMES='primary_svc,dml_redirect_svc'; -- 在备库启动服务 ALTER SYSTEM SET SERVICE_NAMES='standby_svc,dml_redirect_svc';
使用以下命令检查服务注册状态:
SELECT INST_ID, NAME, NETWORK_NAME, GOAL, CLB_GOAL, ENABLED FROM GV$SERVICES WHERE NAME = 'dml_redirect_svc';
步骤4:测试DML重定向
1. 应用连接测试 :
sqlplus user/password@DML_REDIRECT
默认优先连接到备库(
standby_host)。
2.执行SELECT操作 :
SELECT * FROM test_table;
确认查询结果来自备库。
3. 执行DML操作 :
INSERT INTO test_table VALUES (1, 'test');
备库因只读会抛出错误
ORA-16000: 数据库以只读模式打开。
客户端根据
FAILOVER_MODE自动重试连接到主库,DML在主库成功执行。
4.验证数据同步 :
主库提交后,ADG自动同步数据到备库。
在备库执行查询,确认数据已同步。
