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 | 1. 安装 Driver Manager,本案例使用 unixODBC 来作为 Driver Manager。 |
第一步:下载安装包
需要下载两个安装包 unixODBC 2.3.0
和 mysql 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 | 版本:5.1.11 |
第二步:安装 unixODBC
1 | tar -zxvf unixODBC-2.3.4.tar.gz |
安装完成后,可以在/usr/bin目录下有下面的文件
1 | -rwxr-xr-x 1 root root 75312 Nov 1 16:22 odbcinst |
在/usr/local/lib目录下面有这些文件
1 | -rwxr-xr-x 1 root root 422955 Nov 1 16:22 libodbcinst.so.1.0.0 |
第三步:安装 mysql Connector/ODBC
1 | tar -zxvf mysql-connector-odbc-5.1.11-linux-el6-x86-64bit.tar.gz |
注册驱动
1 | ./myodbc-installer -d -a -n "MySQL ODBC 5.1 Driver" -t "DRIVER=/usr/local/lib/libmyodbc5.so;SETUP=/usr/local/lib/libmyodbc5.so" |
假如注册的时候报错找不到libodbc.so.2,但是之前确实装成功了unixodbc,可能是因为系统找不到/usr/local/lib库目录,需要添加系统搜索库目录路径:
1 | vi /etc/ld.so.conf |
第四步:配置 ODBC.INI
1 | odbcinst -j |
编辑文件/etc/odbc.ini
,把下面的内容加上去。不同版本mysql
驱动的配置方法,有细微差异。此处使用的版本是mysql Connector 3.51
。
1 | [mysqlDSN] |
第五步:设置环境变量
1 | export DBCINI=/usr/local/etc/odbc.ini |
第六步:重启电脑
1 | reboot |
第七步:测试ODBC配置是否成功
isql 是 unixODBC 带的一个 ODBC 客户端访问工具,使用isql +数据源名
来访问目标数据库。如果 ODBC 配置正确,会显示下面的界面。在SQL>
提示符下输入 SQL 语句查询数据库。
1 | isql mysqlDSN |
遇到的问题:
1、在第三步安装 mysql connector/ODBC 中的注册驱动中,我总是会出现./myodbc-installer: error while loading shared libraries: libodbc.so.2: cannot open shared object file: No such file or directory.
这种错误,后来发现错误有两点:
- 我下载的是 mysql-connector-5.3.6 ,可能版本比较高,而我初次下载用的是unixODBC-2.3.0,版本较低,里面没有 libodbc.so.2 这个库文件(可以用
find / -name libodbc.so.2
来查)。后来下载了一个 unixODBC-2.3.4 就好了。 - 改了版本之后,我发现还是有这个错误,在网上查了下,说是程序查找默认路径为 /lib 和 /usr/lib,而我的 libmyodbc5w.so 和 libmmyodbc5a.so 都在 /usr/local/lib 中,所以查不到,所以需要设置一下共享库路径,以下我贴一下网上查的内容:
1 | cat /etc/ld.so.conf |
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 | error while loading shared libraries: libncurses.so.4: cannot open shared |
1 | ls /usr/lib/libncu* |
可见虽然没有 libncurses.so.4,但有 libncurses.so.5,是可以向下兼容的
建一个链接就好了
1 | ln -s /usr/lib/libncurses.so.5.3 /usr/lib/libncurses.so.4 |
4、isql 连接数据库失败,重新注册驱动:
1 | /usr/bin/myodbc-installer -d -a -n "MySQL_UNICODE" -t "DRIVER=/usr/lib64/libmyodbc8w.so;SETUP=/usr/lib64/libmyodbc8w.so" |
使用 rpm 命令查看 rpm 包的内容
1 | rpm -qpl xxx.rpm |
可以看到mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm
的包内容
1 | warning: mysql-connector-odbc-8.0.20-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY |
可以知道 rpm 包 安装的时候各个基础件的安装位置。