使用PHP连接SQL Server时出现“Adaptive Server不可用或不存在”的错误。

59

我在尝试使用unixODBC和FreeTDS从我的Mac连接到SQL Server 2005数据库,如我在这里所述。但是,当我尝试使用相同的设置连接到另一个数据库时,我会得到以下错误:

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

这是我的freetds.conf设置:

[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

我仍能够连接到我在这台计算机上设置的另一个数据库(在我上面链接的博客文章中描述),因此我非常确定错误不是在 Mac 端。我已在服务器上验证了我使用了正确的 IP 地址和端口。你有什么想法,可能出了什么问题,如果它是在服务器端?


我找到了以下 ini 文件。我应该使用哪一个? ./root/php/freetds-0.91/samples/odbc.ini ./usr/local/unixODBC/etc/odbc.ini ./usr/local/etc/odbc.ini ./usr/share/doc/freetds-devel-0.64/samples/odbc.ini ./etc/php.d/odbc.ini ./etc/odbc.ini ./var/tmp/php-5.2.6-2-root-root/etc/php.d/odbc.ini - shorif2000
1
我使用 find 命令无法找到 libtdsodbc.so 文件。我正在使用 CentOS 5。 - shorif2000
11个回答

48

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',

另请参阅(示例3-5)http://www.freetds.org/userguide/confirminstall.htm

如果您收到20009消息,请记住您尚未连接到该计算机。 这是配置或网络问题,而不是协议故障。 确认服务器已启动,具有FreeTDS正在使用的名称和IP地址,并正在侦听配置的端口。


3
谢谢,我需要指定端口(ip:port对于pymssql),LH命令让我轻松地找到了它。 - Adversus
6
如果执行 "tsql -LH" 没有输出结果,下一步该怎么办? - brad
太棒了。救了我的一天。 - Murwa
有时 LH 命令即使地址正确也不会返回任何内容。 LH 已被弃用吗? @EvgeniyTkachenko - Adrian Keister
@Adrian Keister
我使用FreeTDS(2011年5月14日)(man tsql)。我不明白你的问题。
- Evgeniy Tkachenko

19

经过无数个小时的挫败后,我设法让所有事情都正常工作了:

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

首先测试连接 (mssqlfreetds.conf 中的一部分名称):

tsql -S mssql -U username -P password

你应该能看到一些设置,但没有错误,只有一个1>提示。使用quit退出。

然后让我们测试DSN/FreeTDS(testodbc.ini中的一个部分名称;-v表示冗长模式):

isql -v test username password -v

您必须看到“已连接”消息!


13

听起来你遇到了dsn或odbc数据源的问题。

先尝试绕过dsn,使用以下方式连接:

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

如果这样做可以解决问题,那么问题可能出在您的dsn或freetds使用dsn上。同时,您的tds版本也有可能与服务器不兼容。您可以尝试其他TDSVER设置(5.0、7.0、7.1)。


2
TDSVER=8.0 tsql -S serverIPAddress -U username -P password 这对我来说是有效的,但在freetds中没有任何区别。 - shorif2000
ODBC安装不正确也是可能的吗?例如,在Ubuntu上,正确的步骤是什么? - Adrian Keister

8
我曾遇到同样的问题,我的问题在于服务器上的防火墙未开放当前IP地址。

6

因为这个答案是在我遇到同样问题时搜索出来的,所以现在回复一下:

[08S01] [unixODBC] [FreeTDS] [SQL Server]无法连接:自适应服务器不可用或不存在

MSSQL命名实例必须配置正确,不能设置端口。(freetds配置文档中说要么设置实例,要么设置端口,两者不可同时设置)

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中,虽然你可以设置端口,但是当你使用命名实例时,请不要设置端口。

@Jan:那个网站已经不可用了。 - Adrian Keister
1
@Naidim:实例的可能值是什么?文档中好像没有提到,我有一种奇怪的感觉我的不是SQL Express。 - Adrian Keister
1
@AdrianKeister,请检查您的SQL Server实例名称,参见以下答案:https://dev59.com/H2Qo5IYBdhLWcg3wZepg - Jan

3
我发现问题与防火墙有关。所以,请确保您的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

3
我通过将主机名和其IP地址添加到客户端的/etc/hosts文件中的新行中来解决了"自适应服务器"错误(在Linux/Unix机器上,这是文件位置,在Windows机器上搜索位于c:\windows\下方的etc文件夹中的hosts文件):
...
192.168.1.10    sqlserver10
...

因此,这种情况下名称解析出现了问题。

我知道导致这个错误信息的原因可能有很多不同的原因。也许这可以帮助某些人。


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

关于过时版本 在FreeTDS早期,Microsoft没有发布TDS协议的官方规范。当MSSQL 2000(产品8.0)发布时,来自Microsoft社区的半官方迹象表明TDS协议将是版本8.0。因此,FreeTDS开发人员采用了该版本的FreeTDS。多年后,当Microsoft开始发布协议的官方规范时,很明显,FreeTDS标记为8.0和9.0的TDS版本实际上分别是版本7.1和7.2。

从FreeTDS版本1.3开始无法使用版本8.0。 https://www.freetds.org/userguide/ChoosingTdsProtocol.html

看起来在FreeTDS 1.3之前(我们的情况是v1.2.21),TDS版本就已经发生了变化。此外,文档中似乎混淆了版本配对。经过多个不眠之夜,最终我们不得不更改~/.freetds.conf文件中的内容:

   tds version = 8.0

to:

   tds version = 7.0

为了使其工作,我建议在freetds.conf(或~/.freetds.conf)中设置转储文件,例如:

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

并检查此文件以获取更多信息。


0
当我遇到这个错误时,我正在家里工作,问题只是我的VPN断开了。
我试图访问的数据库在没有VPN的情况下无法从防火墙外部访问。
一旦我意识到VPN不工作了,我只需重新打开它,问题就消失了。

-6
伙计,禁用selinux或将以下内容添加到您的RedHat/CentOS服务器中:
setsebool -P httpd_can_network_connect_db 1
setsebool -P httpd_can_network_connect 1

祝一切顺利!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接