Docker中DB2 Community无法与unixODBC isql连接的求助
问题:Linux下通过unixODBC连接Docker中DB2 Community失败
在Linux环境中,我尝试通过ODBC连接运行在Docker容器里的DB2 Community,原生db2cli命令可以正常连接并执行操作,但使用unixODBC工具isql却无法建立连接,推测是配置问题但找不到解决方向,需要排查思路。
背景:为解决arrow-odbc项目相关问题,需实现DB2自动化测试。
DB2 ODBC/CLI驱动安装
mkdir -p /opt/ibm/ cp v11.5.8_linuxx64_odbc_cli.tar.gz /opt/ibm/ cd /opt/ibm/ tar xvf v11.5.8_linuxx64_odbc_cli.tar.gz export PATH=/opt/ibm/odbc_cli/clidriver/bin/:$PATH export LD_LIBRARY_PATH=/opt/ibm/odbc_cli/clidriver/lib/
Docker部署DB2 Community
启动DB2 LUW容器:
docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=testpassword -e DBNAME=testdb -v $HOME/db2_community:/database icr.io/db2_community/db2:latest
DB2 CLI/ODBC配置
注:db2cli registerdsn -add -dsn db2docker仅适用于Windows系统
sudo chgrp ross /opt/ibm/odbc_cli/clidriver/cfg/db2dsdriver.cfg sudo chmod 664 /opt/ibm/odbc_cli/clidriver/cfg/db2dsdriver.cfg cd $HOME db2cli writecfg add -dsn db2docker -database testdb -host localhost -port 50000
生成的db2dsdriver.cfg内容:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <configuration> <dsncollection> <dsn alias="db2docker" host="localhost" name="testdb" port="50000"/> </dsncollection> <databases> <database host="localhost" name="testdb" port="50000"/> </databases> </configuration>
连接验证
使用db2cli验证连接成功:
ross@ross-T480-linux:~$ db2cli validate -dsn db2docker -connect -user db2inst1 -passwd testpassword =============================================================================== Client information for the current copy: =============================================================================== Client Package Type : IBM Data Server Driver For ODBC and CLI Client Version (level/bit): DB2 v11.5.8.0 (s2209201700/64-bit) Client Platform : Linux/X8664 Install/Instance Path : /opt/ibm/odbc_cli/clidriver DB2DSDRIVER_CFG_PATH value: <not-set> db2dsdriver.cfg Path : /opt/ibm/odbc_cli/clidriver/cfg/db2dsdriver.cfg DB2CLIINIPATH value : <not-set> db2cli.ini Path : /opt/ibm/odbc_cli/clidriver/cfg/db2cli.ini db2diag.log Path : /opt/ibm/odbc_cli/clidriver/db2dump/db2diag.log =============================================================================== db2dsdriver.cfg schema validation for the entire file: =============================================================================== Success: The system db2dsdriver.cfg schema validation completed successfully without any errors. =============================================================================== db2cli.ini validation for data source name "db2docker": =============================================================================== Note: The validation utility could not find the configuration file db2cli.ini. The file is searched at "/opt/ibm/odbc_cli/clidriver/cfg/db2cli.ini". =============================================================================== db2dsdriver.cfg validation for data source name "db2docker": =============================================================================== [ Parameters used for the connection ] Keywords Valid For Value --------------------------------------------------------------------------- DATABASE CLI,.NET,ESQL testdb HOSTNAME CLI,.NET,ESQL localhost PORT CLI,.NET,ESQL 50000 =============================================================================== Connection attempt for data source name "db2docker": =============================================================================== [SUCCESS] =============================================================================== The validation is completed. ===============================================================================
执行测试脚本也正常:
ross@ross-T480-linux:~$ echo "VALUES current_schema;" > db2_test_script.sql ross@ross-T480-linux:~$ db2cli execsql -dsn db2docker -user db2inst1 -passwd testpassword -inputsql db2_test_script.sql IBM DATABASE 2 Interactive CLI Sample Program (C) COPYRIGHT International Business Machines Corp. 1993,1996 All Rights Reserved Licensed Materials - Property of IBM US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. > VALUES current_schema; FetchAll: Columns: 1 1 DB2INST1 FetchAll: 1 rows fetched. >
unixODBC配置问题
配置步骤
编辑/etc/odbcinst.ini:
[Db2] Description = Db2 Driver Driver = /opt/ibm/odbc_cli/clidriver/lib/libdb2o.so fileusage=1 dontdlclose=1
配置$HOME/.odbc.ini:
[db2dockerodbc] DRIVER=DB2 DBAlias=db2docker
连接失败
执行isql连接时报错:
ross@ross-T480-linux:~$ isql -v db2dockerodbc db2inst1 testpassword [ ][unixODBC][IBM][CLI Driver] SQL1531N The connection failed because the name specified with the DSN connection string keyword could not be found in either the db2dsdriver.cfg configuration file or the db2cli.ini configuration file. Data source name specified in the connection string: "DB2DOCKERODBC". [ISQL]ERROR: Could not SQLConnect
排查思路
- 检查大小写匹配:DB2的DSN别名区分大小写,错误提示中查找的是大写
DB2DOCKERODBC,但db2dsdriver.cfg里的别名是小写db2docker。可尝试将.odbc.ini中的DSN名称改为小写,或在db2dsdriver.cfg中添加对应大写的别名。 - 确认环境变量生效:
isql运行时可能未加载DB2驱动的环境变量,可显式指定后重试:
也可将环境变量写入全局配置(如LD_LIBRARY_PATH=/opt/ibm/odbc_cli/clidriver/lib/ isql -v db2dockerodbc db2inst1 testpassword/etc/profile或~/.bashrc)。 - 检查ODBC配置文件路径:unixODBC可能优先读取系统级
/etc/odbc.ini,而非用户级$HOME/.odbc.ini。可将.odbc.ini内容复制到/etc/odbc.ini,并确保文件权限为可读。 - 直接指定连接参数:绕过
DBAlias,在.odbc.ini中直接填写DB2连接参数,避免依赖db2dsdriver.cfg:[db2dockerodbc] DRIVER=DB2 DATABASE=testdb HOSTNAME=localhost PORT=50000 UID=db2inst1 PWD=testpassword - 验证位数匹配:确保unixODBC是64位版本,与DB2驱动的64位一致,可通过
odbcinst -j查看unixODBC的配置和位数。 - 查看诊断日志:检查
/opt/ibm/odbc_cli/clidriver/db2dump/db2diag.log中的详细错误信息,获取更多连接失败细节。
内容的提问来源于stack exchange,提问作者procrastinate_later
相关产品推荐
相关产品推荐

