Linux UnixODBC安装配置

news/发布时间2024/9/20 5:31:42

配置 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.bcls.cn/hwtf/9855.shtml

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

相关文章

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中&#xff0c;requests请求方法&#xff0c;当发送post/put/delete等带有请求体的请求时&#xff0c;有json和data2个参数可选。 众所周知&#xff0c;http请求的请求体格式主要有以下4种&#xff1a; application/json applicaiton/x-www-from-urlencoded …

gorm快速入门

【Golang】gorm快速入门 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【Golang】gorm快速入门1、什么是orm&#xff1f;为什么用orm&#xff1f;2、gorm连接以及使用 1、什么是orm&#xff1f;为什么用orm&#xff1f; ORM(Object-relational mapping)&#xff0c;中文…

【Linux C | 网络编程】gethostbyaddr 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

java实际项目反射、自定义注解的运用实现itext生成PDF的详细应用教程

开篇引语 小伙伴在学习java是否有这样的困混不知道反射是干嘛的&#xff0c;不知道注解有什么用。导致很多人看 java基础的时候迷迷糊糊&#xff0c;那是你还没有在实际项目中遇到&#xff0c;不知道该如何使用它们。接下来我会为你们详细讲解实际项目中是如何运用反射和自定义…

通过一篇文章让你了解数据结构和算法的重要性

通过一篇文章让你了解数据结构和算法的重要性 前言一、 什么是数据结构&#xff1f;二、什么是算法&#xff1f;三、数据结构和算法的重要性在校园招聘的笔试中&#xff1a;在校园招聘的面试中&#xff1a;在未来的工作中&#xff1a; 四、如何学好数据结构和算法4.1 死磕代码&…

持安科技亮相张江高科895创业营,总评分第三名荣获「最具创新性企业」!

近日&#xff0c;张江高科895创业营&#xff08;第十三季&#xff09;信息安全专场Demo day&结营仪式在上海集成电路设计产业园圆满落幕。本季创业营通过多种渠道在海内外甄选优秀创业项目&#xff0c;一共择优录取了29家入营&#xff0c;最终甄选出9家代表参加Demo day路演…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

科大睿智祝贺企业高标准高质量完成CMMI3级评估认证

航天万源实业有限公司是中国航天科技集团有限公司第一研究院的全资子公司&#xff0c;公司现有从业人员1400余人&#xff0c;年产值30亿元。是经北京市丰台区科学技术委员会审核的高新技术企业。公司践行“服务航天、保障科研”的使命&#xff0c;依托中国航天强大的科技优势、…

buuctf_misc_九连环

题目&#xff1a;&#xff08;一张123456cry.jpg&#xff09; 这个先直接上kali&#xff0c;图片已改名cry.jpg 在上一篇&#xff0c;我留存了kali文件夹下有"叉"打不开的问题&#xff0c;经查阅&#xff0c;已解决&#xff1a; http://t.csdnimg.cn/bgv4T 输入&a…

ref和reactive用哪个?

ref和reactive用哪个? 1.&#x1f916;GPT&#x1f916;:ref和reactive用哪个根据数据类型而定 ref 用于将基本类型的数据&#xff08;如字符串、数字&#xff0c;布尔值等&#xff09;转换为响应式数据。使用 ref 定义的数据可以通过 .value 属性访问和修改。 reactive 用于…

Windows Docker 部署 Redis

部署 Redis 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 redis 服务。这里安装的是 7.2.4 版本&#xff0c;如果需要安装其他或者最新版本&#xff0c;可以到 Docker Hub 中进行查找。 docker run -d --nam…

MySQL数据库下载及安装教程(最最新版)

MySQL数据库下载及安装教程&#xff08;最最新版&#xff09; 一、下载mysql数据库二、安装Mysql三、验证是否安装成功&#xff08;一&#xff09;、命令提示符cmd窗口验证&#xff08;二&#xff09;、MySQL控制台验证 一、下载mysql数据库 进入MySQL官方网站&#xff08;htt…

VR虚拟现实技术应用到猪抗原体检测的好处

利用VR虚拟仿真技术开展猪瘟检测实验教学确保生猪产业健康发展 为了有效提高猪场猪瘟防控意识和检测技术&#xff0c;避免生猪养殖业遭受猪瘟危害&#xff0c;基于VR虚拟仿真技术开展猪瘟检测实验教学数据能大大推动基层畜牧养殖业持续稳步发展保驾护航。 一、提高实验效率 VR虚…

LeetCode -- 131.分割回文串

1. 问题描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa…

网络爬虫的危害,如何有效的防止非法利用

近年来&#xff0c;不法分子利用“爬虫”软件收集公民隐私数据案件屡见不鲜。2023年8月23日&#xff0c;北京市高级人民法院召开北京法院侵犯公民个人信息犯罪案件审判情况新闻通报会&#xff0c;通报侵犯公民个人隐私信息案件审判情况&#xff0c;并发布典型案例。在这些典型案…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

使用Node.js构建一个简单的聊天机器人

当谈到人工智能&#xff0c;我们往往会想到什么&#xff1f;是智能语音助手、自动回复机器人等。在前端开发领域中&#xff0c;我们也可以利用Node.js来构建一个简单而有趣的聊天机器人。本文将带你一步步实现一个基于Node.js的聊天机器人&#xff0c;并了解其工作原理。 首先…

Vue源码系列讲解——实例方法篇【一】(数据相关方法)

目录 0. 前言 1. vm.$watch 1.1 用法回顾 1.2 内部原理 2. vm.$set 2.1 用法回顾 2.2 内部原理 3. vm.$delete 3.1 用法回顾 3.2 内部原理 0. 前言 与数据相关的实例方法有3个&#xff0c;分别是vm.$set、vm.$delete和vm.$watch。它们是在stateMixin函数中挂载到Vue原…

德人合科技 | —数据泄露可能会对公司造成哪些影响?

数据泄露可能会对公司造成多方面的影响&#xff0c;以下是一些可能的影响&#xff1a; 财务损失&#xff1a;数据泄露可能导致公司遭受财务损失。攻击者可能会盗取公司的敏感信息&#xff0c;如客户信息、银行账户信息、商业机密等&#xff0c;并利用这些信息进行欺诈、盗窃等非…

用户案例|GreptimeDB 助力贵州某机场智慧能源物联网系统

近年来&#xff0c;云计算和物联网技术的飞速发展促使许多传统单位的用电、用能系统向数字化、信息化、智能化的方向迈进&#xff0c;旨在实现全过程的实时智能协同&#xff0c;提高生产效率。而随着电力采集、监测数据功能的不断增强&#xff0c;数据量也在不断增加&#xff0…
推荐文章