我有一个在 AWS ec2 的 Linux 实例上运行的 Oracle 数据库 12c 标准版版本 12.2.0.1.0。当我尝试使用 SQL Developer 从我的机器 (macOS) 远程连接到它时,我收到一个IO Error: The Network Adapter could not establish the connection
Vendor Code 17002
错误。
- 在我的机器上使用 sqlplus 进行连接:
sqlplus cd2/ @ec2-publicIp.myCloud.compute.amazonaws.com:1522/orcl
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 3 15:30:56 2020
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listener
- 在 ec2 实例 Security Groups 上,为我的机器的公共 IP 打开了一个 TCP 1522 端口
- telnet 到实例,端口 1522 似乎表明该端口是开放的:
telnet ec2-pubIp.compute.amazonaws.com 1522
Trying pubIp...
telnet: connect to address pubIp: Connection refused
telnet: Unable to connect to remote host
- 端口 1522 在所有配置中一致使用
- 我验证了 ec2 主机名(
hostname
命令)与从lsnrctl status
. 输出显示localhost
而不是ip-localIp.myCloud.compute.internal
。
$ hostname
ip-localIp.myCloud.compute.internal
$ lsnrctl status
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 03-AUG-2020 15:20:44
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip-localIp.myCloud.compute.internal)(PORT=1522)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date 03-AUG-2020 13:30:22
Uptime 0 days 1 hr. 50 min. 22 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/centos/product/12.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/centos/diag/tnslsnr/ip-localIp/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522)))
Services Summary...
Service "orcl.myCloud.compute.internal" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.myCloud.compute.internal" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
- 主机名和端口也与配置的默认侦听器匹配
listener.ora
:
cat /u01/app/centos/product/12.2.0/dbhome_1/network/admin/listener.ora
# listener.ora Network Configuration File: /u01/app/centos/product/12.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip-localIp.myCloud.compute.internal)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
)
)
- Oracle 参数如图所示,主机和端口再次匹配:
SQL> show parameter listener_networks
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks string
SQL> show parameter local_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string (ADDRESS=(PROTOCOL=TCP)(HOST =
ip-localIp.myCloud
.compute.internal)(PORT = 1522
))
SQL> show parameter remote_listener
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string
- 我可以从 ec2 实例连接:
sqlplus / as sysdba
- 我可以从 ec2 实例作为模式/用户 cd2 连接:
sqlplus cd2/ @orcl
SQL*Plus: Release 12.2.0.1.0 Production on Mon Aug 3 18:04:13 2020
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Enter password:
Last Successful login time: Mon Aug 03 2020 18:03:52 +00:00
Connected to:
Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
SP2-0310: unable to open file "orcl.sql"
SQL> select 1 from dual;
1
----------
1
SQL>
- SQL Developer 连接匹配端口和 ec2 的公共域名:
- 这个数据库服务器是我们的开发实例,所以没有安装许可证
listener.ora
通过将HOST
值设置为更新0.0.0.0
,重新启动lsnrctl
但结果相同:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
)
)
/etc/hosts
内容:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-localIp.myCloud.compute.internal
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 我还使用所有入站流量和为 ec2 实例打开的所有端口对其进行了测试
不,以下内容并不表示您可以通过该端口访问服务器:
这只是一个通用的网络问题。只需在连接详细信息中输入错误的主机或端口,即可随时重现 17002 错误。
您的侦听器侦听内部地址,在您的情况下是环回适配器的 127.0.0.1 地址。但是您尝试通过外部地址进行连接。
您的云基础架构中需要一些转发/防火墙规则。或者您需要更改侦听器配置,以便它可以侦听外部地址。但即使你这样做,如果没有上述内容,它也可能无法工作。
更好的选择是将连接封装在 SSH 隧道中。您可以通过首选的 SSH 客户端设置隧道(这适用于 Oracle Cloud,但概念与创建 SSH 隧道到计算节点端口的概念相同)。甚至 SQL Developer 也为此提供了一些内置功能:使用 Oracle SQL Developer 远程连接到数据库。
或者这里是一篇关于在 SQL Developer 中设置 SSH 隧道的博客文章,带有截图:https ://learncodeshare.net/2016/06/02/sql-developer-oracle-database-connection-through-an-ssh-tunnel/
这不是一个完整的答案,我已经在评论中写了这个答案的一部分。但是错误消息非常清楚,所以我将在这里解释,因为我不确定 Balazs 的回答是否清楚这一点。正确的解释有助于分析问题。
来自 sqlplus 错误信息
你可以得出结论:
从 telnet 错误信息
你可以得出结论
因此,两条消息都表明您可以访问 ec2-pubIp.compute.amazonaws.com 的端口 1522