ORA-28575: 无法打开与外部过程代理程序的 RPC 连接(文档 ID 70638.1)

APPLIES TO:
PL/SQL - Version 10.2.0.1 and later
Oracle Net Services - Version 10.2.0.1 and later
Oracle Database - Enterprise Edition - Version 12.1.0.2 to 12.1.0.2 [Release 12.1]
Information in this document applies to any platform.
*** Checked for relevance on 7th Aug 2017 ***


PURPOSE
本文简要概述了Oracle外部过程体系结构,并提供了许多建议,以便对“ORA-28575无法打开与外部过程代理的RPC连接”错误进行故障排除。 虽然本公告的重点是UNIX环境,但许多概念也适用于Windows环境。

本文不涉及外部程序的所有方面。 它只是提供足够的背景信息来解决ORA-28575错误。

SCOPE
下面列出了执行外部过程的基本组件列表,以及每个组件角色的简要说明。

Database:

从11g及更高版本开始,当应用程序调用外部过程时,Oracle数据库默认生成extproc代理。 在11gR1之前,需要配置Oracle侦听器以生成extproc代理。
存储有关共享库(在UNIX情况下为.so / .sl)或动态链接库和PL / SQL调用规范的信息,以传递给extproc代理。

Listener:

Oracle侦听器也可以配置为生成extproc代理而不是数据库。 这是通过编辑listener.ora和tnsnames.ora来完成的。
使用时需要Oracle侦听器配置:
具有PL / SQL库或PL / SQL调用规范的AGENT或AGENT IN子句。
配置多线程extproc(MTA)时。
否则建议使用默认配置。

Extproc Agent:

Oracle提供了一个代理“extproc”来加载共享库(在UNIX的情况下为.so / .sl)或动态链接库(在Windows的情况下为.dll),然后运行通过PL / SQL调用发布的例程 规范,传递任何参数。

Shared or Dynamic link library (In case of Windows):

包含实现所需功能的用户编写函数。

External procedure call specification:

包含有关要加载的共享库或动态链接库的信息,以及要与参数信息一起运行的库中例程的名称。

DETAILS
“ORA-28575无法打开与外部程序代理的RPC连接”是什么意思?

进行外部过程调用时,会发生以下事件序列以加载和运行外部库:

除非使用多线程代理,否则Oracle数据库或Oracle侦听器会为调用外部过程的会话创建extproc代理。
extproc代理加载共享库(在UNIX的情况下为.so / .sl)或动态链接库(在Windows的情况下为.dll),然后运行通过PL / SQL调用规范发布的例程,传递任何参数。
执行完成后,extproc代理将控制权与任何输出参数和返回值一起传递回调用应用程序。
ORA-28575表示步骤1中的失败,Oracle数据库或Oracle侦听器无法为会话生成extproc代理。

什么时候“ORA-28575无法打开到外部程序代理的RPC连接”?

当Oracle侦听器未正确配置或Oracle侦听器已配置但未启动时,会发生此错误。使用默认配置时,这种情况很少发生。

如何解决“ORA-28575无法打开到外部过程代理的RPC连接”错误?

ORA-28575的可能原因包括:

extproc代理的问题。
Oracle侦听器配置不正确。
extproc代理的问题。

1)验证extproc代理是否存在于$ ORACLE_HOME / bin目录中,并且可以调用它。这只是为了确保可执行文件没有损坏。
$ORACLE_HOME/bin/extproc
Expected Output:

Oracle Corporation --- THURSDAY AUG 03 2017 09:30:40.795
Heterogeneous Agent Release 12.1.0.2.0 - 64bit Production
Note: The version shown above will change depending on the Oracle database version.

如果在可执行文件中收到任何可能损坏的错误,则可以使用Oracle提供的makefile重新生成extproc代理。

cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk iextproc
To re-generate 32-bit extproc executable use "iextproc32" in place of "iextproc".  

2)如果Oracle侦听器配置为生成extproc代理,则验证启动侦听器的用户是否具有执行extproc代理的权限。 在许多系统上,侦听器使用oracle用户的有效用户ID执行,但这可以更改。

Oracle侦听器配置不正确。

1)监听器配置需要编辑listener.ora和tnsnames.ora文件。 可以将新的或现有的Oracle侦听器配置为服务外部过程。

注意:Oracle建议仅在以下情况下将侦听器配置为生成extproc代理:
使用多线程代理。 要配置多线程extproc代理,请参阅注释387503.1。
当使用库规范的AGENT子句或使用AGENT IN子句PL / SQL调用规范时。
否则使用默认配置以获得最大安全性

编辑listener.ora以获得如下所示的条目并适当地替换ORACLE_HOME和PROGRAM:

LISTENER_EXTPROC =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
    )
  )
SID_LIST_LISTENER_EXTPROC =
  (SID_LIST =
    (SID_DESC=
      (SID_NAME=plsextproc)
      (ORACLE_HOME=<ORACLE_HOME_PATH>)
      (PROGRAM=<ORACLE_HOME>/bin/extproc)
    )
  )

编辑tnsnames.ora以获得如下所示的条目。
EXTPROC_CONNECTION_DATA =
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
 (CONNECT_DATA=(SID=plsextproc)))
确保tnsnames.ora中的KEY和SID条目分别与listener.ora中的KEY和SID_NAME条目匹配。 配置Oracle侦听器后,启动侦听器并ping服务名称EXTPROC_CONNECTION_DATA以确保没有错误。

lsnrctl start listener_extproc
tnsping extproc_connection_data
Expected Output:

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=extproc)) (CONNECT_DATA=(SID=plsextproc)))
OK (10 msec)
注意:
EXTPROC_CONNECTION_DATA只能在以下情况下更改:

在sqlnet.ora中,DEFAULT_DOMAIN设置为某个值,然后可以使用DEFAULT_DOMAIN中提到的值修改EXTPROC_CONNECTION_DATA条目。
当使用库特定的AGENT子句或使用AGENT IN子句PL / SQL调用规范时。
否则tnsnames.ora应该只有EXTPROC_CONNECTION_DATA,否则监听器可能不会产生extproc代理。

猜你喜欢

转载自blog.csdn.net/qq_21127313/article/details/81094216