如何通过PLSQL在Oracle数据库中设置连接串以实现负载均衡?

2026-04-30 10:592阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计950个文字,预计阅读时间需要4分钟。

如何通过PL/SQL在Oracle数据库中设置连接串以实现负载均衡?

相关专题:

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_nameinstance_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$SYSMETRICPhysical 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 显示 MRP0APPLYING_LOG,才算真正进入实时同步+只读可用状态。否则所有查询都可能卡在日志应用队列里。

本文共计950个文字,预计阅读时间需要4分钟。

如何通过PL/SQL在Oracle数据库中设置连接串以实现负载均衡?

相关专题:

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_nameinstance_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$SYSMETRICPhysical 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 显示 MRP0APPLYING_LOG,才算真正进入实时同步+只读可用状态。否则所有查询都可能卡在日志应用队列里。