【问题标题】:FreeTDS connection problemsFreeTDS 连接问题
【发布时间】:2011-11-27 07:17:02
【问题描述】:

我正在使用 FreeTDS 0.91 连接到远程 MSSQL 服务器,但到目前为止所有尝试都没有结果。

在我的 Unix 上执行 tsql 命令时,我收到以下错误:

  locale is "en_US.UTF-8"
  locale charset is "UTF-8"
  using default charset "UTF-8"
  Error 20004 (severity 9)
  Read from the server failed
  OS error 104, "Connection reset by peer"
  Error 20002 (severity 9)
  Adaptive Server connection failed
  There was a problem connecting to the server

freetds.log 中包含以下内容:

16:05:49.144905 20207 (log.c:196):Starting log file for FreeTDS 0.91
  on 2011-09-28 16:05:49 with debug flags 0xffff.
  16:05:49.145281 20207 (iconv.c:330):tds_iconv_open(0x3d29320, UTF-8)
  16:05:49.145426 20207 (iconv.c:187):local name for ISO-8859-1 is ISO-8859-1
  16:05:49.145448 20207 (iconv.c:187):local name for UTF-8 is UTF-8
  16:05:49.145459 20207 (iconv.c:187):local name for UCS-2LE is UCS-2LE
  16:05:49.145469 20207 (iconv.c:187):local name for UCS-2BE is UCS-2BE
  16:05:49.145479 20207 (iconv.c:349):setting up conversions for client charset "UTF-8"
  16:05:49.145489 20207 (iconv.c:351):preparing iconv for "UTF-8" "UCS-2LE" conversion
  16:05:49.145508 20207 (iconv.c:391):preparing iconv for "ISO-8859-1" "UCS-2LE" conversion
  16:05:49.145533 20207 (iconv.c:394):tds_iconv_open: done
  16:05:49.145550 20207 (net.c:205):Connecting to 70.70.218.13 port 2600 (TDS version 7.0)
  16:05:49.145686 20207 (net.c:270):tds_open_socket: connect(2) returned "Operation now in progress"
  16:05:49.236008 20207 (net.c:310):tds_open_socket() succeeded
  16:05:49.236061 20207 (util.c:156):Changed query state from DEAD to IDLE
  16:05:49.236083 20207 (login.c:782):quietly sending TDS 7+ login packet
  16:05:49.236173 20207 (token.c:328):tds_process_login_tokens()
  16:05:49.857930 20207 (util.c:331):tdserror(0x3d29080, 0x3d29320, 20004, 104)
  16:05:49.858072 20207 (util.c:361):tdserror: client library returned TDS_INT_CANCEL(2)
  16:05:49.858090 20207 (util.c:384):tdserror: returning TDS_INT_CANCEL(2)
  16:05:49.858114 20207 (util.c:156):Changed query state from IDLE to DEAD
  16:05:49.858137 20207 (token.c:337):looking for login token, got  0()
  16:05:49.858155 20207 (token.c:122):tds_process_default_tokens() marker is 0()
  16:05:49.858168 20207 (token.c:125):leaving tds_process_default_tokens() connection dead
  16:05:49.858179 20207 (login.c:466):login packet accepted
  16:05:49.858189 20207 (util.c:331):tdserror(0x3d29080, 0x3d29320, 20002, 0)
  16:05:49.858209 20207 (util.c:361):tdserror: client library returned TDS_INT_CANCEL(2)
  16:05:49.858220 20207 (util.c:384):tdserror: returning TDS_INT_CANCEL(2)
  16:05:49.858232 20207 (mem.c:615):tds_free_all_results()

这似乎是 SQL 服务器的问题,还是我安装或配置了 FreeTDS 错误?

迷路了。请帮忙。


当我通过 telnet 连接到服务器时,这是我得到的响应:

正在尝试 70.70.218.13...
已连接到 70.70.218.13。
转义字符是 '^]'。
^^
连接被外部主机关闭。

这是否意味着与主机的 telnet 连接成功?

SQL 数据库在 Windows 服务器上运行。连接到 Windows 服务器(就像通过远程桌面一样)是用于主机名和端口的正确类型的值吗?还是我必须在 Windows 服务器上找到 SQL 服务器的直接主机名?

【问题讨论】:

  • 您可以发布 SQL Server 日志吗?你能从本地机器用telnet连接到端口吗?
  • 我注意到它使用的是 TDS 7.0 版。我过去不得不设置一个环境变量TDSVER=8.0 以获得成功的连接
  • 您可以从 FreeTDS 配置文件中发布您的主机配置吗?

标签: sql-server linux windows freetds


【解决方案1】:

汗。

我刚刚遇到了同样的情况。我通过在我的家中添加一个 .freetds.conf 解决了这个问题,

[global]
    # TDS protocol version
    tds version = 7.0 

我知道这正是大多数 FreeTDS 连接问题的答案。

这个方法也是@Michael Berkowski提供的。

【讨论】:

  • 谢谢。也为我工作
【解决方案2】:

对于五年的死灵深表歉意,似乎当tsql成功连接到开放端口时也会出现此错误,但侦听器是SQL Server以外的某些服务。似乎 FreeTDS 在登录时不会尝试检查它是否正在与 SQL Server 以外的服务进行通信,因此错误消息很神秘。 (就我而言,我使用的是远程桌面的端口号。)

【讨论】:

    【解决方案3】:

    如果您不想创建 .freetds.conf,您可以简单地设置 TDSVER 环境变量(例如,在 Windows 上连接到 SQL Server 2008 使用 TDS 版本 7.3):

    set TDSVER=7.3
    

    (对于 *nix 使用 export)。

    有关更多环境变量,请参阅http://www.freetds.org/userguide/envvar.htm。

    请参阅http://www.freetds.org/userguide/choosingtdsprotocol.htm 了解不同 RDBMS 的 TDS 版本

    您还可以通过设置环境变量TDSDUMP 来指定日志文件的路径,该路径可以提供更多信息,这将有助于解决问题并告诉您查找配置文件的位置。例如

    set TDSDUMP=C:\temp\freetds.log
    

    在我的例子中,设置 TDSDUMP 变量在日志中发现了一个错误:

    iconv.c:346:setting up conversions for client charset "CP1252;LC_CTYPE=English_United States.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C"
    iconv.c:348:preparing iconv for "CP1252;LC_CTYPE=English_United States.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C" <-> "UCS-2LE" conversion
    iconv.c:423:tds_iconv_info_init: client charset name "-1" invalid
    

    显然 FreeTDS 没有从字符串“CP1252;LC_CTYPE=English_United States.1252;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C”中解析字符集名称

    我创建了一个.freetds.conf 文件,其内容如下:

    [global]
        tds version = 7.3           # version 7.3 for MSSQL 2008
        client charset = UTF-8      # so that we can get unicode characters
    

    并按照日志文件的建议将其保存到C:\Windows\System32\config\systemprofile\AppData\Roaming\,这为我解决了问题。

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2014-12-31
      • 2011-12-22
      相关资源
      最近更新 更多