SQL Server 2019 Linux容器中PolyBase通过ODBC查询AS400报错如何解决
解决方案
1. 补全容器依赖(修改Dockerfile)
你当前的Dockerfile缺失IBM iAccess ODBC驱动的依赖组件,以及ODBC诊断工具,修改安装部分的逻辑如下:
# 在安装IBM驱动前补全依赖 RUN apt-get update RUN apt-get install -y mssql-server-polybase unixodbc unixodbc-dev libxml2 RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 RUN ACCEPT_EULA=Y apt-get install -y mssql-tools # 先装依赖再装IBM驱动 RUN dpkg -i /usr/src/app/ibm-iaccess-1.1.0.15-1.0.amd64.deb RUN apt-get install -fy # 验证驱动注册 RUN odbcinst -q -d | grep -i "IBM i Access"
重新构建镜像后启动容器,先进入容器执行isql命令测试ODBC连接是否正常,排除驱动本身的问题:
# 替换为实际的AS400地址、用户名、密码 isql -v "DRIVER={IBM i Access ODBC Driver};SYSTEM=MYAS400.MYDOMAIN.com;PORT=8471;CCSID=1208;UID=AS400UID;PWD=AS400PWD"
如果该命令返回连接成功,再继续后续SQL配置,否则先解决驱动/网络/权限问题。
2. 开启SQL Server PolyBase相关配置
连接到SQL Server实例,执行以下命令开启通用ODBC连接支持:
sp_configure 'show advanced options', 1 RECONFIGURE GO sp_configure 'polybase enabled', 1 RECONFIGURE GO sp_configure 'hadoop connectivity', 7 RECONFIGURE GO -- 重启SQL Server服务生效
3. 修正外部数据源配置
你当前的配置存在连接参数重复的问题,且缺少必要的ODBC参数,修改为以下格式:
CREATE EXTERNAL DATA SOURCE MYAS400 WITH ( -- 通用ODBC场景下LOCATION仅做标识使用,实际连接参数以CONNECTION_OPTIONS为准 LOCATION = 'odbc://unused', CONNECTION_OPTIONS = 'DRIVER={IBM i Access ODBC Driver};SYSTEM=MYAS400.MYDOMAIN.com;PORT=8471;CCSID=1208;', PUSHDOWN = OFF, CREDENTIAL = AS400CREDENTIAL );
注意:AS400的用户名默认大小写敏感,确保凭据里的IDENTITY和实际AS400用户名大小写完全一致。
4. 修正外部表LOCATION格式
DB2 for i(AS400)没有独立的database层级,LOCATION直接填写<库名(Library)>.<表名>即可,无需加数据库前缀:
CREATE EXTERNAL TABLE EXT.Test ( hstr NCHAR(50) NOT NULL, hreg NCHAR(50) NOT NULL, htr# NCHAR(50) NOT NULL, httm NCHAR(50) NOT NULL ) WITH ( -- 替换为实际的AS400库名和表名,注意大小写匹配 LOCATION='MYAS400_LIBRARY.TABLE_NAME', DATA_SOURCE= MYAS400 )
5. 可选排查项
- 确认容器内可以正常访问AS400的8471端口,无防火墙或DNS解析问题
- 查看SQL Server的PolyBase日志,路径默认在
/var/opt/mssql/log/polybase下,获取更详细的报错信息
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

