什么是OracleDataGuard数据源
OracleDataGuard是Oracle官方提供的数据保护和灾备方案,通过主库和备库的实时数据同步,实现数据库的高可用和容灾能力。OracleDG数据源就是指向这套主备数据库集群的连接配置,和普通单节点Oracle数据源相比,它需要兼顾主备库的访问、故障自动切换等特性,配置逻辑也有一定差异。

配置前的环境检查
在配置数据源之前,需要先确认OracleDG集群的基础运行状态,避免后续配置出现连接异常。
主备库状态检查
首先登录主库执行以下SQL查看DG配置状态:
-- 查看主库DG状态 SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE; -- 查看备库同步进度 SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY;
正常的主库角色应为PRIMARY,备库为PHYSICAL STANDBY,且备库的同步进程状态为ACTIVE,无延迟。
监听与网络检查
确认主备库的监听服务正常运行,且客户端机器可以连通主备库的监听端口,默认Oracle监听端口为1521。可以通过tnsping命令测试连通性:
# 测试主库连通性 tnsping ORCL_PRIMARY # 测试备库连通性 tnsping ORCL_STANDBY
OracleDG数据源核心配置步骤
第一步:配置TNS连接字符串
在客户端机器的tnsnames.ora文件中添加主备库的连接描述,支持故障自动切换的连接串配置如下:
ORCL_DG =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主库IP)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 备库IP)(PORT = 1521))
(FAILOVER = on)
(LOAD_BALANCE = off)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
上述配置中FAILOVER = on表示开启故障切换,当主库不可用时自动尝试连接备库,LOAD_BALANCE = off表示优先连接主库,只有主库不可用时才访问备库,符合DG一主多备的使用场景。
第二步:应用侧数据源参数配置
以Java应用常用的Druid数据源为例,在配置文件中设置连接参数:
# 数据源驱动 druid.driverClassName=oracle.jdbc.OracleDriver # 连接URL,使用上面配置的TNS名称 druid.url=jdbc:oracle:thin:@ORCL_DG # 数据库用户名 druid.username=scott # 数据库密码 druid.password=tiger # 连接池初始大小 druid.initialSize=5 # 最大连接数 druid.maxActive=20 # 获取连接超时时间,单位毫秒 druid.maxWait=60000 # 开启连接有效性检查 druid.testWhileIdle=true # 验证连接有效性的SQL druid.validationQuery=SELECT 1 FROM DUAL
如果使用直接IP连接的方式,也可以将URL替换为jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=主库IP)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=备库IP)(PORT=1521))(FAILOVER=on))(CONNECT_DATA=(SERVICE_NAME=orcl))),无需依赖tnsnames.ora文件。
第三步:验证数据源可用性
启动应用后,可以通过执行简单查询验证数据源是否正常工作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestOracleDGDataSource {
public static void main(String[] args) throws Exception {
// 加载Oracle驱动
Class.forName("oracle.jdbc.OracleDriver");
// 获取连接,使用配置的TNS名称
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@ORCL_DG", "scott", "tiger");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT DATABASE_ROLE FROM V$DATABASE");
if (rs.next()) {
System.out.println("当前连接的数据库角色:" + rs.getString(1));
}
rs.close();
stmt.close();
conn.close();
}
}
正常输出应为PRIMARY,说明当前连接的是主库。可以手动关闭主库模拟故障,再次执行上述代码,输出变为PHYSICAL STANDBY,说明故障切换生效。
主备切换后的数据源适配
当执行DG主备切换后,新的主库会成为读写节点,原主库变为备库。如果之前的数据源配置使用的是固定主库IP,切换后会导致数据源无法写入。因此建议始终使用包含主备IP的TNS连接串,或者在主备切换后更新数据源配置中的主库地址,同时重启应用使配置生效。
常见问题排查
- 如果数据源连接报错ORA-12154,检查tnsnames.ora文件路径是否正确,TNS名称是否拼写错误
- 如果切换后数据源无法连接备库,检查备库的监听服务是否启动,备库是否处于只读打开状态
- 如果出现连接超时,检查主备库防火墙是否放通了1521端口,客户端到主备库的网络是否通畅
OracleDataGuard数据源配置OracleDG主备同步修改时间:2026-07-02 21:48:14