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代理。