Red Hat 8通过ODBC与FreeTDS无法连接MS SQL 2016 SP2求助
问题:Red Hat 8连接MS SQL 2016 SP2失败(FreeTDS/MS ODBC均报错)
在Red Hat 8系统中尝试连接MS SQL 2016 SP2,使用FreeTDS和微软ODBC两种方式均失败。已知Windows 10可正常连接该数据库,且此Linux服务器能连接其他带自签名证书的MS SQL Server;目标服务器原本无证书,安装证书后问题仍未解决。
FreeTDS连接情况
执行命令:
tsql -S server_name -p 1433 -D db_name -U user_name -P pwd
错误日志:
log.c:187:Starting log file for FreeTDS 1.3.13 on 2023-03-29 16:26:07 with debug flags 0x4fff. dblib.c:1187:tdsdbopen(0x55590bb585b0, servername.domain.int:1433, [microsoft]) dblib.c:1213:tdsdbopen: dbproc->dbopts = 0x55590bc57890 dblib.c:1224:tdsdbopen: tds_set_server(0x55590bc256d0, "servername.domain.int:1433") dblib.c:251:dblib_get_tds_ctx(void) dblib.c:1241:tdsdbopen: About to call tds_read_config_info... config.c:170:Getting connection information for [servername.domain.int:1433]. config.c:174:Attempting to read conf files. config.c:362:... $FREETDSCONF not set. Trying $FREETDS/etc. config.c:375:... $FREETDS not set. Trying $HOME. config.c:301:Could not open '/home/orch_dev/.freetds.conf' ((.freetds.conf)). config.c:301:Could not open '/usr/local/etc/freetds.conf' ((default)). config.c:362:... $FREETDSCONF not set. Trying $FREETDS/etc. config.c:375:... $FREETDS not set. Trying $HOME. config.c:301:Could not open '/home/orch_dev/.freetds.conf' ((.freetds.conf)). config.c:301:Could not open '/usr/local/etc/freetds.conf' ((default)). config.c:833:Setting 'dump_file' to 'stdout' from $TDSDUMP. config.c:724:tds_config_login: client_charset is UTF-8. config.c:733:tds_config_login: database_name is CM_SIM. config.c:833:Setting 'dump_file' to 'stdout' from $TDSDUMP. dblib.c:1268:tdsdbopen: Calling tds_connect_and_login(0x55590bc44a40, 0x55590bc29310) iconv.c:367:tds_iconv_open(0x55590bc342e0, UTF-8) iconv.c:198:local name for ISO-8859-1 is ISO-8859-1 iconv.c:198:local name for UTF-8 is UTF-8 iconv.c:198:local name for UCS-2LE is UCS-2LE iconv.c:198:local name for UCS-2BE is UCS-2BE iconv.c:389:setting up conversions for client charset "UTF-8" iconv.c:391:preparing iconv for "UTF-8" <-> "UCS-2LE" conversion iconv.c:430:tds_iconv_open: done net.c:391:Connecting with protocol version 7.4 net.c:318:Connecting to 10.22.222.222 port 1433 net.c:340:tds_setup_socket: connect(2) returned "Operation now in progress" net.c:528:tds_open_socket() succeeded packet.c:852:Sending packet packet.c:361:timeout util.c:333:tdserror(0x7fff3c1b3070, 0x55590bc44a40, 20003, 115) util.c:363:tdserror: client library returned TDS_INT_CANCEL(2) util.c:386:tdserror: returning TDS_INT_CANCEL(2) query.c:3757:tds_disconnect() util.c:179:Changed query state from IDLE to DEAD packet.c:539:Read attempt when state is TDS_DEAD login.c:599:login packet rejected util.c:333:tdserror(0x7fff3c1b3070, 0x55590bc44a40, 20002, 0) util.c:363:tdserror: client library returned TDS_INT_CANCEL(2) util.c:386:tdserror: returning TDS_INT_CANCEL(2) net.c:391:Connecting with protocol version 5.0 net.c:318:Connecting to 10.22.222.222 port 1433 net.c:340:tds_setup_socket: connect(2) returned "Operation now in progress" net.c:528:tds_open_socket() succeeded token.c:418:tds_process_login_tokens() packet.c:361:timeout util.c:333:tdserror(0x7fff3c1b3070, 0x55590bc44a40, 20003, 115) util.c:363:tdserror: client library returned TDS_INT_CANCEL(2) util.c:386:tdserror: returning TDS_INT_CANCEL(2) query.c:3757:tds_disconnect() mem.c:656:tds_free_all_results() util.c:179:Changed query state from IDLE to WRITING util.c:333:tdserror(0x7f8fe33da960, 0x55590bc44a40, 20003, 110) util.c:369:tdserror: client library not called because either tds_ctx (0x7f8fe33da960) or tds_ctx->err_handler is NULL util.c:386:tdserror: returning TDS_INT_CANCEL(2) query.c:3757:tds_disconnect()
微软ODBC连接情况
执行命令:
isql -v -k 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=server_name,1433;DATABASE=db_name ;UID=user_name;PWD=pwd'
错误日志:
[S1T00][Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired [08001][Microsoft][ODBC Driver 18 for SQL Server]TCP Provider: Timeout error [258]. [08001][Microsoft][ODBC Driver 18 for SQL Server]Unable to complete login process due to delay in prelogin response [ISQL]ERROR: Could not SQLDriverConnect
已知信息
- Windows 10可正常连接目标MS SQL 2016 SP2服务器
- 该Red Hat 8服务器能正常连接其他带自签名证书的MS SQL Server
- 目标服务器原本无证书,安装证书后问题仍未解决
解决思路
网络层面排查
- 执行
telnet server_name 1433或nc -zv server_name 1433确认端口连通性,虽然日志显示socket连接成功,但需排查是否存在数据包丢失或延迟过高的情况 - 检查防火墙/安全组规则:确认Red Hat 8到目标SQL服务器的1433端口双向流量未被拦截,注意目标服务器的出站规则可能与Windows客户端的允许范围不同
- 抓包分析:用
tcpdump在Red Hat 8上捕获目标服务器1433端口的流量,对比Windows上的连接数据包,排查握手异常、数据包未响应等问题
驱动配置适配
- FreeTDS:指定与SQL 2016匹配的TDS版本(SQL 2016对应TDS 7.3),可在命令中添加
-C 7.3,或创建~/.freetds.conf配置文件:
之后用[server_name] host = server_name port = 1433 tds version = 7.3tsql -S server_name -D db_name -U user_name -P pwd尝试连接 - ODBC Driver 18:添加
TrustServerCertificate=YES参数跳过证书验证,修改命令为:
同时可尝试降级到ODBC Driver 17,新版本驱动对旧SQL服务器的兼容性可能存在问题isql -v -k 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=server_name,1433;DATABASE=db_name;UID=user_name;PWD=pwd;TrustServerCertificate=YES'
SQL服务器配置检查
- 确认目标SQL Server的TCP/IP协议已启用,且监听1433端口(在SQL Server配置管理器中检查)
- 确认SQL Server允许混合身份验证(如果使用SQL账号而非Windows域账号)
- 查看SQL Server的登录日志,检查是否有来自Red Hat 8服务器的登录请求记录,是否存在权限或认证相关的拒绝信息
系统环境适配
- 检查Red Hat 8的时间同步:确保Linux服务器与SQL服务器时间差在5分钟以内,避免时间偏差影响认证流程
- 确认FreeTDS和ODBC驱动的依赖库(如
glibc、openssl)安装完整,版本符合驱动要求
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

