posts - 504, comments - 195, trackbacks - 0, articles - 0

导航

linux下使用go-oci8

Posted on 2014-01-09 17:26  蝈蝈俊  阅读(...)  评论(...编辑  收藏

地址:https://github.com/wendal/go-oci8

它是 https://github.com/mattn/go-oci8 的分支. win下安装步骤参考:http://www.cnblogs.com/ghj1976/p/3437250.html

下面的安装步骤主要参考了:https://github.com/Centny/Centny/blob/master/Articles/How%20build%20github.com%3amattn%3ago-oci8.md

 

首先通过pkg-config工具确认你已安装了oci8 c-lib

pkg-config这一工具是用来检索系统中安装库文件的信息。其主要功能如下:

  • 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
  • 获得编译预处理参数,如宏定义,头文件的位置。
  • 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
  • 自动加入所依赖的其它库的设置。

--exists,可以用来测试模块的可用性。
$ pkg-config --exists oci8||echo no
显示 no 说明pkg-config 没有找到相应的 oci8.pc

http://www.cppblog.com/nenlong/archive/2012/09/04/189480.html

 

安装oci8:

从 OTN Instant Client 页面下载 Basic 和 SDK Instant Client 程序包。

OCI是指ORACLE调用接口(Oracle Call Interface),它提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。

OCI是集成在 Oracle Database Instant Client 的Basic 版本中的。下载地址如下:
http://www.oracle.com/technetwork/database/features/instant-client/index.html

比如我这里下载的是:

instantclient-sdk-linux.x64-12.1.0.1.0.zip
instantclient-basic-linux.x64-12.1.0.1.0.zip

如果您使用 ZIP 文件,应该将 SDK 解压缩到 basic 程序包所在的目录中

解压缩参数参考:http://www.ezloo.com/2008/01/linux_zip_unzip.html

1),切换到root帐号
2),解压缩 instantclient-basic-linux.x64-12.1.0.1.0.zip 到 /usr/local/ 目录下,得到的路径为 /usr/local/instantclient_12_1/
3),解压缩 instantclient-sdk-linux.x64-12.1.0.1.0.zip,会得到一个和步骤2)中相同名称的目录,该目录下有一个名称为 sdk 的子目录,将其移动到 /usr/local/instantclient_12_1/ 目录下,最终的目录结构如下:

image

具体命令如下:

解压缩 basic文件

[root@localhost oci]# unzip instantclient-basic-linux.x64-12.1.0.1.0.zip -d /usr/local/
Archive:  instantclient-basic-linux.x64-12.1.0.1.0.zip
  inflating: /usr/local/instantclient_12_1/BASIC_README
  inflating: /usr/local/instantclient_12_1/adrci
  inflating: /usr/local/instantclient_12_1/genezi
  inflating: /usr/local/instantclient_12_1/libclntsh.so.12.1
  inflating: /usr/local/instantclient_12_1/libclntshcore.so.12.1
  inflating: /usr/local/instantclient_12_1/libnnz12.so
  inflating: /usr/local/instantclient_12_1/libocci.so.12.1
  inflating: /usr/local/instantclient_12_1/libociei.so
  inflating: /usr/local/instantclient_12_1/libocijdbc12.so
  inflating: /usr/local/instantclient_12_1/libons.so
  inflating: /usr/local/instantclient_12_1/liboramysql12.so
  inflating: /usr/local/instantclient_12_1/ojdbc6.jar
  inflating: /usr/local/instantclient_12_1/ojdbc7.jar
  inflating: /usr/local/instantclient_12_1/uidrvci
  inflating: /usr/local/instantclient_12_1/xstreams.jar

解压缩 sdk 文件

unzip instantclient-sdk-linux.x64-12.1.0.1.0.zip -d /usr/local/

 

下一步,手动创建一个符号链接:

ln -s libclntsh.so.12.1 libclntsh.so
 

image 

参考: http://blog.chinaunix.net/uid-20769015-id-3919458.html

 

 

修改oci8.pc文件

(/usr/lib/pkgconfig/ 目录下):

# Package Information for pkg-config

prefix=/usr/local/instantclient_12_1/
libdir=${prefix}
includedir=${prefix}/sdk/include/

Name: OCI
Description: Oracle database engine
Version: 12.1
Libs: -L${libdir} -lclntsh
Libs.private:
Cflags: -I${includedir}

修改完后,注意需要设置全局参数: PKG_CONFIG_PATH , 否则会报下面错误:

Package oci8 was not found in the pkg-config search path.
Perhaps you should add the directory containing `oci8.pc'
to the PKG_CONFIG_PATH environment variable
No package 'oci8' found

设置方法在 /etc/profile 文件中增加下面一条:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig/

 

http://blog.csdn.net/joker_zhou/article/details/8907915

 

http://stackoverflow.com/questions/764871/installing-oracle-instantclient-on-linux-without-setting-environment-variables

 

 

配置用户的Oracle客户端环境变量配置

到该用户的根目录,编辑 .bash_profile 文件,设置环境变量.

vi .bash_profile

在内容后面新增如下配置:

export ora_home=/usr/local/instantclient_12_1
export PATH=$PATH:$ora_home
export LD_LIBRARY_PATH=$ora_home

http://blog.csdn.net/lsxy117/article/details/8647600

 

 

 

 

这时候执行  go get github.com/wendal/go-oci8  就可以正常下载并编译了.

 

Oracle 客户端服务配置文件配置

要连接到某一台 oracle 服务器, 一般我们用 tnsnames.ora 文件方式来设置.

在一个目录下新建一个 tnsnames.ora 文件(比如我是建立在 /usr/local/instantclient_12_1/tns 目录下的 ),用于配置连接字符串别名。

这个文件内容类似如下,参考 http://hi.baidu.com/sunxden/item/f5e1423a9bfc298df4e4ad4b

ORA10 =
(DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVICE_NAME = ora10)
   )
)

 

修改全局配置文件,增加一个 TNS_ADMIN 设置 ,指向这个目录。

set TNS_ADMIN=/usr/local/instantclient_12_1/tns

这杨我们连接字符串就可以写成  用户名/密码@实例名

 

 

整个安装过程中,全局变量设置的地方很多, 下面是我自己的 profile文件的相关设置:

export ora_home=/usr/local/instantclient_12_1

export PATH=$PATH:/sbin:/usr/local/go/bin:$ora_home
export GOPATH=/home/ghj1976/gocodes
export PKG_CONFIG_PATH=/usr/lib/pkgconfig/

export TNS_ADMIN=$ora_home/tns

export LD_LIBRARY_PATH=$ora_home

 

用工具检查oracle的连接

连接 oracle时,有时候我们需要用一些工具来判断连接问题,比如常见的:

ORA-12154: TNS:could not resolve the connect identifier specified  问题。

 

这时候就需要装一些类似下面的工具:

*Instant Client Package - SQL*Plus: Additional libraries and executable for running SQL*Plus with Instant Client

image

下载地址: http://618119.com/archives/2008/03/20/76.html 

解压缩后我们会看到新加了 sqlplus 工具。

$unzip instantclient-sqlplus-linux.x64-12.1.0.1.0.zip -d ./
Archive:  instantclient-sqlplus-linux.x64-12.1.0.1.0.zip
  inflating: ./instantclient_12_1/SQLPLUS_README
  inflating: ./instantclient_12_1/glogin.sql
  inflating: ./instantclient_12_1/libsqlplus.so
  inflating: ./instantclient_12_1/libsqlplusic.so
  inflating: ./instantclient_12_1/sqlplus

**************sqlplus 连接远程数据库系统**********************

方式一:简易连接,不用进行网络配置,

其实就是不用tnsname.ora文件,但只支持oracle10G以上。
命令:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba]
示例:sqlplus sys/pwd@ip:1521/test as sysdba
备注:使用默认1521端口时可省略输入

如果上述方式测试没问题,表示网络是通的。

 

方式二:使用 tnsnames 配置的别名

进行网络配置

2.1、图形化操作:Net Configuration Assistant--> 本地Net服务名配置-->添加->服务名->协议(选tcp)->主机名称->端口->完成。

2.2、文本化操作:编辑$ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora文件
test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ip或主机名称)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = 数据库的服务名称)
    )
  )
备注说明:红色为修改部分

  • PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
  • HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使hostname命令得到机器名,或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在hosts文件中加入数据库侦听所在的机器的机器名的解析。
  • PORT:数据库侦听正在侦听的端口.可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
  • SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus> show parameter service_name命令察看。
    ======================================================================

如何保证客户端机器连接到oracle数据库呢? 引用:http://www.cnoug.org/viewthread.php?tid=15661
A.  客户端
1.在客户端机器上安装ORACLE的Oracle Net通讯软件,它包含在oracle的客户端软件中。
2.正确配置了sqlnet.ora文件
3.正确配置了tnsname.ora文件

B.  服务器端
1.保证listener已经启动 lsntctl start
2.保证数据库已经启动。 sql>startup

连接命令,  比如是上面的配置文件:

sqlplus user/password@test

sqlplus 连接用户名/密码@tns别名

方式三:tns别名部分用 tns的配置文件替代

sqlplus user/password@(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))

if you are using linux or unix OS you need to use quotes else the () are interpreted by the shell

e.g

sqlplus user/password@'(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))'

http://stackoverflow.com/questions/761418/how-come-sqlplus-not-connecting

这种方式对分析 tnsname 文件配置错误非常有帮助, 我就碰到过一次 ( 配错,导致连接不上的问题。

http://www.cnblogs.com/winkey4986/archive/2012/09/20/2695259.html 

===

http://blog.csdn.net/lsxy117/article/details/8647600

http://blog.csdn.net/joker_zhou/article/details/8907915

https://github.com/Centny/Centny/blob/master/Articles/How%20build%20github.com:mattn:go-oci8.md

http://blog.csdn.net/joker_zhou/article/details/8907915

===

http://www.oracle.com/technetwork/cn/articles/dsl/technote-php-instant-090922-zhs.html

参考

pkg-config指南
http://blog.csdn.net/exbob/article/details/6991037

 

理解 pkg-config 工具
http://www.chenjunlu.com/2011/03/understanding-pkg-config-tool/

Linux中的configure、pkg-config、pkg_config_path
http://yiluohuanghun.blog.51cto.com/3407300/946170