I'm having a problem connecting to my Microsoft SQL Server 2005 from a Red Hat box using freetds. My end goal is to be able to connect using php's PDO, but I don't appear to be able to connect when testing using "tsql".

I don't think it is a firewall issue as I can telnet into it just fine.

$ telnet <ip> 1433
Trying <ip>...
Connected to <ip>.
Escape character is '^]'.

Running the command below results in the following:

$ 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

I believe this is the right configuration because if I run the same command on my local Debian machine it appears to succeed.

$ 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"

I've tried to connect setting "TDSVER=7.0", "TDSVER=7.2", "TDSVER=8.0" and they all don't work.

Here is the error log:

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


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()

Here is my /etc/freetds.conf file

#   $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
# 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
#   host = symachine.domain.com
#   port = 5000
#   tds version = 5.0

# A typical Microsoft server
#   host = ntmachine.domain.com
#   port = 1433
#   tds version = 7.0

# Define a connection to the MSSQL server.
host = <ip>
port = 1433
tds version = 7.1


I see in the free TDS documentation that I'm suppose to be using 7.2, but that doesn't appear to work.



I've also tried with 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
  • I do not exactly know (or care, to be honest) how are devs connect to the sql cluster using php, but I do know that they needed unixodbc when using freetds. According to the docs it should not be necessary, but in our experience it was. Maybe is that what you are missing? – natxo asenjo May 12 '14 at 9:08

The issue was a firewall issue.

As far as I can tell, when I did this

telnet <ip> 1433
Trying <ip>...
Connected to <ip>.

It actually wasn't connected to the server. If I gave it a minute it would disconnect. I installed Wireshark on the machine and noted that there was not response being sent from the server to the telnet request.

Another proved that it was a firewall issues was that I could connect to the database from another machine, but not from the server. So I made an ssh tunnel to show it was not the way the application was configured, but the network.

ssh -L 1433:theServerGivingMeIssues:1433 SQLserver

I could connect to the sql server without the tunnel, but I couldn't with the tunnel.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.