1.  引言

1.1.  背景

最近(2018年1月)需要使用C++开发一套系统,系统中使用Oracle数据库,其中包含一个与Oracle数据库进行交互的数据服务程序。计划使用OCCI来开发这个服务程序。

1.2.  目的

Oracle数据库以及OCCI的安装虽然很顺利,但是,在安装过程中也遇到了一些问题,凭着多年的工作经验,很多问题页都迎刃而解了。虽然已经有八九年没使用Oracle以及OCCI了,有些经验并没有完全忘记,这证明经验真的很重要。并且,有些时候需要的知识是综合性很强的。所以,我编写本文,我的目的是想给有同样需求,但是,过程中也遇到同样问题的小伙伴们以参考,希望对小伙伴们有所帮助。同时也作为个人的笔记留存以备参考,好记性不如烂笔头子。

2.  安装环境

环境很重要。不同的环境可能会遇到不同的问题。所以,本节罗列我所使用的环境。

2.1.  Oracle服务器环境

我的Oracle数据库使用了最新的12.2.0.1.0版本,由于本身没有Oracle服务器,为了能够安装和配置OCCI搭建开发环境,特意安装了一台Oracle服务器。

由于最终的目的是为了OCCI,所以,这台服务器采用的操作系统是一台Win10 professional虚拟机。

2.2.  OCCI客户端环境

同样,OCCI客户端及SDK的版本也是12.2.0.1.0,版本需要相同。

客户端采用了Ubuntu 16.04。

3.  下载安装包

3.1.  注册Oracle账号

下载Oracle的安装介质,需要注册Oracle账户。没有Oracle账户的伙伴们先进入“Oracle网站”进行注册。

3.2.  下载Oracle

登陆Oracle账户之后,可以点击winx64_12201_database.zip直接下载Windows平台安装文件。

如果打算安装其他平台的Oracle,点击“Oracle下载列表”打开下载列表,并同意Oracle的license,选择相应操作系统的Oracle下载。

3.3.  下载instantclient

使用OCCI下面的三个包就够了。这里列出来的是我在Ubuntu 16.04下安装的Linux x86_64版本下载地址,点击直接下载:

instantclient-basic-linux.x64-12.2.0.1.0.zip
基本的客户端动态库文件,包括OCI、OCCI和JDBC-OCI。

instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
sqlplus以及sqlplus工具需要的动态库文件,安装这个包的目的是使用sqlplus测试与数据库的连接。

instantclient-sdk-linux.x64-12.2.0.1.0.zip
OCCI的SDK,即头文件以及ott工具(Object Type Translator)。

 

如果你想浏览其他操作系统版本的instant client以及相关介绍,请点击“Oracle instant client”进入Oracle instant client官方网站。

4.  安装

4.1.  安装Oracle服务器

数据库在Windows上安装,比较简单,在安装过程中,我使用的是desktop方式,即桌面方式,所以,Oracle以最轻便的方式安装和运行。

我建议为主机配置主机名称,假设数据库服务器命名为“oraserver”,我们在c:\windows\system32\drivers\etc\hosts文件中增加一行配置,例如:

192.168.1.9   oraserver

目的是将为TNS以及监听需要配置服务器的地方配置为主机名,而不是IP地址。对于其他需要配置IP的应用来说,也是一样的,配置主机名优于直接配置IP地址。否则,一旦IP地址发生变化,那么,我们就不得不到处去修改配置。

这里之所以提及Oracle数据库的安装是因为Oracle安装完成之后的监听和TNS的配置要做修改,将前面配置的主机名oraserver替换Oracle默认的localhost。例如我配置文件如下,红色高亮是需要的修改的参数。

监听文件:listener.ora,下面是我本地的目录:

D:\app\orauser\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = CLRExtProc)

      (ORACLE_HOME = D:\app\orauser\virtual\product\12.2.0\dbhome_1)

      (PROGRAM = extproc)

      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\orauser\virtual\product\12.2.0\dbhome_1\bin\oraclr12.dll")

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = oraserver)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

)

本地网络服务名配置文件:tnsnames.ora,下面是我本地的目录:

D:\app\orauser\virtual\product\12.2.0\dbhome_1\network\admin\tnsnames.ora

STORCDB =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = oraserver)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = storcdb)

    )

  )

 

LISTENER_STORCDB =

  (ADDRESS = (PROTOCOL = TCP)(HOST = oraserver)(PORT = 1521))

 

ORACLR_CONNECTION_DATA =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

    (CONNECT_DATA =

      (SID = CLRExtProc)

      (PRESENTATION = RO)

    )

  )

 

究其原因,如果监听使用localhost,导致的结果是Oracle服务仅会监听127.0.0.1:1521这个IP地址和端口,我们将无法通过网络连接这台数据库服务器。在测试连接的时候,你会收到无监听的错误:

ORA-12541: TNS:no listener

使用netstat命令可以查看1521(Oracle默认的监听端口号)端口绑定情况,正确的应该是:

C:\Windows\system32>netstat -an -p tcp

活动连接

  协议  本地地址          外部地址        状态

  TCP  0.0.0.0:1521   0.0.0.0:0      LISTENING

 

如果你看到的是127.0.0.1:1521,说明配置文件配置文件中配置的是localhost,这样是无法在远程连接数据库的。

另外,需要注意的是防火墙的设置,需要开通1521端口。

4.2.  安装Instantclient

出于同样的目的,我们首先客户端机器(Ubuntu)上配置Oracle服务器的主机名。使用

sudo vi /etc/hosts

编辑并添加如下配置:

192.168.1.9   oraserver

保存退出。

 

由于instant client使用了aio库,所以,在安装之前,我们需要先安装aio。在Ubuntu下使aio库名为libaio1,安装命令如下:

sudo apt-get install libaio1

 

解压缩前面下载的instant client包:

unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sqlplus-linux.x64-12.2.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip

 

解压缩后会生成instantclient_12_2目录,我们将该目录移动到/opt/oracle下,作为Oracle的HOME目录,所以,先建立/opt/oracle目录,然后移动:

sudo mkdir /opt/oracle
sudo mv instantclient_12_2 /opt/oracle

 

接下来我们需要为instantclient_12_2目录下的动态库创建符号链接,因为目标的动态库都是有版本号的,创建无版本号的链接指向具体一个有版本号的动态库,可以使多版本共存。这也是linux的传统和惯例。我们切换到刚才建立的目录下,为动态库创建符号链接文件:

cd /opt/oracle/instantclient_12_2
sudo ln -s libclntsh.so.12.1 libclntsh.so
sudo ln -s libocci.so.12.1 libocci.so

 

官方文档没有为libclntshcore.so创建符号链接,但是,我也为该动态库建立了符号链接,因为我是创建完符号链接才看的官方文档。我想的是为所有带版本号的动态库都建立没有版本号的符号链接,我没有测试不建立符号链接是否存在问题。

sudo ln -s libclntshcore.so.12.1 libclntshcore.so

 

然后,为instant client创建动态库加载路径的配置文件,为系统指定动态库加载路径,并重新加载动态库路径配置:

sudo echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf
sudo ldconfig

 

添加ORACLE_HOME环境变量,以及将其添加到PATH变量,以便系统可以搜索到sqlplus命令,并使其生效。

echo export ORACLE_HOME=/opt/oracle/instantclient_12_2 >> ~/.profile
echo PATH=\$ORACLE_HOME:\$PATH >> ~/.profile
. ~/.profile

 

配置TNS名称,使用TNS名称连接数据库。由于我们在Oracle数据库服务器以及客户端机器上配置的数据库服务器名称是一致的,所以,我们可以将服务器上的tnsnames.ora文件复制到客户机上$ORACLE_HOME/network/admin/tnsnames.ora,如果两面配置的主机名不一致,就要修改一下,不过,为什么要不一致呢?因此,需要创建下面的路径:

sudo mkdir –p $ORACLE_HOME/network/admin

复制数据库服务器上的tnsnames.ora文件到该目录下。

 

至此,我们可以使用sqlplus连接数据库,测试instantclient环境配置是否可以正常工作了。

sqlplus username/password@connstring

连接字符串(connstring)就是TNS名称。如果能够正常登录,客户端环境已经配置成功。

这里提醒这里提醒一下,你可以在Oracle服务器上使用sys/as sysdba登录数据库,修改密码,并创建一个一般用户。

 

5.  结束

依据本文走下来,我觉得一定没有问题。如果你真的遇到问题,那么,你要相信自己真的很幸运,然后,给我讲述你的幸运故事。我是说,真的幸运!

不过,似乎到现在为止,我们只有一个instantclient-sdk-linux.x64-12.2.0.1.0.zip压缩包与OCCI有关,实际上,我们搭建一个OCCI的开发环境,与搭建一个Oracle客户端的环境也没有什么区别,真的也就是多放了几个与OCCI有关的动态库而已。

下一篇文章介绍在这个环境下如何使用eclipse创建一个测试程序《OCCI小程序示例》,从数据库取得数据库服务器的时间,用以证明OCCI环境已经工作,同时也会有其他收获哦,推荐阅读。

posted on 2018-01-17 20:00  帅老  阅读(3944)  评论(0编辑  收藏  举报