
我在使用 freetds 從 Red Hat 機器連接到 Microsoft SQL Server 2005 時遇到問題。我的最終目標是能夠使用 php 的 PDO 進行連接,但在使用「tsql」測試時似乎無法連接。
我不認為這是防火牆問題,因為我可以很好地遠端登入。
$ telnet <ip> 1433
Trying <ip>...
Connected to <ip>.
Escape character is '^]'.
執行以下命令會產生以下結果:
$ TDSVER=7.1 tsql -H <ip> -p 1433 -U <user> -P <pass>
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
5Error 20003 (severity 6):
Adaptive Server connection timed out
OS error 115, "Operation now in progress"
Error 20002 (severity 9):
Adaptive Server connection failed
There was a problem connecting to the server
我相信這是正確的配置,因為如果我在本地 Debian 電腦上運行相同的命令,它似乎會成功。
$ TDSVER=7.1 tsql -H <ip> -p 1433 -U <user> -P <pass>
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>
我嘗試連接設定“TDSVER=7.0”、“TDSVER=7.2”、“TDSVER=8.0”,但它們都不起作用。
這是錯誤日誌:
09:50:45.013838 17363 (log.c:196):Starting log file for FreeTDS 0.91
on 2014-05-09 09:50:45 with debug flags 0xffff.
09:50:45.014138 17363 (iconv.c:330):tds_iconv_open(0x18e63e0, UTF-8)
09:50:45.014334 17363 (iconv.c:187):local name for ISO-8859-1 is ISO-8859-1
09:50:45.014349 17363 (iconv.c:187):local name for UTF-8 is UTF-8
09:50:45.014354 17363 (iconv.c:187):local name for UCS-2LE is UCS-2LE
09:50:45.014358 17363 (iconv.c:187):local name for UCS-2BE is UCS-2BE
09:50:45.014362 17363 (iconv.c:349):setting up conversions for client charset "UTF-8"
09:50:45.014366 17363 (iconv.c:351):preparing iconv for "UTF-8" <-> "UCS-2LE" conversion
09:50:45.014376 17363 (iconv.c:391):preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion
09:50:45.014389 17363 (iconv.c:394):tds_iconv_open: done
09:50:45.014400 17363 (net.c:205):Connecting to <ip> port 1433 (TDS version 7.1)
09:50:45.014577 17363 (net.c:270):tds_open_socket: connect(2) returned "Operation now in progress"
09:50:45.019725 17363 (net.c:310):tds_open_socket() succeeded
09:50:45.019751 17363 (util.c:156):Changed query state from DEAD to IDLE
09:50:45.019767 17363 (net.c:741):Sending packet
<censored>
09:50:50.021625 17363 (util.c:331):tdserror(0x18e6140, 0x18e63e0, 20003, 115)
09:50:50.021743 17363 (util.c:361):tdserror: client library returned TDS_INT_CANCEL(2)
09:50:50.021751 17363 (util.c:384):tdserror: returning TDS_INT_CANCEL(2)
09:50:50.021796 17363 (util.c:156):Changed query state from IDLE to DEAD
09:50:50.021808 17363 (login.c:466):login packet rejected
09:50:50.021813 17363 (util.c:331):tdserror(0x18e6140, 0x18e63e0, 20002, 0)
09:50:50.021823 17363 (util.c:361):tdserror: client library returned TDS_INT_CANCEL(2)
09:50:50.021828 17363 (util.c:384):tdserror: returning TDS_INT_CANCEL(2)
09:50:50.021833 17363 (mem.c:615):tds_free_all_results()
這是我的 /etc/freetds.conf 文件
# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".
# Global settings are overridden by those in a database
# server specific section
[global]
# TDS protocol version
tds version = 7.1
# Whether to write a TDSDUMP file for diagnostic purposes
# (setting this to /tmp is insecure on a multi-user system)
dump file = /tmp/freetds.log
debug flags = 0xffff
# Command and connection timeouts
timeout = 5
#connect timeout = 10
# If you get out-of-memory errors, it may mean that your client
# is trying to allocate a huge buffer for a TEXT field.
# Try setting 'text size' to a more reasonable limit
text size = 64512
# A typical Sybase server
#[egServer50]
# host = symachine.domain.com
# port = 5000
# tds version = 5.0
# A typical Microsoft server
#[egServer70]
# host = ntmachine.domain.com
# port = 1433
# tds version = 7.0
# Define a connection to the MSSQL server.
[mssql]
host = <ip>
port = 1433
tds version = 7.1
編輯:
我在免費的 TDS 文件中看到我應該使用 7.2,但這似乎不起作用。
http://www.freetds.org/userguide/choosingtdsprotocol.htm
編輯2:
我也嘗試過使用 sqsh
sqsh -D <dbname> -S <ipaddy> -U <user> -P <password>
sqsh-2.5 Copyright (C) 1995-2001 Scott C. Gray
Portions Copyright (C) 2004-2014 Michael Peppler and Martin Wesdorp
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
Open Client Message
Layer 0, Origin 0, Severity 78, Number 35
Adaptive Server connection timed out
答案1
問題是防火牆問題。
據我所知,當我這樣做時
telnet <ip> 1433
Trying <ip>...
Connected to <ip>.
它實際上沒有連接到伺服器。如果我給它一分鐘,它就會斷開連接。我在電腦上安裝了 Wireshark,並注意到伺服器沒有向 telnet 請求發送回應。
另一個證明這是防火牆問題的是我可以從另一台機器連接到資料庫,但不能從伺服器連接到資料庫。因此,我創建了一個 ssh 隧道來表明這不是應用程式的配置方式,而是網路的方式。
ssh -L 1433:theServerGivingMeIssues:1433 SQLserver
我可以在沒有隧道的情況下連接到 sql server,但使用隧道則無法連線。