Age*_*ock 15 sql sql-server networking sql-server-2008
我现在已经十多次面对这种情况,最终希望永久解决它.
在客户端PC上找不到Server PC的SQL实例名称.
注意: - 我在服务器和客户端
服务器PC上安装了SQL Express和Management Studio 名称:M-PC
服务器SQL版本:SQL Server 2008
客户端PC名称:SHIVANG
客户端SQL版本:SQL Server 2008
客户端的PC SQL Server屏幕截图
1)完全关闭服务器和客户端PC的防火墙(域,私有和公共)
2)启用和重新启动服务:SQL Server和浏览器服务
3)启用SQL网络配置设置
4)还启用了来自PC的SQL Server的"允许远程连接"
.5)PC 之间的网络完美可以通过PC的网络访问文件.
6)甚至改变了IP配置设置从获取到PC的静态(服务器IP为192.168.1.41,客户端IP为192.168.1.44)
7)我已经从客户端和服务器完全卸载了SQL Express和Management Studio,并再次安装它.
8)我还告诉我的客户格式化PC,然后安装SQL Express和Management Studio.依然没有.
9)他们在任何系统上没有任何防病毒软件(阻止连接)
现在有趣的部分是我在摆弄客户端和服务器PC的设置.Server PC开始显示客户端PC SQL实例,而客户端PC仍无法找到服务器SQL实例.
下图是Server PC的SQL Server
下图是Client PC的SQL Server
以下是我一直在摆弄的以下设置: -
现在我不知道接下来要做什么来解决这个问题.如果可以,请你帮助我.
提前致谢
小智 11
需要更改两个级别的安全性才能允许远程访问.
根据您要连接的SQL Server实例的类型,有两种情况:
命名实例(按计算机名称+实例名称连接).在UDP端口1434上添加允许传入规则以访问SQL浏览器服务.在数据库引擎服务上添加允许传入规则.
对于您不一致的结果,我没有明确的答案,但我确实有一些背景信息可以帮助您解决问题。
SQL 实例是使用SQL Server 解析协议枚举的。这是一种应用层协议,它使用 UDP(而非 TCP)向本地子网上的服务器发送枚举请求并接收响应,如多实例发现图的通信流程所示。SQL Server Browser 服务侦听 UDP 端口 1434 以处理枚举请求。
重要的是,UDP 多播协议不保证请求或响应的传递。因此,可能会发生只能通过网络跟踪检测到的丢失。SQL Server解析协议无法知道为什么没有收到响应;这可能是因为服务器停机、网络问题、防火墙、SQL 实例隐藏等。此外,UDP 多播请求仅传递到本地子网上的设备,因此解析仅限于这些计算机。
下面的 PowerShell 脚本向特定主机发送 UDP 请求。您可以运行此命令以确保 SQL Browser 服务响应有关主机上实例的预期信息。
Function List-Instances($hostName)
{
Write-Host ("Retrieving information from SQL Server Browser service on host $HostName ...");
try
{
$udpClient = new-object Net.Sockets.UdpClient($HostName, 1434);
$bufferLength = 1;
$browserQueryMessage = new-object byte[] $bufferLength;
$browserQueryMessage[0] = 2; # list all instances
$bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length);
$udpClient.Client.ReceiveTimeout = 10000;
$remoteEndPoint = new-object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0);
$browserResponse = $udpClient.Receive([ref]$remoteEndPoint);
$payloadLength = $browserResponse.Length - 3;
$browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength);
$browserResponseString
$elements = $browserResponseString.Split(";");
$elements
$namedInstancePort = "";
Write-host "SQL Browser Data:" -ForegroundColor Green;
$i = 0;
while($i -lt $elements.Length)
{
if([String]::IsNullOrEmpty($elements[$i]))
{
Write-Host "";
$i += 1;
}
else
{
Write-Host $(" " + $elements[$i] + "=" + $elements[$i+1]) -ForegroundColor Green;
$i += 2;
}
}
}
catch [Exception]
{
Write-host $("ERROR: " + $_.Exception.Message) -ForegroundColor Red;
}
}
# send request to SQL Brower service to enumerate all SQL instances running on specific host
List-Instances -hostName "SomeMachine";
Run Code Online (Sandbox Code Playgroud)
总之,成功解决问题需要: