我的主要(物理)机器是 Windows 7。我使用 VirtualBox 安装了“homestead”虚拟机,以便可以在虚拟机中开发 Laravel 应用程序。Homestead(虚拟机)运行 Ubuntu 14.10 作为其操作系统。
此外,在我的 Win 7 计算机上,我还安装了一个 Oracle 数据库。该数据库运行良好,我可以从Sql*Plus
Windows 计算机本身上运行的会话访问它。但是,我希望从 Homestead 计算机访问同一个 Oracle 数据库(最终这样我就可以通过我的 Web 应用程序访问数据库)。作为实现此目标的第一步,我尝试在 Homestead(11.2)上安装 Oracle Instant Client,并据我所知对其进行了如下配置:
在 Ubuntu/Homestead 机器上设置的一些环境变量是:
export ORACLE_HOME=/usr/lib/ora_home_directory
export LD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$PATH:$ORACLE_HOME
我可以从 Homestead ping 通 Win7 机器:
# ping -c 4 cbh01
PING cbh01 (192.168.1.9) 56(84) bytes of data.
64 bytes from 192.168.1.9: icmp_seq=1 ttl=127 time=2.96 ms
64 bytes from 192.168.1.9: icmp_seq=2 ttl=127 time=1.04 ms
64 bytes from 192.168.1.9: icmp_seq=3 ttl=127 time=1.21 ms
64 bytes from 192.168.1.9: icmp_seq=4 ttl=127 time=1.45 ms
我可以Sql*Plus
从打开到 Homestead 的 SSH 会话启动:
# sqlplus /nolog
SQL>
tnsnames.ora
在 Homestead 机器上包含以下条目:
ORACBH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cbh01)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = ORACBH))
)
listener.ora
在 Win7 机器上如下所示:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_2)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORACBH)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_2)
(SID_NAME = ORACBH)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
当我进行连接时:
SQL> conn usr/pass@oracbh
它返回:
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
我觉得它没有注意到这个tnsnames.ora
文件。这本身就是一个问题,但没关系,也许我可以通过直接连接连接字符串来解决这个问题。
SQL> conn usr/pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=CBH01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORACBH)))
但这只会得到以下结果:
ERROR:
ORA-12541: TNS:no listener
我已经关闭了所有防火墙,所以我认为这不是问题所在。否则我就没主意了。:-/
听众似乎运行良好。
C:\Users\Bob>lsnrctl status
LSNRCTL for 32-bit Windows: Version 10.2.0.4.0 - Production on 05-JUN-2015 08:07:44
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for 32-bit Windows: Version 10.2.0.4.0 - Production
Start Date 05-JUN-2015 06:49:27
Uptime 0 days 1 hr. 18 min. 21 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File C:\oracle\product\10.2.0\db_2\network\admin\listener.ora
Listener Log File C:\oracle\product\10.2.0\db_2\network\log\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "ORACBH" has 1 instance(s).
Instance "ORACBH", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
我倾向于认为问题在于虚拟机访问网络的方式。我不认为这是 Oracle 的问题。我对网络等知识的了解有限,所以请随时在这方面为我指点迷津!!一些 Oralce 和 VM 支持页面上也报告了类似的问题,例如:https://community.oracle.com/thread/2439416
尝试调试跨网络连接时,我使用了 Telnet,如下所示:
vagrant@homestead:~$ telnet 192.168.1.9 1521
Trying 192.168.1.9...
telnet: Unable to connect to remote host: Connection refused
但正如前面所说,我已经禁用所有防火墙软件,这将消除此级别的端口阻塞。
答案1
答案2
我已经尝试过多种配置,因此很难说这个问题有一个具体的解决方案。底线是,如果配置正确,VM 框架似乎没有固有的限制,无法连接到物理服务器的数据库(与我在其他论坛上发现的一些评论相反)。
首先,确保您知道是否使用 TNSNAMES 来解析连接字符串。在文件中sqlnet.ora
,您可以选择添加NAMES.DIRECTORY_PATH(TNSNAMES)
参数。如果您确实添加了该参数,则似乎您有义务的在文件中使用名称解析tnsnames.ora
(这让我很惊讶)。因此,您无法使用“//servername.com:1521/dbsid”作为 DSN 连接字符串。碰巧的是,我需要 Web 服务器能够在不使用 TNS 条目的情况下进行连接,因此我从文件中删除了 TNSNAMES 选项sqlnet.ora
。
其次,确保防火墙没有阻塞端口(特别是 1521 端口)。我以为我已经在 Windows 防火墙中允许 1521 端口例外,但现在看来,我所做的更改似乎直到我重新启动 Windows 计算机后才生效(!?!?)。
您可以按照 @BjarteBrandt 的评论(使用工具)验证端口是否打开且未设置防火墙nmap
,以确保端口确实打开open
。从虚拟机运行以下命令:
vagrant@homestead:~$ nmap -p 1521 cbh01
Starting Nmap 6.46 ( http://nmap.org ) at 2015-06-07 16:37 UTC
Nmap scan report for cbh01 (192.168.10.1)
Host is up (0.00046s latency).
Other addresses for cbh01 (not scanned): 192.168.1.14 192.168.56.1
PORT STATE SERVICE
1521/tcp open oracle
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
然后当我再次测试 SQL 连接时......
vagrant@homestead:~$ sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on Sun Jun 7 16:42:48 2015
Copyright (c) 1982, 2013, Oracle. All rights reserved.
SQL> conn usr/pass@//192.168.1.14/oracbh
Connected.
它需要重新启动 VM(或至少重新启动 Web 服务器),以便将 OCI 配置中的更改传播到 Web 服务器和网页。