Linux UnixODBC安装配置

配置 UnixODBC

梦之上关注IP属地: 香港

0.2322020.12.09 13:23:10字数 1,202阅读 5,447

麒麟&达梦适配系列:

1.麒麟服务器上安装 DM8
2.配置 UnixODBC
3.beego-ORM 适配达梦

资源紧张的时候,服务器是大家共用的,上面部署了一堆服务。所以选用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.14RUN 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

docker ps | grep liutongtong

说明:第一列即为容器 ID

6 登录容器

docker exec -it 017a0f7a3067 bash

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

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

root@Kylin:/go# odbcinst -j
unixODBC 2.3.6
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

2 配置 odbc.ini

[DM8]
Description   = DM ODBC DSN
Driver     = DM8 ODBC DRIVER
SERVER     = 172.0.0.1
UID       = SYSDBA
PWD       = SYSDBA
TCP_PORT   = 5236

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

3 配置 odbcinst.ini

[DM8 ODBC DRIVER]
Description   = ODBC DRIVER FOR DM8
Driver     = /opt/dmdbms/bin/libdodbc.so
Setup     = /lib/libdmOdbcSetup.so
threading = 0

说明:

  • 这里的 title [DM8 ODBC DRIVER] 必须和 odbc.ini 中的 Driver 保持一致
  • 这里的 /opt/dmdbms/bin/libdodbc.so 是达梦的 so,而非 UnixODBC 自带的

4 使用 isql 登录数据库

root@Kylin:/go# isql -v DM8
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

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

5 执行任意 sql 测试

SQL> select * from v$version;
+---------------------------------------------------------------------------------+
| BANNER                                                                          |
+---------------------------------------------------------------------------------+
| DM Database Server 64 V8|
| DB Version: 0x7000b                                                             |
+---------------------------------------------------------------------------------+
SQLRowCount returns 2
2 rows fetched

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

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

docker commit e9f39c7081e0 unixodbc001 

说明:

  • e9f39c7081e0: 正在运行的容器ID,可以使用 docker ps 查看
  • unixodbc001:自定义的镜像名称
docker tag unixodbc001 registry.cn-beijing.aliyuncs.com/liutongtong/unixodbc001:V0.1
docker push registry.cn-beijing.aliyuncs.com/liutongtong/unixodbc001:V0.1

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

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

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

使用源码编译安装UnixODBC:

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

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

=> configure 时报错:cannot guess build type

./configure
UNAME_MACHINE = aarch64
UNAME_RELEASE = 4.4.131-20200704.kylin.server-generic
UNAME_SYSTEM  = Linux
UNAME_VERSION = #kylin SMP Sat Jul 4 19:29:27 CST 2020
configure: error: cannot guess build type; you must specify one

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

=> 无法编译出 .so文件

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

 ./configure  --build=arm --enable-shared

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

尝试手动合成 .so

root@greatwall-os:/usr/local/lib# ar -x libodbcinst.a
root@greatwall-os:/usr/local/lib# gcc -shared *.o -o  libodbcinst.so

报错:

/usr/bin/ld: libltdlc_la-ltdl.o: relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol `__stack_chk_guard@@GLIBC_2.17' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: libltdlc_la-ltdl.o(.text+0x6e4): 无法解决 R_AARCH64_ADR_PREL_PG_HI21 重定向于符号 “__stack_chk_guard@@GLIBC_2.17” 有冲突
/usr/bin/ld: 最后的链结失败: 错误的值
collect2: error: ld returned 1 exit status

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

make uninstall && make cleanCFLAGS="-fPIC" ./configure --build=arm 
# 编译出来还是 .a ,但是这回  .a 是可以合并成 .so 的ar -x /usr/local/lib/libodbc.a
gcc -shared *.o -o libodbc.so

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

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

=> isql 时报 file not found

[root@dameng-test001 dameng]# isql -v DM8 SYSDBA SYSDBA
[01000][unixODBC][Driver Manager]Can't open lib '/home/dmdba/dmdbms/bin/libdodbc.so' : file not found

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

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

[root@dameng-test001 dameng]# ldd /home/dmdba/dmdbms/bin/libdodbc.solinux-vdso.so.1 =>  (0x00007fff36943000)libdmdpi.so => not foundlibdmfldr.so => not foundlibrt.so.1 => /lib64/librt.so.1 (0x00007fbcec98a000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbcec76e000)libdl.so.2 => /lib64/libdl.so.2 (0x00007fbcec56a000)libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fbcec263000)libm.so.6 => /lib64/libm.so.6 (0x00007fbcebf61000)libc.so.6 => /lib64/libc.so.6 (0x00007fbcebb93000)libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fbceb97d000)/lib64/ld-linux-x86-64.so.2 (0x00007fbcece44000)

发现是找不到以来的lib

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

.bash_profile 中配置 LD_LIBRARY_PATH 变量:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdba/dmdbms/bin/

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

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

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

for i in  `ls /opt/dmdbms/bin/*.so`; do echo $i ;docker cp $i bed496495fee:/opt/dmdbms/bin/; done

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

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

=> cannot find -lodbc

报错详情:

root@Kylin:/Users/liutongtong/go/src/dameng-test/main# go run beego-orm.go
# github.com/alexbrainman/odbc/api
/usr/lib/gcc-cross/arm-linux-gnueabi/8/../../../../arm-linux-gnueabi/bin/ld: cannot find -lodbc
/usr/lib/gcc-cross/arm-linux-gnueabi/8/../../../../arm-linux-gnueabi/bin/ld: cannot find -lodbc

使用 ld 命令查看:

root@Kylin:/Users/liutongtong/go/src/dameng-test/main# ld /usr/local/lib/libodbc.so
ld: warning: cannot find entry symbol _start; not setting start address
ld: /usr/local/lib/libodbc.so: undefined reference to `dlopen'
ld: /usr/local/lib/libodbc.so: undefined reference to `dlclose'
ld: /usr/local/lib/libodbc.so: undefined reference to `dlerror'
ld: /usr/local/lib/libodbc.so: undefined reference to `dlsym'

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

重新编译:
./configure LIBS=-ldl CFLAGS=-fno-strict-aliasing --build=armconfigure的时候提示:
checking for shl_load... (cached) no
checking for shl_load in -ldld... (cached) no
checking for dld_link in -ldld... no
checking for _ prefix in compiled symbols... no尝试:
root@Kylin:/usr/local/lib# ar -x libodbcinst.a
root@Kylin:/usr/local/lib# gcc -shared *.o -o libodbcinst.so  -ldl之后 ld 报错:
root@Kylin:/Users/liutongtong/go/src/dameng-test/main# ld /usr/local/lib/libodbc.so
ld: warning: cannot find entry symbol _start; not setting start address

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

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

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

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

地址:https://www.jianshu.com/p/7ad3b055d847

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ShardingJdbc实战-分库分表

文章目录 基本配置分库分表的分片策略一、inline 行表达时分片策略algorithm-expression行表达式完整案例和配置如下 二、根据实时间日期 - 按照标准规则分库分表标准分片 - Standard完整案例和配置如下 基本配置 逻辑表 逻辑表是指&#xff1a;水平拆分的数据库或者数据表的相…

大小端问题

0. 介绍 大小端计算机存储数据而安排字节的两种顺序。 针对的是字节。 大端与我们平时书写的顺序一致。 1. 大小端的判定 不需要手动判断。 有一个头文件endian.h; 可能会有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通过库来进行判断。 手动判断 根据字节存取的顺序…

【JSON2WEB】07 Amis可视化设计器CRUD增删改查

总算到重点中的核心内容&#xff0c;CRUD也就是增删改查&#xff0c;一个设计科学合理的管理信息系统&#xff0c;95%的就是CRUD&#xff0c;达不到这个比例要重新考虑一下你的数据库设计了。 1 新增页面 Step 1 启动amis-editor Setp 2 新增页面 名称和路径随便命名&#xf…

Dynamo幕墙探究系列(一)

一直想写个系列教程&#xff0c;但是没有那么多时间整理资料&#xff0c;这次呢&#xff0c;先弄个小系列吧&#xff0c;还是和之前差不多的幕墙测试&#xff0c;我们分几节课&#xff0c;一步一步深入研究。 今天先开个小头儿&#xff0c;要弄的&#xff0c;就是下面这么个模型…

对象锁与类锁

不同锁互不影响&#xff0c;共用一个锁&#xff0c;可能会发生阻塞。 1.在修饰静态方法时&#xff0c;锁定的是当前类的 Class 对象&#xff0c;在下面的例子中就是SycTest1.class 2.当修饰非静态方法时&#xff0c;锁定的就是 this 对象&#xff0c;即当前的实例化对象 public…

【Git教程】(四)版本库 —— 存储系统,存储目录,提交对象及其命名、移动与复制~

Git教程 版本库 1️⃣ 一种简单而高效的存储系统2️⃣ 存储目录&#xff1a;Blob 与 Tree3️⃣ 相同数据只存储一次4️⃣ 压缩相似内容5️⃣ 不同文件的散列值相同6️⃣ 提交对象7️⃣ 提交历史中的对象重用8️⃣ 重命名、移动与复制&#x1f33e; 总结 事实上&#xff0c;我们…

keil MDK安装armcc V5编译器

不知道从什么时候开始&#xff0c;Keil MDK默认不支持V5的编译器了&#xff0c;里面默认只有V6的编译器&#xff0c;设置界面跟V5有很大的差异不太熟悉。最可怕的是&#xff0c;之前使用V5编译的工程&#xff0c;换成V6编译器后居然报错...虽然修改一下应该也可以正常编译&…

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

web自动化笔记九:验证码的处理方式

一、验证码常用的处理方式 ①、说明&#xff1a;Selenium中并没有对验证码处理的方法&#xff0c;在这里我们介绍一下针对验证码的几种常用处理方式 ②、方式&#xff1a; 1&#xff09;、去掉验证码&#xff08;测试环境下采用&#xff09; …

RDD算子介绍

1. RDD算子 RDD算子也叫RDD方法&#xff0c;主要分为两大类&#xff1a;转换和行动。转换&#xff0c;即一个RDD转换为另一个RDD&#xff0c;是功能的转换与补充&#xff0c;比如map&#xff0c;flatMap。行动&#xff0c;则是触发任务的执行&#xff0c;比如collect。所谓算子…

Mac专用投屏工具AirServer 7.27 for Mac中文版2024最新图文教程

Mac专用投屏工具AirServer 7.27 for Mac中文版是一款适用于Mac的投屏工具&#xff0c;可以将Mac屏幕快速投影到其他设备上&#xff0c;如电视、投影仪、平板等。 Mac专用投屏工具AirServer 7.27 for Mac中文版具有优秀的兼容性&#xff0c;可以与各种设备配合使用。无论是iPhon…

基于springboot+vue的在线考试系统(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能页面 三、论文 前言 现在我国关于在线考试系统的发展以及专注于对无纸化考试的完善程度普遍不高&#xff0c;关于对考试的模式还大部分还停留在纸介质使用的基础上&#xff0c;这种教学模式已不能解决现在的时代所产生的考试…

【MySQL】数据库的操作

【MySQL】数据库的操作 目录 【MySQL】数据库的操作创建数据库数据库的编码集和校验集查看系统默认字符集以及校验规则查看数据库支持的字符集查看数据库支持的字符集校验规则校验规则对数据库的影响数据库的删除 数据库的备份和恢复备份还原不备份整个数据库&#xff0c;而是备…

YOLOv9改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而&#xff0c;当图像分辨率较低或物体较小时&…

【LeetCode刷题】146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -…

【InternLM 实战营笔记】浦语·灵笔的图文理解及创作部署、 Lagent 工具调用 Demo

浦语灵笔的图文理解及创作部署 浦语灵笔是基于书生浦语大语言模型研发的视觉-语言大模型&#xff0c;提供出色的图文理解和创作能力&#xff0c;结合了视觉和语言的先进技术&#xff0c;能够实现图像到文本、文本到图像的双向转换。使用浦语灵笔大模型可以轻松的创作一篇图文推…

进程间的通信 -- 共享内存

一 共享内存的概念 1. 1 共享内存的原理 之前我们学过管道通信&#xff0c;分为匿名管道和命名管道&#xff0c;匿名管道通过父子进程的属性继承原理来完成父子进程看到同一份资源的目的&#xff0c;而命名管道则是通过路径与文件名来唯一标识管道文件&#xff0c;来让不同的进…

typescript 的常用方式

文章目录 前言一、绑定props 默认值的方式&#xff1a;withDefaults1.vue2 的props设置默认值2.vue3 的props设置默认值(1) 不设置默认值的写法(2) 设置默认值的写法&#xff08;分离模式&#xff09;(3) 设置默认值的写法&#xff08;组合模式&#xff09; 二、定义一个二维数…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

maven archetype 项目原型

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…