PHP:使用动态端口分配连接到MS SQL Server

6
我正在尝试使用PHP浏览客户的Microsoft SQL服务器数据库,但端口1433被关闭。经过一番挖掘,我发现MSSQL可以在动态端口分配模式下运行,这意味着它将在第一次执行时选择一个随机侦听端口,并且可能会在启动时保持相同。我知道我可以找到当前端口,但由于“可能”不是“总是”,我想避免再次搜索它,有没有办法远程发现要连接的端口?
根据我的搜索结果,我了解到这个任务通常是由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客户端进行连接。


可能是微软的一种“安全功能”之一... - arkascha
2个回答

2

鉴于您的答案是正确的,我只需要进行一些小的更改就能使其正常工作。我决定在此处记录下这些步骤。步骤基本相同。在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

最后两个参数是可选的。 Driver 必须与我们在 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");

1

简短回答:

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

详细回答:

我从这里开始,然后到达了这里这里

最终我找到了这个:

If you are using mssql with multiple instances and dynamic port allocation you can use the following:

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

这似乎在类似的IBM文档中得到了印证:

问题

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

答案

对于Address参数值,不要输入主机名加端口号,而是输入主机名、反斜杠和服务器实例名称。

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

Address=HostName\Server_Instance_Name

对于Windows操作系统,请使用ODBC数据源管理器使用IBM SQLServer Wire Protocol驱动程序配置数据源的系统DSN。

注意:参数是Server。


谢谢,我已经找到你发布的大部分链接了,但在配置UnixODBC时遇到了问题。基本上,lucasmanual.com提供的解决方案对我不起作用。我有一台配置了ODBC并且可以在MSSQL服务器上工作的Windows PC(在域中),但我无法在Linux上复制它。我不知道是否是域问题,因为我无法解析Odbc中使用的主机名。但我尝试使用IPADDRESS \ Instancename,但无论如何都不起作用... - Maxxer

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