如何通过PLSQL在Oracle数据库中设置连接串以实现负载均衡?
- 内容介绍
- 文章标签
- 相关推荐
本文共计950个文字,预计阅读时间需要4分钟。
相关专题:
PL/SQL 连接串里写错 SERVICE_NAME 就连不到备库
很多人在 tnsnames.ora 里照搬主库的 service_name(比如 orcl),结果 pl/sql 一连接就直连主库,根本没走备库。oracle 客户端只认 service_name,不认实例名或 db_name。
必须为备库单独注册一个只读服务,例如:report。RAC 环境下用 srvctl add service;单机可静态注册到 listener.ora 中。然后在 tnsnames.ora 显式定义:
REPORT = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=report)))
- 连接时数据库下拉框选
REPORT,不是orcl - Java 应用若用 JDBC,URL 必须带
oracle.net.READ_ONLY=true,否则监听器不触发只读路由 - .NET 客户端需加
ApplicationIntent=ReadOnly
tnsnames.ora 配置项顺序和格式错误导致解析失败
tnsnames.ora 不是普通文本,缩进和括号匹配直接影响解析。常见错误包括:
- 别名(如
REPORT)没顶格写,前面有空格 → 客户端完全识别不到该条目 -
ADDRESS_LIST被误写成ADDRESS,或漏掉外层DESCRIPTION -
SERVICE_NAME值与备库实际输出不一致:登录备库执行show parameter service_name确认,不是查db_name或instance_name - HOST 写成主机名但未配置 DNS 或
hosts文件 → 改用 IP 更稳妥
验证方式:在客户端机器上运行 tnsping REPORT,返回 OK 且有正确端口才算通。
PL/SQL Developer 启动后数据库下拉为空?OCI 路径配错了
PL/SQL Developer 不自带 Oracle 客户端,必须手动指定 OCI 库路径。常见陷阱:
- Oracle 主目录(
Oracle Home)填的是服务端路径(如/u01/app/oracle/product/19c/dbhome_1)→ 错,必须是本地安装的 Instant Client 或完整客户端路径,例如C:\Ora10InstantClient - OCI 库路径指向
oci.dll,但文件实际在子目录(如instantclient_19_20\oci.dll)→ 路径必须精确到 .dll 文件 - 32 位 PL/SQL Developer 配了 64 位客户端(或反之)→ 必须架构一致,否则启动报“无法加载 oci.dll”
配置完务必重启 PL/SQL Developer,旧进程不会重载 OCI 设置。
备库连上了但查询慢?检查 MRP0 和 DBWR 的 I/O 争用
即使连接字符串、服务名、只读模式全对,备库查询仍可能比主库慢几倍——这不是网络或 SQL 问题,而是 ADG 内部资源调度冲突:
- MRP0(Redo Apply 进程)持续读取归档并应用日志,会抢占磁盘 I/O 带宽,DBWR 刷脏块变慢 → 查
V$SYSMETRIC中Physical Reads Per Sec是否明显高于主库 - 备库未启用
DB_RECOVERY_FILE_DEST_SIZE或设得太小,导致频繁清理归档,加剧 I/O 波动 - 没开
ADG许可(即未运行ALTER DATABASE OPEN READ ONLY)→ 表面能连,实则走的是只读挂载状态,部分优化器路径被禁用
最易被忽略的一点:备库 OPEN READ ONLY 后,必须等 SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY 显示 MRP0 是 APPLYING_LOG,才算真正进入实时同步+只读可用状态。否则所有查询都可能卡在日志应用队列里。
本文共计950个文字,预计阅读时间需要4分钟。
相关专题:
PL/SQL 连接串里写错 SERVICE_NAME 就连不到备库
很多人在 tnsnames.ora 里照搬主库的 service_name(比如 orcl),结果 pl/sql 一连接就直连主库,根本没走备库。oracle 客户端只认 service_name,不认实例名或 db_name。
必须为备库单独注册一个只读服务,例如:report。RAC 环境下用 srvctl add service;单机可静态注册到 listener.ora 中。然后在 tnsnames.ora 显式定义:
REPORT = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=report)))
- 连接时数据库下拉框选
REPORT,不是orcl - Java 应用若用 JDBC,URL 必须带
oracle.net.READ_ONLY=true,否则监听器不触发只读路由 - .NET 客户端需加
ApplicationIntent=ReadOnly
tnsnames.ora 配置项顺序和格式错误导致解析失败
tnsnames.ora 不是普通文本,缩进和括号匹配直接影响解析。常见错误包括:
- 别名(如
REPORT)没顶格写,前面有空格 → 客户端完全识别不到该条目 -
ADDRESS_LIST被误写成ADDRESS,或漏掉外层DESCRIPTION -
SERVICE_NAME值与备库实际输出不一致:登录备库执行show parameter service_name确认,不是查db_name或instance_name - HOST 写成主机名但未配置 DNS 或
hosts文件 → 改用 IP 更稳妥
验证方式:在客户端机器上运行 tnsping REPORT,返回 OK 且有正确端口才算通。
PL/SQL Developer 启动后数据库下拉为空?OCI 路径配错了
PL/SQL Developer 不自带 Oracle 客户端,必须手动指定 OCI 库路径。常见陷阱:
- Oracle 主目录(
Oracle Home)填的是服务端路径(如/u01/app/oracle/product/19c/dbhome_1)→ 错,必须是本地安装的 Instant Client 或完整客户端路径,例如C:\Ora10InstantClient - OCI 库路径指向
oci.dll,但文件实际在子目录(如instantclient_19_20\oci.dll)→ 路径必须精确到 .dll 文件 - 32 位 PL/SQL Developer 配了 64 位客户端(或反之)→ 必须架构一致,否则启动报“无法加载 oci.dll”
配置完务必重启 PL/SQL Developer,旧进程不会重载 OCI 设置。
备库连上了但查询慢?检查 MRP0 和 DBWR 的 I/O 争用
即使连接字符串、服务名、只读模式全对,备库查询仍可能比主库慢几倍——这不是网络或 SQL 问题,而是 ADG 内部资源调度冲突:
- MRP0(Redo Apply 进程)持续读取归档并应用日志,会抢占磁盘 I/O 带宽,DBWR 刷脏块变慢 → 查
V$SYSMETRIC中Physical Reads Per Sec是否明显高于主库 - 备库未启用
DB_RECOVERY_FILE_DEST_SIZE或设得太小,导致频繁清理归档,加剧 I/O 波动 - 没开
ADG许可(即未运行ALTER DATABASE OPEN READ ONLY)→ 表面能连,实则走的是只读挂载状态,部分优化器路径被禁用
最易被忽略的一点:备库 OPEN READ ONLY 后,必须等 SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY 显示 MRP0 是 APPLYING_LOG,才算真正进入实时同步+只读可用状态。否则所有查询都可能卡在日志应用队列里。

