Mac OSX 上 VM 中的 Oracle Database 12c

Posted

技术标签:

【中文标题】Mac OSX 上 VM 中的 Oracle Database 12c【英文标题】:Oracle Database 12c in VM on Mac OSX 【发布时间】:2014-03-14 13:55:01 【问题描述】:

我正在尝试在我的 OSX 笔记本电脑上启动并运行开发环境,在 Eclipse 中创建 JSP,使用 Tomcat 服务器运行,并连接到 Oracle 数据库。

Eclipse 和 Tomcat 配合得很好,我可以制作 JSP 等等。现在最困难的部分是在 Mountain Lion 上启动并运行 Oracle 数据库,并让 Eclipse 连接到它。

经过广泛谷歌搜索,我找到了一些资源:

http://dimitrisli.wordpress.com/2012/08/08/how-to-install-oracle-database-on-mac-os-any-version/ http://barrymcgillin.blogspot.com/2011/12/using-oracle-developer-days-virtualbox.html

(甚至https://docs.google.com/document/d/1Th5MSIhS13YIJYCD8W1GLnOQEfrfov-92-He1cluTec/pub)

按照这些(相当彻底的)指南,我从 Oracle 下载了最新的虚拟机,这里: http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html

注意:以上三个教程都使用稍旧版本的 VM,它具有 Oracle DB 10 或 11,但现在可用的是 12c。新版本还具有不同版本的 Oracle Linux,可能还有其他一些差异。各种用户名和密码似乎略有不同。

我安装了 VirtualBox,加载到 VM 中,使其联机。我的网络设置只配置了一个 NAT 适配器,适配器类型为“PCnet-FAST III”,端口转发从 127.0.0.1 到 10.0.4.15,端口 1521 到 1521 和 2222 到 22。

现在,如果我在主机上打开终端,我可以通过 SSH 连接到我的虚拟机:ssh -p 2222 oracle@localhost。我在 VM 中获得了终端,它给了我在 VirtualBox 中首次启动 VM 时收到的相同欢迎信息。另外,我可以 ping localhost 或 127.0.0.1,它的响应是一个变量,但延迟很短。

基于此,我只能假设我的 VM 正在工作,并且我的端口转发(我在上面链接的所有 3 个教程中都有介绍)状况良好。

现在是我想将 Eclipse 连接到 VM 中的 Oracle 数据库的部分。如果您查看第一个教程,dimitrisli 使用指向 VM 的数据源设置 IntelliJ。我想在 Eclipse 中做同样的事情。

我是 Eclipse 的新手,所以我四处寻找确切的方法,我想出了:

1) 制作一个新的数据库驱动程序。

我从 Oracle here 下载了适用于 Oracle Database 12c JDK 7 的 JDBC。我将 .jar 文件卡在我的 Documents 文件夹中(以防万一)。在 Eclipse 中,我基于其他 Oracle 驱动程序模板之一制作了一个新的数据库驱动程序,并更改了设置。在“驱动程序文件”下,我指向了我的 ojdbc7.jar 文件,在“属性”下,我有以下内容——如果有误,请告诉我:

Catalog: USER
Connection URL: jdbc:oracle:thin:@localhost:1521:orcl
Database Name: pdb1
Driver Class: oracle.jdbc.OracleDriver
Password:
User ID:

我尝试使用 Oracle 驱动程序模板中的内容,并进行调整以匹配我的确切场景(基于演练中所说的内容以及我从虚拟机的现代版本中可以猜到的内容)。

2) 建立新的数据库连接。

当我去建立一个新的数据库连接时,我去驱动程序属性区域,我可以选择我的自定义驱动程序。还有一个属性字段,我在其中输入以下内容:(其中一些似乎覆盖或复制了我在制作驱动程序时输入的内容?)

SID: orcl
Host: 127.0.0.1
Port Number: 1521
User Name: hr // Gotten from one of the tutorials.  Have also tried 'system/oracle', neither works yet.
Password: oracle
Connection URL: jdbc:oracle:thin:@127.0.0.1:1521:orcl // Immutable, set by the Driver I suppose.
Catalog: User

当我单击测试连接时,它会挂起一段时间,然后我收到“Ping 失败!”错误,详细说明:

java.sql.SQLRecoverableException: IO Error: Socket read timed out
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
    at org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.createConnection(JDBCConnection.java:298)
    at org.eclipse.datatools.connectivity.DriverConnectionBase.internalCreateConnection(DriverConnectionBase.java:105)
    at org.eclipse.datatools.connectivity.DriverConnectionBase.open(DriverConnectionBase.java:54)
    at org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.open(JDBCConnection.java:81)
    at org.eclipse.datatools.enablement.internal.oracle.JDBCOracleConnectionFactory.createConnection(JDBCOracleConnectionFactory.java:27)
    at org.eclipse.datatools.connectivity.internal.ConnectionFactoryProvider.createConnection(ConnectionFactoryProvider.java:83)
    at org.eclipse.datatools.connectivity.internal.ConnectionProfile.createConnection(ConnectionProfile.java:359)
    at org.eclipse.datatools.connectivity.ui.PingJob.createTestConnection(PingJob.java:76)
    at org.eclipse.datatools.connectivity.ui.PingJob.run(PingJob.java:59)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: oracle.net.ns.NetException: Socket read timed out
    at oracle.net.ns.Packet.receive(Packet.java:350)
    at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:153)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    ... 14 more

不幸的是,作为 Java 和 Eclipse 和 Oracle DB 的新手,我不太确定如何处理这个问题,我一直在四处寻找几个小时试图确定可能出了什么问题。我希望有这方面经验的人可以为我指明正确的方向。

(哦,我不是一个缺乏经验的开发人员——只是对这些工具不熟悉。)

谢谢!

【问题讨论】:

我用这种方式从 Mac 连接 Oracle DB。 ***.com/a/33187773/809671 【参考方案1】:

在浪费了大约 6 或 7 个小时之后,我解决了我的问题。

感谢这篇文章: Virtualbox "port forward" from Guest to Host

特别是@Nicholas 的评论让我意识到我已经停用了我的 Mac 的防火墙,但没有停用来宾操作系统中的防火墙。关闭它会让一切突然变得正常。

我想来宾操作系统防火墙的默认配置确实允许在端口 2222 上进行 SSH,因为即使有防火墙也可以正常工作,这使我误以为我的数据库驱动程序有问题或连接。

希望这将造福后代。


编辑:

正如@HarpreetDawar 提到的,访问数据库的正确连接字符串是:

jdbc:oracle:thin:@localhost:1521/PDB1

我使用的那个以:orcl而不是/PDB1结尾,连接到“容器数据库”。我不完全了解 Oracle 12c 和“可插拔数据库”实现,但粗略的想法是您可以在一个数据库中拥有多个数据库,您可以通过插入/拔出它们来打开和关闭它们。因此,“PDB1”,可插拔数据库 1。

如果你连接到 Container,你会发现你无法创建一个新的 User/Schema 而不用“C##”作为前缀,这有点尴尬。那是因为容器不打算用作普通数据库。您连接到容器以插入/拔出可插入的 dbs(以及其他东西,毫无疑问)。

因此,如果您想连接到 Container,请在连接字符串中使用冒号和“SID”(VM 中的 orcl),如果您想连接到 Pluggable,请使用正斜杠和“Service连接字符串中的名称”(VM 中的 PDB1)。

不管怎样,这是我在解决我原来的问题后学到的额外数据。


还有一件事!关于端口转发的说明。

假设您现在已经启动并运行了您的虚拟机,并且您可以正确连接到您的 Oracle 数据库等。但是您有朋友想和您一起使用数据库?嗯,这很容易。他应该只使用相同的连接字符串,使用您的 IP 地址而不是 localhost,并且您在 VirtualBox 中设置的端口转发应该将他的连接(使用端口 1521)直接发送到您的 VM。对吧?

好吧,如果您将端口转发设置为From: 127.0.0.1,它将无法正常工作,因为您好友的连接将指向您的外部 IP 地址。因此,添加一个额外的端口转发设置,从您的外部 IP 地址到您的 VM。然后它会很好用!

-马特

【讨论】:

您好,我是您引用的第一个链接的作者。抱歉我的文章过时了,当时我最初是为 11gR2 编写的。我今天更新了它,包括 12cR1 所需的所有详细信息:dimitrisli.wordpress.com/2012/08/08/… @dimitrisli 感谢 Dimitri 首先制作指南。没有它,我永远都不会得到任何地方;)很高兴你正在更新它。【参考方案2】:

使用以下网址

url = jdbc:oracle:thin:@//127.0.01:1521/PDB1

让它工作。

【讨论】:

【参考方案3】:

我是第一个指南的作者Matt Mc 引用并冒昧将我对他的答案的评论作为一个单独的答案发表,以提高知名度。

我最初在 2 年前写过 this guide,详细解释了使用 VirtualBox 在 Mac 上安装 Oracle 11gR2 的过程。

昨天(2014 年 4 月 25 日),我升级了 the same guide,概述了使用 VirtualBox 在 Mac 上安装 Oracle 12cR1 所需的所有额外步骤。

【讨论】:

以上是关于Mac OSX 上 VM 中的 Oracle Database 12c的主要内容,如果未能解决你的问题,请参考以下文章

VM(Parallels)不使用主机上的***连接(osx小牛)[关闭]

MAC OSX 开启/禁用SafeSleep功能

从 MAC OS(EL Capitan) 到预建 Oracle VM 的 JDBC 连接

如何在 Mac OSX 上使用 JDK 7?

在 OSX 上将卷挂载到 Docker 映像

Mac OSX Snow Leopard 上的 Oracle Sqlplus 问题