配置 UnixODBC

安装千万条,环境第一条。Docker 是个好东西,推荐你多用~

资源紧张的时候,服务器是大家共用的,上面部署了一堆服务。所以选用docker 进行 unix odbc 的编译和适配。避免牵一发而动全身,影响他人使用。(我不会告诉你其实:是服务器 gcc 版本太低了,编译报错

因为最终,我们是使用 golang 进行开发的。所以基于 golang1.14 镜像来构建。

1 创建 Dockerfile

root@Kylin:/data/liutongtong011# cd /data/liutongtong011
root@Kylin:/data/liutongtong011# touch Dockerfile

Dockerfile 内容:

FROM golang:1.14

RUN apt-get update && \
    apt-get install -y unixodbc-dev unixodbc && \
    go get github.com/alexbrainman/odbc

2 根据 Dockerfile build 镜像

docker build - < Dockerfile -t liutongtong011

3 查看镜像是否存在

docker images | grep liutongtong011

4 启动容器

docker run -it liutongtong011

说明:执行完 docker run 自动就登录到容器内了。如果想要再其他session进入容器,执行以下步骤:

5 查看容器 ID

说明:第一列即为容器 ID

6 登录容器

容器启动成功后,在容器内部进行 UnixODBC 的配置:

1 使用 odbcinst -j 命令查看 odbc的配置

2 配置 odbc.ini

说明:为了减少出错的可能,我就直接将 /root/.odbc.ini/etc/odbc.ini 配置成一样的了

3 配置 odbcinst.ini

说明:

  • 这里的 title [DM8 ODBC DRIVER] 必须和 odbc.ini 中的 Driver 保持一致

  • 这里的 /opt/dmdbms/bin/libdodbc.so 是达梦的 so,而非 UnixODBC 自带的

4 使用 isql 登录数据库

说明:-v 的作用是,一旦报错,可以展示报错详情

5 执行任意 sql 测试

如果 isql 可以成功连接DB,并能执行测试语句,说明 UnixODBC 配置成功。

这里简单介绍几个Docker命令,熟悉Docker的同学可以跳过这一趴:

说明:

  • e9f39c7081e0: 正在运行的容器ID,可以使用 docker ps 查看

  • unixodbc001:自定义的镜像名称

说明:像镜像仓库中提交该镜像,以后用的时候,直接拉取即可。

现实往往是残酷的,上面简单的几步中可能会遇到许多问题。

我把自己在安装过程中踩的坑,报的错及解决方案列在下面,供大家参考:

使用源码编译安装UnixODBC:

起初在网上找了达梦大学的官方教程:http://www.dameng.com/teachers_view.aspx?TypeId=183&Id=891&FId=t26:183:26

按照里面的步骤进行源码安装。最先遇到的问题是:

=> configure 时报错:cannot guess build type

解决办法:./configure --build=arm

=> 无法编译出 .so文件</font>

即便增加enable-shared也无法解决问题

编译出来的始终是 .a.la 文件。

尝试手动合成 .so

报错:

解决办法:清除现有 odbc,增加 configure 参数后重新安装

=> could not determine kind of name for C.SQL_WLONGVAR

之前用的UnixODBC2.21版本过低,升级到2.3.2即可解决问题

=> isql 时报 file not found

使用 ls -l /home/dmdba/dmdbms/bin/libdodbc.so 命令可以看到文件存在,且权限为可访问。

使用 ldd 命令查看依赖是否有问题:

发现是找不到以来的lib

进行全局查找:find / -name "libdmdpi.so" 发现实际上时存在的。路径为:/home/dmdba/dmdbms/bin/ (这里路径和之前不一致是因为,为了保证可行性,先在Linux上做了适配

.bash_profile 中配置 LD_LIBRARY_PATH 变量:

=>[S1000][unixODBC]Encryption module failed to load

这是因为,在DM8中,加密模块已不在libdodbc.so

解决办法:把安装目录 /opt/dmdbms/bin 下的所有 .so 文件都拷贝到 docker 中

=>[IM004][unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed

odbcinst.ini 中配置的 Driver libdodbc.so 必须得是达梦的,不能是UnixODBC自己生成的

=> cannot find -lodbc

报错详情:

使用 ld 命令查看:

按照网上搜索来的方法进行尝试:

总之是越做越错,越尝试越绝望。

这个问题后来通过重新拉镜像解决了。原来是我在疯狂的改环境的时候,无意间造成了破坏。

幸好是在 Docker 里,没有对他人造成影响。

这个故事告诉我们:一团乱麻的时候,不妨重新来过

最后更新于

这有帮助吗?