【问题标题】:PHP: Connect to a MS SQL Server with Dynamic Port AllocationPHP:使用动态端口分配连接到 MS SQL Server
【发布时间】:2014-04-02 14:27:45
【问题描述】:

我正在尝试使用 PHP 浏览客户的 Microsoft SQL Server 数据库,但端口 1433 已关闭。挖掘后发现 MSSQL 可以在 Dynamic Port Allocation 模式下运行,这意味着它会在第一次执行时选择一个随机监听端口,并且很可能在整个启动过程中保持不变。我知道我可以找到当前端口,但是由于 可能 不是 总是 并且我想避免再次搜索它,有没有办法远程发现要连接的端口?

据我的搜索了解,这项工作通常由 SQLBrowser(.exe ?) 完成,但如何在 Linux 上执行此操作?

解决方案更新

虽然@Chris 的回答是正确的,但我遗漏了一个简单但必不可少的部分:在每次更改 odbc.ini 时,您都需要运行:

odbcinst -i -s -f /etc/odbc.ini

更新系统的 DSN。 之后我可以使用

进行连接
isql -v DSN_NAME username password

疑难解答

检查服务器实例:

tsql -H HOSTNAME_OR_IP -L

这将打印服务器信息,包括您应该能够使用标准 telnet 或 mssql 客户端连接的实例名称和端口。

【问题讨论】:

  • 可能是 MS 的“安全功能”之一......

标签: php sql-server


【解决方案1】:

鉴于您的回答是正确的,我必须进行一些小的更改才能使其正常工作。我决定把它们写在这里。步骤基本相同。在 Ubuntu/Debian 上:

apt-get install php5-sybase unixodbc tdsodbc

编辑/etc/odbcinst.ini 并添加驱动程序详细信息

[TDS]
Description = FreeTDS Driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so

编辑/etc/odbc.ini 并输入连接详情

[SQLSRV01]
Description = SQL Server test
Driver = TDS
Trace = No
Server = SERVER_IP\INSTANCE_NAME
TDS_Version = 9.0
#Database = DataBaseName
#ReadOnly = Yes

最后两个参数是可选的。 驱动程序 必须与我们在 odbcinst.ini 中编写的内容相匹配。 Server 指令必须采用该语法(当然 SERVER_IP 也可以是主机名)。

根据 UnixODBC,下一步应该是不必要的,但这就是我的安装工作的原因。运行以下命令(每次更改 odbc.ini 时)

odbcinst -i -s -f /etc/odbc.ini

在此之后,您应该可以使用以下方式进行连接:

isql -v SQLSRV01 nome_utente password

或通过 PHP:

$db = new PDO("dblib:host=SQLSRV01;dbname=DBNAME","USERNAME","PASSWORD");

【讨论】:

    【解决方案2】:

    简答:

    ODBC 驱动程序知道在端口 1434 上联系 SQL 服务器以查找与命名实例关联的动态端口。用户SERVERNAME\INSTANCENAME 进行连接。

    长答案:

    我从here 开始,然后是herehere

    最终我找到了this

    如果您使用带有多个实例和动态端口的 mssql 您可以使用以下分配:

    [SQLServer2008]
    Description     = Production Server
    Driver          = TDS
    Trace           = No
    Server          = servername\instance_name
    TDS_Version     = 8.0
    

    这似乎在类似的IBM Doc中得到了回应:

    问题

    SQLServer 设置为动态分配端口。在 .odbc.ini 文件中, Address参数通常设置为hostname冒号端口号 (Address=HostName:1433),但端口可能会改变。我们应该如何处理 这?

    回答

    对于地址参数值,而不是输入主机名 冒号端口,输入主机名一个反斜杠和服务器实例 名字。

    例如,在 Unix/Linux 中,使用 IBM SQLServer Wire Protocol 驱动程序 并在 DSN 定义的 .odbc.ini 文件中输入以下内容 用于连接 SQLServer 数据源:

    Address=HostName\Server_Instance_Name

    对于 Windows,使用 ODBC 数据源管理器配置 使用 IBM SQLServer Wire Protocol 的数据源的系统 DSN 司机。

    注意:参数为Server

    【讨论】:

    • 谢谢,我找到了您发布的大部分链接,但在配置 UnixODBC 时遇到了问题。基本上,lucasmanual.com 提供的解决方案对我不起作用。我有一台配置了 ODBC 并为该 MSSQL 服务器工作的 Windows PC(在域中),但我无法在 linux 上复制它。我不知道这是否是域问题,因为我无法解析 Odbc 中使用的主机名。但我尝试使用 IPADDRESS\Instancename 并不管用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多