1047:无法连接到 SQL Server 实例 [服务器名\实例]
症状
尝试连接到远程 BarTender 系统数据库时,您可能会收到以下错误信息:
#1047: 无法连接到 SQL-Server 实例 [Servername\Instance]。
适用范围
BarTender 2019 及更高版本
诊断
- 在客户端也安装 SQL Server Management Studio。
- 使用与系统数据库向导相同的用户凭据,从 SQL Management Studio 连接到中心 SQL Server 实例。
如果连接失败,可能说明 SQL Server 配置不正确。
解决方法
在采取以下任何解决方案前,请务必咨询您的 IT 部门或数据库管理员。
配置必要的权限
- 如果打算使用 SQL Server 凭据,请在服务器端启用混合模式身份验证:
- 在 SQL Server Management Studio > 对象资源管理器 中,右键点击服务器,选择属性。
- 在安全性页面,服务器身份验证下,选择新的服务器身份验证模式,然后点击确定。
- 为用于连接 BarTender 系统数据库的账户分配权限。有关如何设置账户权限的详细信息,请参阅以下文章:配置系统数据库权限(视频 - 5:45)
- 确定是使用 Windows 凭据还是 SQL Server 凭据进行连接(推荐使用 SQL Server 凭据)。
- 如果问题仍然存在,请尝试以下配置建议:
如果系统数据库已在计算机 A 上配置,并且从计算机 B 远程连接系统数据库时出现问题(EA 版,使用 SQL Express),请尝试以下方法解决问题。
- 连接远程 SQL Server 实例时,建议使用 IP 地址和端口(通常为 1433),而不是实例名。
- 如果仍需使用实例名,SQL Server 需要进行一些额外配置(见下文)。
启用 SQL Server 实例的远程连接
- 打开 SQL Management Studio。
- 在左侧窗格中右键点击服务器名称,选择属性,然后选择连接,确保勾选了允许远程连接到此服务器,如下图所示。
配置 SQL Express 服务器监听静态端口
- 打开 SQL Server 配置管理器,在左侧点击 SQL Server 服务。
- 使用进程 ID 列(中间)参考每个正在运行服务的进程 ID 列表。找到 SQL Server 的 PID,并在命令提示符下输入以下命令,查看该 PID 正在监听的端口:
netstat -ano | find /i “[SQL-Server 的 PID 编号]"
根据上图信息,命令格式如下:netstat -ano | find /i “668”
- 结果如下所示:
- 如果第 3 步执行命令后没有结果,说明 TCP/IP 协议被禁用,需要启用。在 SQL Server 配置管理器 中,点击左侧 SQL Server 网络配置,右键点击 TCP/IP 协议,选择启用。
- 重启 SQL Server 服务,并确认 SQL 服务分配的进程 ID。
- 在命令提示符下执行以下命令:
netstat -ano | find /i “23444”
- 结果如下所示:
- 在 SQL Server 配置管理器中,点击左侧 SQL Server 网络配置,右键点击 TCP/IP 协议。
- 进入 属性 > IP 地址,下拉到 IPAll 部分。清空 TCP 动态端口 的值(不要输入 0)。
- 在 TCP 端口 中输入 1433。点击 应用,然后 确定。
- 重启 SQL Server 服务,确认 SQL 服务分配的新进程 ID,并在命令提示符下执行命令:
netstat -ano | find /i “5088”
- 结果如下所示:
此时,SQL Express 已配置为监听标准端口 1433。
开启 SQL Server Browser 服务
- 打开 SQL Server 配置管理器,在左侧点击 SQL Server 服务。右键点击 SQL Server Browser 服务,选择属性。
- 切换到服务选项卡,将启动类型更改为 自动。点击 应用 和 确定。
- 点击 启动 按钮,启动 SQL Browser 服务。
- 确认 SQL Server Browser 服务已正常运行,如下图所示。
根据 SQL Server 加固最佳实践,建议禁用 SQL Server Browser 服务。该服务会将对 SQL Server 资源的请求重定向到正确的端口。移除重定向器作为攻击向量,有助于隐藏 SQL Server 组件的真实入口。
配置防火墙允许与 SQL Server 相关的网络流量
需要在Windows 防火墙中配置四个例外,以允许访问SQL Server:
- 为 TCP 端口 1433 添加端口例外。在 新建入站规则向导 对话框中,按以下信息创建端口例外:
- 选择 端口。
- 选择 TCP 并指定端口 1433。
- 允许连接。
- 选择所有三个配置文件(域、专用和公用)。
- 将规则命名为 SQL – TCP 1433。
- 为 UDP 端口 1434 添加端口例外。再次点击 新建规则,按以下信息创建另一个端口例外:
- 选择 端口。
- 选择 UDP 并指定端口 1434。
- 允许连接。
- 选择所有三个配置文件(域、专用和公用)。
- 将规则命名为 SQL – UDP 1434。
- 为 sqlservr.exe 添加程序例外。再次点击 新建规则,按以下信息创建程序例外:
- 选择 程序。
- 点击 浏览,选择 sqlservr.exe,路径为:C:\Program Files\Microsoft SQL Server\MSSQL11.[INSTANCE_NAME]\MSSQL\Binn\sqlservr.exe,其中 [INSTANCE_NAME] 是您的 SQL 实例名。
- 允许连接。
- 选择所有三个配置文件(域、专用和公用)。
- 将规则命名为 SQL – sqlservr.exe。
- 为 sqlbrowser.exe 添加程序例外。再次点击 新建规则,按以下信息创建另一个程序例外:
- 选择 程序。
- 点击 浏览,选择 sqlbrowser.exe,路径为:C:\Program Files (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe。
- 允许连接。
- 选择所有三个配置文件(域、专用和公用)。
- 将规则命名为 SQL – sqlbrowser.exe。
如上所示,为了通过 SQL Server 的实例名实现远程连接,可能需要进行大量配置(此外还存在安全隐患)。因此,推荐使用 IP 地址和端口进行连接。