无法在网络电脑上找到SQL实例名称

17

我已经遇到这种情况十几次了,现在想要一个永久性的解决方案。

问题

无法在客户端计算机上找到服务器PC的SQL实例名称。

注意::我已经在服务器和客户端上安装了SQL Express和Management Studio。
服务器PC名称:M-PC
服务器SQL版本:SQL Server 2008
客户端PC名称:SHIVANG
客户端SQL版本:SQL Server 2008

客户端PC SQL服务器截图

我尝试过的解决方案

1) 完全关闭服务器和客户端PC的防火墙(域、专用和公共)
2) 启用并重启服务:SQL Server浏览器服务 enter image description here 3) 启用SQL网络配置设置 enter image description here 4) 还在两台PC的SQL Server上启用了“允许远程连接”
5) 两个PC之间的网络连接非常好,可以通过两个PC的网络访问文件。
6) 甚至更改了两台PC的IP配置设置(服务器的IP为192.168.1.41,客户端的IP为192.168.1.44enter image description here
7) 我已经完全卸载了客户端和服务器上的SQL Express和管理工具,并重新安装了它们。
8) 我还告诉客户格式化电脑,然后安装SQL Express和管理工具。仍然没有改善。
9) 他们的任何系统上都没有安装任何防病毒软件(来阻止连接)。

有趣的事情

现在有趣的事情是当我在调整客户端和服务器PC的设置时,服务器PC开始显示客户端PC的SQL实例,而客户端PC仍然无法找到服务器SQL实例

下面是服务器PC的SQL Server图像:
图片描述 下面是客户端PC的SQL Server图像:
图片描述


以下是我一直在调整的设置:

  1. 将两台PC(客户端和服务器)的IP地址从自动更改为静态
  2. 更改了SQL的协议:TCP/IP,包括两台PC(客户端和服务器)[抱歉,我忘记截取了它的屏幕截图,当服务器PC停止显示客户端PC SQL实例时,我仍然在调整它。]

现在我不知道下一步该怎么做来解决这个问题。如果您能帮忙解决,将不胜感激。

提前感谢


1
你用过CMD吗?运行以下命令:SQLCMD -L你将会得到SQL Server实例列表。 - ahmed abdelqader
@ahmedabdelqader 这个答案与我在问题中的第一张图片是一样的 - Agent_Spock
@pelican_george,我已经重新启动了服务,但是没有起作用,你能否给我一个“TCP/IP端口1433”的截图或在评论中分享链接。 - Agent_Spock
你尝试启用SQL服务器网络配置部分的TCP/IP协议了吗?正如Stackfull所说,默认情况下它将被禁用。 - Buddha
即使它们不显示在“浏览”部分中,您是否可以通过在连接对话框中显式输入名称来连接它们?如果不能,那么输入IP地址和端口是否有帮助?(语法:name,port或ip-addr,port) - deroby
显示剩余3条评论
4个回答

14

在允许远程访问之前,需要更改两个安全级别

  1. SQL Server配置: 默认情况下,在Express、Developer和Enterprise Evaluation版本中,TCP/IP协议连接被禁用。使用SQL Server Configuration Manager启用此功能。
  2. Windows防火墙: 虽然完全禁用防火墙可以解决此组件的问题,但这样做不是最佳安全实践(也不是必需的)。 (注意:在本节中,我假设默认配置。有许多设置可以更改,这些设置会稍微影响这些步骤。)

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

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


对于您的第一点,您可以查看我的第三张图片,我已经启用了TCP/IP。对于您的第二点,防火墙目前不是问题,所以我完全关闭了它,只是为了让请求在服务器和客户端之间来回传递。 - Agent_Spock
@Agent_Spock 是的,我看到你完全关闭了它,我认为问题都出在你的PC/服务器上,因为你能看到你服务器实例中的客户端服务器。所以请重新做一遍,并且不要关闭防火墙,请创建一个新规则,允许端口1433。请按照此操作。我希望这样可以解决你的问题,如果有其他问题,请告诉我。:) 祝好! - Pradeep Kumar
重新做一遍会浪费时间,因为防火墙不在图片中,因为它完全关闭了......尽管如此,我还是尝试了,但仍然看到相同的错误。 - Agent_Spock
@Agent_Spock:请检查此视频并验证您的本地机器是否能够访问它,并尝试使用公共IP,然后在客户端上尝试!如果这样还不行,请告诉我!但是,我有SQL 2016,所以我的界面不同。(升级SQL是另一个选项,但让我们看看)干杯! - Pradeep Kumar
我已经看过那个视频,一切都按照要求完成了。 - Agent_Spock

3
我无法确定您的结果不一致的问题,但我有一些背景信息可以帮助您解决问题。
SQL实例是使用SQL Server Resolution Protocol进行枚举的。这是一个应用层协议,使用UDP(而不是TCP)向本地子网上的服务器发送枚举请求并接收响应,如communication flow for multi-instance discovery diagram所示。SQL Server Browser服务监听UDP端口1434以处理枚举请求。
重要的是,UDP多播协议不能保证请求或响应被传送。因此,可能会发生丢失,只能通过网络跟踪检测到。SQL Server Resolution Protocol无法知道为什么没有收到响应;可能是因为服务器宕机、网络问题、防火墙、SQL实例隐藏等原因。此外,UDP多播请求仅传递给本地子网上的设备,因此分辨率仅限于这些计算机。
下面的PowerShell脚本向特定主机发送UDP请求。您可以运行此脚本,以确保SQL Browser服务对主机上的实例(s)响应预期信息。
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";

总的来说,成功的解决方案需要:

  • SQL Server浏览器服务必须运行
  • UDP端口1434必须通过防火墙允许
  • 服务器必须在同一个子网上
  • 没有UDP数据包丢失
  • 服务器必须及时响应

关于您的摘要:1)SQL Server浏览器服务正在运行,并且已经重新启动了几次;2)防火墙没有问题,因为目前已经完全关闭(客户端和服务器都关闭);3)服务器和客户端在同一网络上,可以轻松地从两个端点传输文件,我对它们进行了ping测试,ping测试结果是一致的,没有发现请求超时;4)关于UDP数据包丢失,您能否向我展示一张图片或类似的东西,以便我能够理解您在谈论什么。 - Agent_Spock
@Agent_Spock,你需要使用像Wireshark(https://www.wireshark.org/download.html)这样的工具来捕获UDP网络流量。你试过PowerShell脚本了吗? - Dan Guzman
@Dan_Guzman 我不知道如何使用PowerShell脚本?即使我知道我应该做什么? - Agent_Spock
SQL Server Browser服务对我有用。该服务默认情况下被禁用;启用并启动后,它立即在“网络服务器”选项卡中弹出。谢谢。 - Sean O

0

首先,请确认防火墙设置。在非主机局域网计算机上安装SQL Server Management Studio,并检查您是否可以使用主机的IP地址连接。如果主机服务器上未启用SA,则可能需要修改登录权限。

SQL Server服务 > SQL Server浏览器 > 右键单击 > 属性 > 服务 > 启动模式 > 自动。

SQL Server服务 > SQL Server浏览器 > 右键单击 > 属性 > 启动

在主机和/或局域网计算机上打开命令提示符并执行:

sqlcmd -L

-1

当您安装SQL Express时,除非您配置远程访问选项,否则无法从网络或远程访问它。

1- 在对象资源管理器中,右键单击服务器并选择属性。

2- 单击连接节点。

3- 在远程服务器连接下,选择或清除“允许此服务器的远程连接”复选框。


请我的亲爱的朋友阅读完整的问题。第四点说我已经做过了。 - Agent_Spock

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