按照选项 2 中的步骤 2:检查 SQL Server 配置管理器中的别名。
步骤 5:验证防火墙配置
可以根据默认实例或命名实例验证防火墙配置。
如果在网络中使用第三方防火墙,这些概念仍然适用。 但是,你可能必须与网络管理员合作,或查阅防火墙产品的文档,以获取有关配置防火墙以允许与 SQL Server 通信所需的端口的详细信息。
SQL Server 的默认实例
默认实例通常在端口 1433 上运行。 某些安装还使用非标准端口(除 1433)来运行 SQL 实例。 防火墙可能会阻止任一端口。 要进一步检查端口号,请执行以下步骤:
确定 SQL 实例正在运行的端口,请参阅获取实例的 TCP 端口。
如果 SQL Server 配置为在端口 1433 侦听,请确保客户端和服务器之间的网络防火墙允许该端口上的通信。 查看配置数据库引擎访问 Windows 防火墙,并与网络管理员协作以实施必要的解决方案。
如果 SQL Server 默认实例未使用 1433,请尝试使用格式<servername>,<portnumber>
将 SQL Server 的端口号追加到服务器名称,并查看其是否工作正常。 例如,SQL 实例名称为 MySQLDefaultinstance,它在端口 2000 上运行。 将服务器名称指定为 MySQLServer 2000,并查看它是否工作正常。
如果工作不正常,则表示防火墙正在阻止端口。 可以按照配置数据库引擎访问 Windows 防火墙中的说明进行操作,或与网络管理员协作将端口添加到防火墙排除列表。
如果工作正常,则表示防火墙允许通过该端口进行通信。 需要更改连接字符串才能在应用程序的连接字符串中使用端口号和服务器名称。
SQL Server 的命名实例
如果 SQL 实例是命名实例,则可以将其配置为使用动态端口或静态端口。 在任一情况下,基础网络库通过 UDP 端口 1434 查询 SQL Server 计算机上运行的 SQL Server Browser 服务,以枚举命名实例的端口号。 如果客户端和服务器之间的防火墙阻止了此 UDP 端口,则客户端库无法确定端口(连接要求)并且连接会失败。 要检查连接,可以使用下列方法:
方法 1:通过在连接字符串中指定端口号来检查连接。
确定 SQL 实例正在运行的端口,请参阅获取实例的 TCP 端口。
尝试使用以格式 <servername\instancename>,<portnumber>
追加到服务器名称的端口号连接到命名实例,并查看是否可行。 例如,如果 SQL 实例名称为 MySQL\Namedinstance ,并且它在端口 3000 上运行,则将服务器名称指定为 MySQL\Namedinstance,3000。
如果确实可行,则指示防火墙在阻止 UDP 端口 1434,或者实例在 SQL Server 浏览器中隐藏。
如果不可行,则指示存在以下情况:
UDP 端口 1434 被阻止或静态端口被阻止,或两者均被阻止。 要确认是 UDP 端口还是静态端口,请使用 Portqry。
该实例在 SQL Server Browser 服务中是隐藏的。
方法 2:使用 PortQryUI 工具检查连接。
将 PortQryUI 工具与命名实例配合使用,并观察生成的输出。 可能会看到一条指示 UDP 端口 1434 已筛选的消息。 此消息指示该端口在网络上被阻止。 有关如何使用该工具的说明,请参阅将 PortQryUI 工具与 SQL Server 配合使用。
确定 SQL Server 实例是在侦听动态端口还是静态端口。 然后使用以下与方案相关的方法。 如果不确定,请参阅如何检查 SQL Server 正在侦听动态端口还是静态端口。
方案 1:动态端口。 在这种情况下,请确保 SQL Server 浏览器服务已启动,并且不会在客户端和服务器之间的防火墙上阻止 UDP 端口 1434。 如果不能执行上述任一操作,应将 SQL Server 实例切换到静态端口,并使用配置服务器以侦听特定 TCP 端口中所述的过程。
方案 2:静态端口配置。 SQL Server 浏览器未运行,或者无法在防火墙上打开 UDP 1434。 在这种情况下,请确保在连接字符串中指定静态端口,并且防火墙不会阻止端口。 有关详细信息,请查看为数据库引擎访问配置 Windows 防火墙。
步骤 6:在 SQL Server 上验证已启用的协议
在某些 SQL Server 安装中,除非管理员手动启用从另一台计算机到数据库引擎的连接,否则不会启用这些连接。 可以使用以下选项来检查和启用必要的协议,以允许远程连接到 SQL Server 数据库引擎。
在 SQLCheck 输出文件中搜索“SQL Server 实例的详细信息”部分,并找到 SQL Server 实例的信息部分。
在本部分中,查找下表中列出的值,以确定是否启用了 SQL Server 协议:
已启用 TCP
如果为 false,则使用 TCP/IP 的本地连接和远程连接都将失败。
备注大多数 SQL Server 安装使用 TCP/IP 作为服务器与客户端之间的通信协议。
选择网络协议
打开 SQL Server 配置管理器。
在左窗格中,展开“SQL Server 网络配置”,然后选择要连接到的 SQL Server 实例。 右窗格列出了可用的连接协议。 共享内存通常已启用。 它只能从同一台计算机使用,因此大多数安装都启用了共享内存。 若要从另一台计算机连接到 SQL Server,请使用 TCP/IP。 如果未启用 TCP/IP,请右键单击“TCP/IP”,然后选择“启用”。
如果更改任何协议的启用设置,请重启数据库引擎。 在左窗格中,选择“SQL Server 服务”。 在右窗格中,右键单击数据库引擎的实例,然后选择“属性”。
步骤 7:测试 TCP/IP 连接
使用 TCP/IP 连接到 SQL Server 需要 Windows 建立连接。 可以使用以下步骤通过 ping 工具测试 TCP 连接。
在“开始”菜单上,选择“运行”。 在“运行”窗口中,键入“regedit”,然后选择“确定”。
在“命令提示符”窗口中,键入ping
和运行 SQL Server 的计算机的 IP 地址。 例如:
Ipv4:ping 192.168.1.101
IPv6:ping fe80::d51d:5ab5:6f09:8f48%11
如果网络配置正确,则ping
会返回Reply from <IP address>
,之后会收到一些其他信息。 如果ping
返回Destination host unreachable
或Request timed out
,代表未正确配置 TCP/IP。 此时的错误表明客户端计算机、服务器计算机或网络的某些部分(如路由器)出现问题。 若要排查网络问题,请参阅 TCP/IP 问题的高级故障排除。
如果使用 IP 地址ping
测试成功,请测试计算机名称是否可以解析为 TCP/IP 地址。 在客户端计算机上的“命令提示符”窗口中,键入“ping” 和运行 SQL Server 的计算机的名称。 例如,ping newofficepc
。
如果 ping 到 IP 地址成功,但 ping 到计算机名称返回Destination host unreachable
或者Request timed out
,你可能在客户端计算机上缓存了旧的(过时)名称解析信息。 键入ipconfig /flushdns
以清除 DNS(动态名称解析)缓存。 然后再次按名称 ping 计算机。 当 DNS 缓存为空时,客户端计算机会检查有关服务器计算机 IP 地址的最新信息。
如果网络配置正确,则ping
会返回Reply from <IP address>
,之后会收到一些其他信息。 如果可以按 IP 地址成功 ping 服务器计算机,但在按计算机名称 ping 时收到错误(例如Destination host unreachable
或者Request timed out
),则名称解析未正确配置。 有关详细信息,请参阅如何排查基本 TCP/IP 问题。 连接到 SQL Server 不需要成功名称解析。 但是,如果计算机名称无法解析为 IP 地址,则必须建立连接才能指定 IP 地址。 以后可以修复名称解析。
还可以使用 Test-NetConnection 或 Test-Connection cmdlet,根据计算机上安装的 PowerShell 版本测试 TCP 连接。 有关 PowerShell cmdlet 的更多信息,请参阅 Cmdlet 概述。
步骤 8:测试本地连接
在排查另一台计算机的连接问题之前,请在运行 SQL Server 的计算机上测试本地安装的客户端应用程序的连接能力。 本地连接可避免网络和防火墙问题。
此过程需要 SQL Server Management Studio。 如果尚未安装 Management Studio,请参阅下载 SQL Server Management Studio (SSMS)。
如果无法安装 Management Studio,可以使用 sqlcmd.exe 实用工具测试连接。 sqlcmd.exe 随数据库引擎一起安装。 有关 sqlcmd.exe的信息,请参阅 sqlcmd 实用工具。
使用可以访问 SQL Server 的登录名登录到安装 SQL Server 的计算机。 在安装过程中,SQL Server 需要至少指定一个登录名作为 SQL Server 管理员。 如果你不知道管理员,请参阅系统管理员被锁定时连接到 SQL Server。
在“开始”页上,键入“SQL Server Management Studio”,或在 Windows 旧版本中的“开始”菜单上,选择“所有程序”,选择“Microsoft SQL Server”,然后选择“SQL Server Management Studio”。
在“连接”下拉菜单上,选择“数据库引擎”。 在“身份验证”框中,选择“Windows 身份验证”。 在“服务器名称”框中,键入以下连接类型之一:
如果没有足够的信息,就无法解决问题,因为某些错误消息是有意传递给客户端的。 这是一项安全功能,可避免向攻击者提供有关 SQL Server 的信息。 要查看有关错误的详细信息,请参阅 SQL Server 错误日志。
如果收到错误 18456 用户登录失败,则联机丛书文章 MSSQLSERVER_18456 包含有关错误代码的其他信息。 Aaron Bertrand 的博客还在排查错误 18456(外部链接)中提供了大量的错误代码列表。 可以使用 SSMS 在“对象资源管理器”的“管理”部分查看错误日志(如果可以连接)。 否则,可以使用 Windows 记事本程序查看错误日志。 默认位置因版本而异,并且可以在设置过程中更改。 SQL Server 2019 (15.x) 的默认位置是 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ERRORLOG。
如果可以使用共享内存进行连接,请使用 TCP 测试连接。 可以通过在名称之前指定 tcp:
来强制建立 TCP 连接。 下面是示例:
如果可以使用共享内存而不是 TCP 进行连接,则必须修复 TCP 问题。 最有可能的问题是 TCP 未启用。 要启用 TCP,请参阅步骤 6:在 SQL Server 上验证已启用的协议。
如果目标是使用管理员帐户以外的帐户进行连接,则可以首先以管理员身份进行连接。 然后,尝试使用客户端应用程序使用的 Windows 身份验证登录或 SQL Server 身份验证登录再次连接。
步骤 9:测试远程连接
在同一台计算机上使用 TCP 进行连接后,即可尝试从客户端计算机进行连接。 可以使用任何客户端应用程序,但为了避免太复杂,请在客户端上安装 SQL Server 管理工具。 安装后,尝试使用 SQL Server Management Studio。
在客户端计算机上使用 SQL Server Management Studio,并尝试使用 IP 地址和格式为 IP 地址逗号端口号的 TCP 端口号进行连接。 例如,192.168.1.101,1433
。 如果此连接失败,则可能存在以下问题:
IP 地址的 ping
不起作用。 这指示常规 TCP 配置问题。 返回到“步骤 7:测试 TCP/IP 连接性”部分。
SQL Server 未侦听 TCP 协议。 返回到“步骤 6:验证 SQL Server上已启用的协议”部分。
SQL Server 正在侦听指定端口以外的端口。 返回到“获取 TCP 端口”部分。
防火墙正在阻止 SQL Server TCP 端口。 返回到“步骤 5:验证防火墙配置”部分。
使用 IP 地址和端口号进行连接后,请查看以下方案:
如果连接到侦听除 1433 以外的任何端口的默认实例,则必须使用连接字符串中的端口号或在客户端计算机上创建别名才能连接到默认实例。 SQL Server 浏览器服务无法枚举默认实例的端口。
如果连接到命名实例,请尝试以 IP 地址反斜杠实例名称格式连接到实例。 (例如,192.168.1.101\<instance name>
。)如果此操作不起作用,则表示端口号不会返回到客户端。 此问题与 SQL Server Browser 服务相关,该服务为客户端提供命名实例的端口号。 下面是解决方案:
启动 SQL Server Browser 服务。 请参阅有关在 SQL Server 配置管理器中启动浏览器的说明。
防火墙正在阻止 SQL Server Browser 服务。 在防火墙中打开 UDP 端口 1434。 返回到步骤 5 部分:验证防火墙配置。 请确保打开的是 UDP 端口,而不是 TCP 端口。
路由器正在阻止 UDP 端口 1434 信息。 UDP 通信(用户数据报协议)不是为了通过路由器并防止网络被低优先级流量占据而设计的。 可以将路由器配置为转发 UDP 流量,也可以在每次连接时提供端口号。
如果客户端计算机使用 Windows 7、Windows Server 2008 或较新的操作系统,则客户端操作系统可能会删除 UDP 流量,因为来自服务器的响应是从查询的不同 IP 地址返回的。 此操作是阻止“松散源映射”的安全功能。有关详细信息,请参阅联机丛书中的 “多服务器 IP 地址 ”部分 ,故障排除:超时已过期。 (本文摘自 SQL Server 2008 R2,但主体仍适用。可以将客户端配置为使用正确的 IP 地址,或者在每次连接时提供端口号。)
使用 IP 地址(或命名实例的 IP 地址和实例名称)连接后,请尝试使用计算机名称(或命名实例的计算机名称和实例名称)进行连接。 计算机名称前输入tcp:
以强制 TCP/IP 连接。 例如,对于名为 ACCNT27 的计算机上的默认实例,请使用 tcp:ACCNT27
。 对于名为 PAYROLL 的命名实例,请在该计算机上使用 tcp:ACCNT27\PAYROLL
。 如果可以使用 IP 地址连接,但不能使用计算机名称连接,则是出现了名称解析问题。 返回到“步骤 7:测试 TCP/IP 连接性”部分。
使用计算机名称强制 TCP 连接后,请尝试使用计算机名称进行连接,而不强制使用 TCP。 例如,对于默认实例,只需使用计算机名称,如 CCNT27。 对于命名实例,请使用计算机名称和实例名称,如 ACCNT27\PAYROLL。 如果可以在强制 TCP 时连接,但不强制 TCP 时无法连接,则客户端可能正在使用其他协议(如 命名管道)。 若要修复此问题,请执行以下步骤:
在客户端计算机上,使用 SQL Server 配置管理器。 在左窗格中,展开 “SQL Native Client <版本> 配置”,然后选择“ 客户端协议”。
在右窗格中,确保已启用“TCP/IP”。 如果禁用“TCP/IP”,请右键单击“TCP/IP”并选择“启用”。
请确保 TCP/IP 的协议顺序比命名管道(或旧版本中的 VIA)协议的号码小。 通常,应将共享内存设置为顺序 1,将 TCP/IP 设置为顺序 2。 仅当客户端和 SQL Server 在同一台计算机上运行时,才使用共享内存。 所有启用的协议都会按顺序进行尝试,直到成功,但当连接不在同一台计算机上时,将跳过共享内存。
解决 SQL Server 中的连接问题
0200 一致性网络问题
连接到 Always On 可用性组侦听器
Always On 故障转移群集实例 (SQL Server)
排查 Azure SQL 数据库和 Azure SQL 托管实例的连接问题和其他错误