odbc 的配置

odbc 的配置

相关技术栈:linux、mysql

安装配置之前,需要先大概了解一下 MyODBC 的架构,MyODBC 体系结构建立在 5 个组件上,如下图所示:

Driver Manager
负责管理应用程序和驱动程序间的通信,主要功能包括:解析 DSN (数据源名称,ODBC 的数据源名称在 odbc.ini 文件中配置),加载和卸载驱动程序,处理 ODBC 调用,将其传递给驱动程序。

ODBC.INI
odbc.ini 是 ODBC 配置文件,记录了连接到服务器所需的驱动信息和数据库信息xxxxxx。Driver Manager 将使用它来确定加载哪个驱动程序(使用数据源名 DSN )。驱动程序将根据指定的DSN来读取连接参数。

Connector/ODBC(MyODBC驱动程序)
实现 ODBC API 所提供的功能,它负责处理 ODBC 函数调用,将 SQL 请求提交给 MySQL 服务器,并将结果返回给应用程序。

在 Linux 下配置 mysql ODBC 需要有以下步骤:

1
2
3
1. 安装 Driver Manager,本案例使用 unixODBC 来作为 Driver Manager。
2. 安装 MySQL 驱动程序,本案例使用 Connector/ODBC。
3. 配置 ODBC.INI

第一步:下载安装包

需要下载两个安装包 unixODBC 2.3.0mysql Connector/ODBC 3.51
unixODBC 源码包:ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz
mysql Connector/ODBC 源码包:http://dev.mysql.com/downloads/connector/odbc/3.51.html%23downloads
选择

1
2
3
版本:5.1.11
平台:Oracle&Red Hat Linux6
下载:mysql-connector-odbc-5.1.11-linux-el6-x86-64bit.tar.gz

第二步:安装 unixODBC

1
2
3
4
5
tar -zxvf unixODBC-2.3.4.tar.gz
cd unixODBC-2.3.4
./configure --prefix=/usr/local/unixODBC-2.3.4 --includedir=/usr/include --libdir=/usr/local/lib -bindir=/usr/bin --sysconfdir=/usr/local/etc
make
make install

安装完成后,可以在/usr/bin目录下有下面的文件

1
2
3
4
5
-rwxr-xr-x 1 root root      75312 Nov 1 16:22 odbcinst
-rwxr-xr-x 1 root root 10922 Nov 1 16:22 odbc_config
-rwxr-xr-x 1 root root 37650 Nov 1 16:22 iusql
-rwxr-xr-x 1 root root 44400 Nov 1 16:22 isql
-rwxr-xr-x 1 root root 95903 Nov 1 16:22 dltest

在/usr/local/lib目录下面有这些文件

1
2
3
4
5
6
7
8
9
10
11
12
-rwxr-xr-x 1 root root 422955 Nov 1 16:22 libodbcinst.so.1.0.0
lrwxrwxrwx 1 root root 20 Nov 1 16:22 libodbcinst.so.1 -> libodbcinst.so.1.0.0
lrwxrwxrwx 1 root root 20 Nov 1 16:22 libodbcinst.so -> libodbcinst.so.1.0.0
-rwxr-xr-x 1 root root 981 Nov 1 16:22 libodbcinst.la
-rwxr-xr-x 1 root root 169157 Nov 1 16:22 libodbc.so.1.0.0
lrwxrwxrwx 1 root root 16 Nov 1 16:22 libodbc.so.1 -> libodbc.so.1.0.0
lrwxrwxrwx 1 root root 16 Nov 1 16:22 libodbc.so -> libodbc.so.1.0.0
-rwxr-xr-x 1 root root 957 Nov 1 16:22 libodbc.la
-rwxr-xr-x 1 root root 489405 Nov 1 16:22 libodbccr.so.1.0.0
lrwxrwxrwx 1 root root 18 Nov 1 16:22 libodbccr.so.1 -> libodbccr.so.1.0.0
lrwxrwxrwx 1 root root 18 Nov 1 16:22 libodbccr.so -> libodbccr.so.1.0.0
-rwxr-xr-x 1 root root 969 Nov 1 16:22 libodbccr.la

第三步:安装 mysql Connector/ODBC

1
2
3
4
5
tar -zxvf mysql-connector-odbc-5.1.11-linux-el6-x86-64bit.tar.gz
cd mysql-connector-odbc-5.1.11-linux-el6-x86-64bit/lib
cp libmyodbc5.so /usr/local/lib
cd ..
cd bin

注册驱动

1
2
3
./myodbc-installer -d -a -n "MySQL ODBC 5.1 Driver" -t "DRIVER=/usr/local/lib/libmyodbc5.so;SETUP=/usr/local/lib/libmyodbc5.so"

//odbc 5.3及以上是libmyodbc5a.so和libmyodbc5w.so。其中c5a是Ansi版,c5w是Unicode版

假如注册的时候报错找不到libodbc.so.2,但是之前确实装成功了unixodbc,可能是因为系统找不到/usr/local/lib库目录,需要添加系统搜索库目录路径:

1
2
3
4
5
6
7
vi /etc/ld.so.conf

//将/usr/local/lib直接添加在配置文件里

ldconfig

//重新缓存配置文件(为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件/etc/ld.so.cache缓存文件并从中进行搜索的)

第四步:配置 ODBC.INI

1
2
3
4
5
6
7
8
9
10
odbcinst -j

unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

编辑文件/etc/odbc.ini,把下面的内容加上去。不同版本mysql驱动的配置方法,有细微差异。此处使用的版本是mysql Connector 3.51

1
2
3
4
5
6
7
8
9
10
[mysqlDSN]
Driver = /usr/local/lib/libmyodbc5.so
Description = MyODBC 5 Driver DSN
SERVER = 172.31.108.133
PORT = 3306
USER = root
Password = 123456
Database = PM
OPTION = 3
charset = UTF8

第五步:设置环境变量

1
2
export DBCINI=/usr/local/etc/odbc.ini
export DBCSYSINI=/usr/local/etc

第六步:重启电脑

1
reboot

第七步:测试ODBC配置是否成功

isql 是 unixODBC 带的一个 ODBC 客户端访问工具,使用isql +数据源名来访问目标数据库。如果 ODBC 配置正确,会显示下面的界面。在SQL>提示符下输入 SQL 语句查询数据库。

1
2
3
4
5
6
7
8
9
10
isql mysqlDSN

+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+

遇到的问题:

1、在第三步安装 mysql connector/ODBC 中的注册驱动中,我总是会出现./myodbc-installer: error while loading shared libraries: libodbc.so.2: cannot open shared object file: No such file or directory.这种错误,后来发现错误有两点:

  1. 我下载的是 mysql-connector-5.3.6 ,可能版本比较高,而我初次下载用的是unixODBC-2.3.0,版本较低,里面没有 libodbc.so.2 这个库文件(可以用find / -name libodbc.so.2来查)。后来下载了一个 unixODBC-2.3.4 就好了。
  2. 改了版本之后,我发现还是有这个错误,在网上查了下,说是程序查找默认路径为 /lib 和 /usr/lib,而我的 libmyodbc5w.so 和 libmmyodbc5a.so 都在 /usr/local/lib 中,所以查不到,所以需要设置一下共享库路径,以下我贴一下网上查的内容:
1
2
3
4
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig

2、如果共享库文件安装到了其它”非 /lib 或 /usr/lib “ 目录下,但是又不想在 /etc/ld.so.conf 中加路径(或者是没有权限加路径)。那可以 export 一个全局变量 LD_LIBRARY_PATH ,然后运行程序的时候就会去这个目录中找共享库。

LD_LIBRARY_PATH 的意思是告诉 loader 在哪些目录中可以找到共享库。

可以设置多个搜索目录,这些目录之间用冒号分隔开。

比如:

安装了一个 mysql 到 /usr/local/mysql 目录下,其中有一大堆库文件在 /usr/local/mysql/lib 下面,则可以在 .bashrc 或 .bash_profile 或 shell 里加入以下语句即可:

1
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH    

一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。

3、如果程序需要的库文件比系统目前存在的村文件版本低,可以做一个链接
比如:

1
2
error while loading shared libraries: libncurses.so.4: cannot open shared
object file: No such file or directory
1
2
3
ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3

可见虽然没有 libncurses.so.4,但有 libncurses.so.5,是可以向下兼容的
建一个链接就好了

1
ln -s  /usr/lib/libncurses.so.5.3  /usr/lib/libncurses.so.4

4、isql 连接数据库失败,重新注册驱动:

1
2
/usr/bin/myodbc-installer  -d -a -n "MySQL_UNICODE"  -t "DRIVER=/usr/lib64/libmyodbc8w.so;SETUP=/usr/lib64/libmyodbc8w.so"
/usr/bin/myodbc-installer -d -a -n "MySQL_ANSI" -t "DRIVER=/usr/lib64/libmyodbc8a.so;SETUP=/usr/lib64/libmyodbc8a.so"

使用 rpm 命令查看 rpm 包的内容

1
rpm -qpl xxx.rpm

可以看到mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm的包内容

1
2
3
4
5
6
7
8
9
10
warning: mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
/usr/bin/myodbc-installer
/usr/lib64/libmyodbc8a.so
/usr/lib64/libmyodbc8w.so
/usr/share/doc/mysql-connector-odbc-8.0.20
/usr/share/doc/mysql-connector-odbc-8.0.20/ChangeLog
/usr/share/doc/mysql-connector-odbc-8.0.20/INFO_BIN
/usr/share/doc/mysql-connector-odbc-8.0.20/INFO_SRC
/usr/share/doc/mysql-connector-odbc-8.0.20/LICENSE.txt
/usr/share/doc/mysql-connector-odbc-8.0.20/README.txt

可以知道 rpm 包 安装的时候各个基础件的安装位置。