在网络PC上找不到SQL实例名称

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
在此输入图像描述


以下是我一直在摆弄的以下设置: -

  1. PC的(客户端和服务器)将IP从" 获取"更改为" 静态 "
  2. 更改了协议:PC的两个SQL的TCP/IP(客户端和服务器)[抱歉,我忘了获取它的屏幕截图,当服务器PC停止显示客户端的PC SQL实例时,它甚至更多地摆弄它]

现在我不知道接下来要做什么来解决这个问题.如果可以,请你帮助我.

提前致谢

小智 11

需要更改两个级别的安全性才能允许远程访问.

  1. SQL Server配置:默认情况下,在Express,Developer和Enterprise Evaluation版本中,禁用通过TCP/IP协议进行连接.使用SQL Server配置管理器启用此功能.
  2. Windows防火墙:虽然完全禁用防火墙将适用于此组件,但这样做不是安全性最佳实践(也不是必需的).(注意:在本节中,我假设一个默认配置.有许多设置可以更改,这会稍微影响这些步骤.)

根据您要连接的SQL Server实例的类型,有两种情况:

  1. 默认实例(仅通过计算机名连接).TCP端口1433或数据库引擎服务上添加允许传入规则.
  2. 命名实例(按计算机名称+实例名称连接).在UDP端口1434上添加允许传入规则以访问SQL浏览器服务.在数据库引擎服务上添加允许传入规则.


Dan*_*man 3

对于您不一致的结果,我没有明确的答案,但我确实有一些背景信息可以帮助您解决问题。

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)

总之,成功解决问题需要:

  • SQL Server 浏览器服务必须正在运行
  • 必须允许 UDP 端口 1434 通过防火墙
  • 服务器必须位于同一子网中
  • 无UDP丢包
  • 服务器响应及时