使用SSH隧道连接远程Oracle 18c,SQL Developer调试遇ACL及连接错误
解决SSH隧道连接Oracle数据库时调试存储过程的ACL与连接问题
问题场景
- 环境:Windows 11 + Oracle SQL Developer 23.1.0.097,通过SSH隧道连接Linux服务器上的Oracle Database 18c XE(18.0.0.0.0)
- 现象:正常执行存储过程无异常,但调试时先触发ACL权限错误:
Connecting to the database #####. Executing PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '127.0.0.1', '11183' ) ORA-24247: network access denied by access control list (ACL) ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line 68 ORA-06512: at line 1 Process exited. Disconnecting from the database ####.
- 执行以下ACL授权语句后,调试又出现连接错误:
BEGIN DBMS_NETWORK_ACL_ADMIN.append_host_ace( host => '*', lower_port => 5001, upper_port => 65535, ace => xs$ace_type(privilege_list => xs$name_list('JDWP'), principal_name => 'MY-USER', /* 替换为实际用户 */ principal_type => xs_acl.ptype_db)); END;Executing PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '127.0.0.1', '14573' ) ORA-30683: failure establishing connection to debugger ORA-12541: TNS:no listener ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line 68 ORA-06512: at line 1 Process exited.
解决步骤
1. 理清问题根源
用SSH隧道连接时,SQL Developer调试调用DBMS_DEBUG_JDWP.CONNECT_TCP('127.0.0.1', 端口),这里的127.0.0.1指的是远程Linux服务器的本地回环,而非你的Windows机器的回环。Oracle数据库试图连接自己的对应端口,但调试监听是在你本地Windows上,自然会连接失败。
2. 调整SQL Developer调试设置
打开SQL Developer,按以下步骤操作:
- 顶部点击
工具→首选项→数据库→调试器 - 将
调试器监听地址修改为0.0.0.0(允许所有地址连接) - 务必勾选
调试器使用SSH隧道选项(这是关键,让SQL Developer自动把远程的调试请求通过SSH隧道转发回你本地) - 点击
确定保存设置,然后重启SQL Developer
3. 确认ACL授权生效
先检查之前的授权是否真的生效,执行以下SQL:
-- 查看当前用户的ACL权限 SELECT host, lower_port, upper_port, principal_name, privilege FROM dba_network_acls JOIN dba_network_acl_aces ON dba_network_acls.acl = dba_network_acl_aces.acl WHERE principal_name = 'MY-USER';
如果权限范围不足,重新执行授权语句(覆盖所有主机和端口):
BEGIN DBMS_NETWORK_ACL_ADMIN.append_host_ace( host => '0.0.0.0/0', lower_port => 1, upper_port => 65535, ace => xs$ace_type(privilege_list => xs$name_list('JDWP'), principal_name => 'MY-USER', principal_type => xs_acl.ptype_db)); END; /
4. 检查SSH隧道的转发权限
创建SSH隧道时,要确保勾选了 允许本地端口转发 和 允许远程端口转发,否则远程Oracle无法主动将调试请求发回你本地。
5. 测试调试连接
重新建立数据库连接,再次尝试调试存储过程:
- SQL Developer会自动在SSH隧道中添加临时端口转发,将远程的调试请求转到你本地的调试器
- 如果仍报错,检查Windows防火墙是否拦截了SQL Developer的调试端口(默认是随机端口,你可以在调试器设置中指定一个固定端口,然后在防火墙里放行该端口)
内容的提问来源于stack exchange,提问作者stander
相关产品推荐
相关产品推荐

