【问题标题】:"Adaptive Server is unavailable or does not exist" error connecting to SQL Server from PHP从 PHP 连接到 SQL Server 时出现“自适应服务器不可用或不存在”错误
【发布时间】:2012-01-20 15:13:10
【问题描述】:

我正在尝试使用 unixODBC 和 FreeTDS 从我的 Mac 连接到 SQL Server 2005 DB,正如我在 here 中所概述的那样。但是,当我尝试使用相同的设置连接到不同的数据库时,我得到:

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
  • 我在任何地方都找不到libtdsodbc.so 使用find 命令。我正在使用 centos 5

标签: php sql-server sql-server-2005 freetds unixodbc


【解决方案1】:

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

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

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

如果可行,您知道这是您的 dsn 或使用您的 dsn 的 freetds 的问题。此外,您的 tds 版本可能与您的服务器不兼容。您可能想尝试其他 TDSVER 设置(5.0、7.0、7.1)。

【讨论】:

  • TDSVER=8.0 tsql -S *serverIPAddress* -U *username* -P *password* 这对我有用,但在 freetds 中没有区别
  • 是否也有可能是odbc没有正确安装?例如,Ubuntu 上的正确步骤是什么?
【解决方案2】:

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

[08S01][unixODBC][FreeTDS][SQL Server]无法连接:Adaptive Server 不可用或不存在

必须正确配置 MSSQL 命名实例而不设置端口。 (documentation on the freetds config 说设置实例或端口不是两者)

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:该网站不再可用。
  • @Naidim:例如,可能的值是什么?这似乎不在文档中,而且我有一种有趣的感觉,我的不是 SQL Express。
  • @AdrianKeister 检查您的 SQL Server 实例的名称,查看这些答案stackoverflow.com/questions/16088151/…
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    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 地址,并且正在侦听配置的端口。

    【讨论】:

    • 谢谢,我需要指定端口(@98​​7654326@ 用于 pymssql),LH 命令让我很容易找到它。
    • 如果 tsql -LH 没有输出,下一步应该采取什么措施?
    • 太棒了。拯救了我的一天。
    • @EvgeniyTkachenko:即使地址正确,有时 LH 命令也不会返回任何内容。 LH 是否已弃用?
    • @Adrian Keister 我使用的是 FreeTDS(2011 年 5 月 14 日)(man tsql)。我没有遇到您的问题。
    【解决方案5】:

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

    setsebool -P httpd_can_network_connect_db 1
    setsebool -P httpd_can_network_connect 1
    

    永远最好!

    【讨论】:

      【解决方案6】:

      经过无数小时的挫折后,我设法让所有工作:

      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
      

      您必须看到消息已连接!

      【讨论】:

        【解决方案7】:

        我发现防火墙发生了问题。因此,请确保您的 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
        

        【讨论】:

          【解决方案8】:

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

          pymssql.connect(server="localhost", user="myusername", password="mypwd", database="temp",port="1433")

          【讨论】:

          • 如果您尝试连接到另一台机器上的数据库,此答案将毫无帮助。
          【解决方案9】:

          我能够通过将主机名及其 IP 添加到客户端上文件 /etc/hosts 中的新行来解决“自适应服务器”错误(在 linux/unix 机器上,这是文件位置,用于 windows 机器搜索对于在c:\windows\ 下方某处带有主机文件的 etc 文件夹):

          ...
          192.168.1.10    sqlserver10
          ...
          
          

          所以在这种情况下,名称解析丢失了。

          我知道导致此错误消息的原因可能有很多。也许这对某人有帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            • 1970-01-01
            • 1970-01-01
            • 2020-05-07
            • 2013-04-04
            • 1970-01-01
            相关资源
            最近更新 更多