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.pswp.cn/news/714574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Lua速成(7)

一、Lua 元表(Metatable) 在 Lua table 中我們可以訪問對應的 key 來得到 value 值&#xff0c;但是卻無法對兩個 table 進行操作(比如相加)。 因此 Lua 提供了元表(Metatable)&#xff0c;允許我們改變 table 的行為&#xff0c;每個行為關聯了對應的元方法。 例如&#xf…

ShardingJdbc實戰-分庫分表

文章目錄 基本配置分庫分表的分片策略一、inline 行表達時分片策略algorithm-expression行表達式完整案例和配置如下 二、根據實時間日期 - 按照標準規則分庫分表標準分片 - Standard完整案例和配置如下 基本配置 邏輯表 邏輯表是指&#xff1a;水平拆分的數據庫或者數據表的相…

SpringBoot實戰(1)

SpringBoot總結 一,Spring 設計思想 OOP: 面向對象編程-》封裝、繼承、多態 BOP: 面向Bean編程-》一切從Bean開始 AOP: 面向切面編程-》解藕、專 人做專事 IOC: 控制反轉,將new 對象的操作交給Spring統一管理-》轉交控制權 DI/DL: 依賴注入/依賴查找-》自動賦值 DI和AOP…

LLVM 一些重要文檔 LLVM 3.0

基于LLVM 3.0: Documentation for the LLVM System at SVN head LLVM 作為庫的使用方法&#xff1a; Using The LLVM Libraries LLVM C 的編程規范&#xff1a; LLVM Coding Standards

stl 迭代器(Iterator)

定義 迭代器&#xff08;Iterator&#xff09;是STL&#xff08;Standard Template Library&#xff0c;標準模板庫&#xff09;中的一個核心概念&#xff0c;用于提供一種通用的方式來遍歷容器&#xff08;如vector、list、map等&#xff09;中的元素&#xff0c;而無需暴露容…

大小端問題

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編譯器后居然報錯...雖然修改一下應該也可以正常編譯&…

神經網絡基礎知識:LeNet的搭建-訓練-預測

1.參考視頻&#xff1a; 2.1 pytorch官方demo(Lenet)_嗶哩嗶哩_bilibili 2.總結&#xff1a; &#xff08;1&#xff09;LeNet網絡就是 我最開始用來預測mnist數據集的那個網絡&#xff0c;簡單的2個conv2個maxpool3個linear層 &#xff08;2&#xff09;up主整理的train.py…

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。所謂算子…

LeetCode 1551.是數組中所有元素相等的最小操作數

存在一個長度為 n 的數組 arr &#xff0c;其中 arr[i] (2 * i) 1 &#xff08; 0 < i < n &#xff09;。 一次操作中&#xff0c;你可以選出兩個下標&#xff0c;記作 x 和 y &#xff08; 0 < x, y < n &#xff09;并使 arr[x] 減去 1 、arr[y] 加上 1 &…

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;當圖像分辨率較低或物體較小時&…