You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.3
    
    之后用tsql -S server_name -D db_name -U user_name -P pwd尝试连接
  • ODBC Driver 18:添加TrustServerCertificate=YES参数跳过证书验证,修改命令为:
    isql -v -k 'DRIVER={ODBC Driver 18 for SQL Server};SERVER=server_name,1433;DATABASE=db_name;UID=user_name;PWD=pwd;TrustServerCertificate=YES'
    
    同时可尝试降级到ODBC Driver 17,新版本驱动对旧SQL服务器的兼容性可能存在问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:54:53