Oracle调试PL/SQL函数报ORA-24247 ACL网络访问被拒绝问题求助
Oracle PL/SQL调试ACL拒绝(ORA-24247)解决方案
报错原因分析
你之前的配置未生效大概率是以下几个常见问题:
- 执行完ACL配置语句后未提交事务,DBMS_NETWORK_ACL_ADMIN的修改属于事务性操作,未提交则规则不生效
- 端口范围设置为null,部分Oracle版本会出现规则匹配异常,无法命中4000调试端口
- 未排查已有ACL规则冲突:若存在优先级更高的拒绝规则,会覆盖你新增的允许规则
- 配置的
principal_name与实际调试使用的数据库用户不匹配(Oracle用户名默认大写,小写配置会无效)
正确配置步骤
- 执行以下授权语句,明确指定端口范围与用户,执行完成后务必提交事务:
BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE ( host => '127.0.0.1', lower_port => 4000, upper_port => 4000, ace => xs$ace_type( privilege_list => xs$name_list('jdwp'), principal_name => 'SYSTEM', principal_type => xs_acl.ptype_db ) ); COMMIT; -- 必须提交事务才会生效 END; /
如果你调试用的不是SYSTEM用户,请将
principal_name改为你实际使用的数据库用户名,注意必须大写。如果调试端口不是固定4000,可以调整lower_port和upper_port为你实际使用的端口范围。
- 若依然报错,先查询当前已配置的ACL规则,排查是否有冲突:
SELECT host, lower_port, upper_port, privilege, principal_name FROM dba_host_aces WHERE host = '127.0.0.1' ORDER BY ace_order;
- 若查询结果中存在
privilege为jdwp、principal_name为对应用户的拒绝规则,需要先删除冲突规则后再重新添加允许规则。 - 删除冲突规则的语句示例(替换对应参数为你实际查询到的冲突项参数):
BEGIN DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACE ( host => '127.0.0.1', lower_port => 4000, upper_port => 4000, ace => xs$ace_type( privilege_list => xs$name_list('jdwp'), principal_name => 'SYSTEM', principal_type => xs_acl.ptype_db ) ); COMMIT; END; /
额外注意事项
- 如果你调试时连接的数据库主机使用
localhost代替127.0.0.1,需要额外新增针对localhost的ACE规则,Oracle会将二者识别为不同的主机配置。 - 部分Oracle云环境或安全加固后的实例,会存在全局ACL限制,需要确认实例级别的网络访问策略是否允许JDWP调试连接。
内容的提问来源于stack exchange,提问作者AlbertAlex
相关产品推荐
相关产品推荐

