“适配服务器”不可用或不存在.从PHP连接SQL Server出错


"Adaptive Server is unavailable or does not exist" error connecting to SQL Server from PHP

我试图连接到SQL Server 2005 DB从我的Mac使用unixODBC和FreeTDS,我在这里概述。但是,当我尝试使用相同的设置连接到另一个DB时,我得到:

Connection Failed:[FreeTDS][SQL Server]Unable to connect: Adaptive Server is unavailable or does not exist.

这是我的freetds.conf setup:

[my_db]
host = 12.34.56.789
port = 1433
tds version = 8.0

这里是我的odbc.ini:

[my_dsn]
Driver = /opt/local/lib/libtdsodbc.so
Description = My Database
Trace = no
Servername = my_db
Database = MyDB
[ODBC Data Sources]
my_dsn = FreeTDS

我仍然能够连接到我在这台计算机上设置的其他DB(在上面链接的我的博客文章中描述),所以我很确定错误不在Mac端。我已经在服务器上验证了我使用的是正确的IP地址和端口。有什么想法可能是问题,如果它是在服务器端吗?

1。查看SQL服务器

的信息
tsql -LH SERVER_IP_ADDRESS
locale is "C"
locale charset is "646"
ServerName TITAN
InstanceName MSSQLSERVER
IsClustered No
Version 8.00.194
tcp 1433
np ''TITAN'pipe'sql'query

2。设置freetds.conf

tsql -C    
freetds.conf directory: /usr/local/etc
[TITAN]
host = SERVER_IP_ADDRESS
port = 1433
tds version = 7.2

3

tsql -S TITAN -U user -P password

 'dsn' => 'dblib:host=TITAN:1433;dbname=YOURDBNAME',

参见http://www.freetds.org/userguide/confirminstall.htm (例3-5)

如果您收到信息20009,请记住您还没有连接到机器。这是配置或网络问题,而不是协议故障。验证服务器已启动,具有FreeTDS正在使用的名称和IP地址,并且正在侦听配置的端口。

在经历了无数个小时的挫折之后,我终于让所有的工作都开始了:

将odbcinst . ini:

[FreeTDS]
Description = FreeTDS Driver v0.91
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
fileusage=1
dontdlclose=1
UsageCount=1

odbc.ini:

[test]
Driver = FreeTDS
Description = My Test Server
Trace = No
#TraceFile = /tmp/sql.log
ServerName = mssql
#Port = 1433
instance = SQLEXPRESS
Database = usedbname
TDS_Version = 4.2

FreeTDS.conf:

[mssql]
host = hostnameOrIP
instance = SQLEXPRESS
#Port = 1433
tds version = 4.2

第一个测试连接(mssql是来自freetds.conf的节名):

tsql -S mssql -U username -P password

您必须看到一些设置,但没有错误,只有1>提示符。使用quit退出。

然后让我们测试DSN/FreeTDS (test是来自odbc.ini的节名;-v表示详细):

isql -v test username password -v

您必须看到消息已连接!

听起来您的dsn或odbc数据源有问题。

尝试先绕过dsn,然后使用:

TDSVER=8.0 tsql -S *serverIPAddress* -U *username* -P *password*

如果这工作,你知道这是一个问题与您的dsn或自由使用您的dsn。另外,您的tds版本可能与您的服务器不兼容。您可能需要尝试其他TDSVER设置(5.0、7.0、7.1)。

我有同样的问题,我的问题是服务器上的防火墙没有从当前ip地址打开。

响应,因为当我遇到同样的问题时,这个答案首先出现在搜索中:

[08S01][unixODBC][FreeTDS][SQL Server] cannot connect: Adaptive Server is unavailable or not exist

MSSQL命名实例必须在不设置端口的情况下正确配置。(freeds配置的文档说设置实例或端口而不是两者)

freetds.conf

[Name]
host = Server.com
instance = instance_name
#port = port is found automatically, don't define explicitly
tds version = 8.0
client charset = UTF-8

在odbc.ini中,当你使用命名实例时,你可以设置Port, DON'T。

我发现一个问题碰巧与防火墙有关。因此,请确保您的IP已被列入白名单,并且防火墙不会阻止您的连接。您可以使用以下命令检查连接:

tsql -H somehost.com -p 1433
在我的例子中,输出是:
Error 20009 (severity 9):
  Unable to connect: Adaptive Server is unavailable or does not exist
  OS error 111, "Connection refused"
There was a problem connecting to the server

我能够解决"自适应服务器";将主机名及其IP添加到客户端文件/etc/hosts的新行中(在linux/unix机器上,这是文件位置,对于windows机器,在c:'windows'下面的某个地方搜索带有hosts文件的etc文件夹):

...
192.168.1.10    sqlserver10
...

在这种情况下,缺少名称解析。

我知道可能有很多不同的原因导致这个错误消息。也许这能帮到别人。

发现另一个可能导致此问题的问题。FreeTDS v1.3及更高版本不支持协议版本8.0,因为据报道它被重命名为7.1:

关于过时的版本在FreeTDS的早期,微软并没有发布TDS协议的官方规格。当MSSQL 2000(产品8.0)发布时,微软社区有半官方的迹象表明TDS协议将是8.0版本。所以FreeTDS的开发者采用了这个版本。几年后,当微软开始发布协议的官方规范时,很明显,FreeTDS标记为8.0和9.0的TDS版本实际上分别是7.1和7.2。

Version 8.0不能从FreeTDS Version 1.3中使用。https://www.freetds.org/userguide/ChoosingTdsProtocol.html

似乎TDS版本甚至在FreeTDS 1.3之前就改变了(在我们的例子中是v1.2.21)。另外,文档似乎混淆了版本配对。我们花了很多个不眠之夜,但最终在~/.freetds.conf中我们不得不改变:

   tds version = 8.0

:

   tds version = 7.0

让它工作。我还建议在freetds.conf(或~/.freetds.conf)中设置转储文件,例如:

   dump file = /tmp/freetds.log
   debug flags = 0xffff

但是,禁用selinux或添加以下内容到您的RedHat/CentOS服务器:

setsebool -P httpd_can_network_connect_db 1
setsebool -P httpd_can_network_connect 1

最好的永远!

尝试将服务器名称更改为"localhost"

pymssql。连接(server="localhost", user="myusername", password="mypwd", database="temp",port="1433")