无法从 Ubuntu VM 访问 Win7 Oracle 数据库

无法从 Ubuntu VM 访问 Win7 Oracle 数据库

我的主要(物理)机器是 Windows 7。我使用 VirtualBox 安装了“homestead”虚拟机,以便可以在虚拟机中开发 Laravel 应用程序。Homestead(虚拟机)运行 Ubuntu 14.10 作为其操作系统。

此外,在我的 Win 7 计算机上,我还安装了一个 Oracle 数据库。该数据库运行良好,我可以从Sql*PlusWindows 计算机本身上运行的会话访问它。但是,我希望从 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

按照以下步骤操作,您就可以使用 Ubuntu,就像它物理连接到主机操作系统一样。

使用桥接适配器:

桥接适配器

  1. 在下拉菜单中选择您的主机网络接口。

禁用 DHCP 并使用静态 IP:

1- 从屏幕顶部选择时钟和音量旁边的网络图标,然后单击编辑连接。

2- 在打开的窗口中,转到“有线”选项卡,选择您的连接(如果您没有进行任何操作,则应该只有一个连接)。然后单击“编辑”。

3-从 IPv4 设置选项卡中将方法从自动(DHCP)更改为手动。

4- 在地址字段下,单击添加。

5-输入您想要的 IP 地址和子网掩码,然后单击保存,您也可以在此处输入可选的 DNS 服务器。

答案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 服务器和网页。

相关内容