在为第一个实例分配特定 IP 地址时,我在配置多实例 SQL Server 时遇到了问题。
专用 IP 设置
我将单个实例配置为专用 IP 地址的步骤是:
打开 SQL Server 配置管理器 (SSCM)
向下导航到树:
SQL Server Configuration Manager (local) +-- SQL Server Network Configuration +-- Protocols for <INSTANCENAME>
然后在右窗格中双击TCP/ IP ,在选项卡协议中打开 TCP/IP 的属性
然后我确保Enabled设置为yes并且Listen All的选项设置为No。
我将选项卡切换到IP 地址并确保
- 对于所有 IPv4 和 IPv6 地址,“已启用”设置为“否”,我要分配给此实例的 IP 地址除外。对于这个 IP 地址,我将设置设置为Yes。
- 对于所有 IP 地址, TCP 动态端口都是空的。
- 对于我要分配给此实例的 IP 地址,我分配TCP 端口 1433。
然后我关闭所有窗口,SSCM 显示标准消息:
--------------------------- Warning --------------------------- Any changes made will be saved; however, they will not take effect until the service is stopped and restarted. --------------------------- OK ---------------------------
我重新启动特定实例,它通常会允许通过专用 IP 地址连接到我的实例。
我测试实例正在侦听给定的 IP 地址和端口:
c:\> netstat -abon
TCP 10.58.212.112:1433 0.0.0.0:0 LISTENING 2172 [sqlservr.exe]
以上结果来自工作服务器
到目前为止,一切都很好。我已经无数次这样做了,从来没有遇到过任何问题。
案子
两天前,测试服务器上新配置的实例的 SQL Server 服务在为实例配置 10.58.194.5 地址后无法启动。我尝试了以下步骤来修复“损坏”的测试实例:
- 修复共享工具
- 修复实例
- 卸载并重新安装 SQL Server
- 运行 ProcMon 以找出问题所在。
但到目前为止没有任何帮助。
ERRORLOG 文件的相关输出如下:
2021-12-17 08:00:03.76 spid17s Error: 26024, Severity: 16, State: 1. 2021-12-17 08:00:03.76 spid17s Server failed to listen on 10.58.194.5 <ipv4> 1433. Error: 0x2741. To proceed, notify your system administrator. 2021-12-17 08:00:03.76 spid17s Error: 17182, Severity: 16, State: 1. 2021-12-17 08:00:03.76 spid17s TDSSNIClient initialization failed with error 0x2741, status code 0xa. Reason: Unable to initialize the TCP/IP listener. 2021-12-17 08:00:03.76 spid17s Error: 17182, Severity: 16, State: 1. 2021-12-17 08:00:03.76 spid17s TDSSNIClient initialization failed with error 0x2741, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. 2021-12-17 08:00:03.76 spid17s Error: 17826, Severity: 18, State: 3. 2021-12-17 08:00:03.76 spid17s Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log. 2021-12-17 08:00:03.76 spid17s Error: 17120, Severity: 16, State: 1. 2021-12-17 08:00:03.76 spid17s SQL Server could not spawn FRunCommunicationsManager thread. Check the SQL Server error log and the operating system error log for information about possible related problems.
这是我第一次无法将 SQL Server 实例配置/设置为特定 IP 地址。
事件日志条目
尝试启动服务时(最新的优先),Windows 的应用程序事件日志中记录了以下错误:
Level | Date / Time | Source | Event ID Error | 17.12.2021 11:00:45 | MSSQL$<INSTANCENAME> | 17120 Error | 17.12.2021 11:00:45 | MSSQL$<INSTANCENAME> | 17826 Error | 17.12.2021 11:00:45 | MSSQL$<INSTANCENAME> | 17182 Error | 17.12.2021 11:00:45 | MSSQL$<INSTANCENAME> | 17182 Error | 17.12.2021 11:00:45 | MSSQL$<INSTANCENAME> | 26024
这些事件 ID 类似于 ERRORLOG 中的信息。
系统事件日志中的其他条目是:
Level | Date / Time | Source | Event ID Error | 17.12.2021 11:00:45 | Service Control Manager | 7024
详情如下:
The service "SQL Server (<INSTANCENAME>)" has been stopped with the following error: The requested address is invalid in this context.
XML 详细信息为:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> - <System> <Provider Name="Service Control Manager" Guid="{555908d1-a6d7-4695-8e1e-26931d2012f4}" EventSourceName="Service Control Manager" /> <EventID Qualifiers="49152">7024</EventID> <Version>0</Version> <Level>2</Level> <Task>0</Task> <Opcode>0</Opcode> <Keywords>0x8080000000000000</Keywords> <TimeCreated SystemTime="2021-12-17T10:00:45.876740800Z" /> <EventRecordID>15418</EventRecordID> <Correlation /> <Execution ProcessID="736" ThreadID="372" /> <Channel>System</Channel> <Computer>SERVER.DOMAIN.TLD</Computer> <Security /> </System> - <EventData> <Data Name="param1">SQL Server (<INSTANCENAME>)</Data> <Data Name="param2">%%10049</Data> <Binary>4D005300530051004C00240041004C004C00470045004D00450049004E000000</Binary> </EventData> </Event>
网络接口卡配置
测试服务器上只配置了一个网卡。它是一个虚拟的。名称为Ethernet0,类型为Ethernet Adapter for vmxnet3。
网络配置如下:
IP address: 10.58.194.4 Subnet mask: 255.255.255.192 Standard gateway: 10.58.194.2
我们用于 SQL Server 实例的其他 IP 地址是:
10.58.194.5 / 255.255.255.192 10.58.194.6 / 255.255.255.192 10.58.194.7 / 255.255.255.192 10.58.194.28 / 255.255.255.192 10.58.194.29 / 255.255.255.192
单个 NIC 配置为接受六个 IP 地址的连接。
问题
有人知道我该如何解决这个问题吗?
通过评论附加信息
如果我在 TCP/IP 配置中将Listen All选项设置为Yes,则实例将启动。但这不是我想要的。我无法使用别名或 IP 地址连接到实例。然后 sqlserver.exe 进程不再侦听端口 1433。
在考虑我观察到sqlserver.exe 进程不再侦听端口 1433之后,似乎服务器无法将 IP 地址绑定到我的第一个实例的端口 1433。
将Listen All配置为yes并将 IP 地址配置为具有 port1433
后,sqlserver.exe
不再侦听 port 的任何 IP 地址 ( 0.0.0.0
) 1433
。这就像端口号输入框的配置设置已损坏。SQL Server 错误日志显示:
2021-12-17 16:27:36.35 spid17s Error: 26058, Severity: 16, State: 1. 2021-12-17 16:27:36.35 spid17s A TCP provider is enabled, but there are no TCP listening ports configured. The server cannot accept TCP connections.`
旁注
我能够设置和配置同一天收到的生产服务器,以使用特定 IP 没有任何问题。唯一的区别可能是我收到的生产服务器的六个 IP 地址按如下顺序排列:
10.xx.xxx.111 / 255.255.255.0 -- server 10.xx.xxx.112 / 255.255.255.0 -- instance_1 10.xx.xxx.113 / 255.255.255.0 -- instance_2 10.xx.xxx.114 / 255.255.255.0 --... 10.xx.xxx.115 / 255.255.255.0 10.xx.xxx.116 / 255.255.255.0
我正在记录答案,以便为其他人提供在为单个 SQL Server 实例配置 IP 地址时找出 IP 地址可能导致问题的方法。
以下 IP 地址是分配给服务器上的 NIC 和服务器本身的 IP:
以下是 IP 范围的一部分以及从网络角度来看它们的实际用途:
如您所见,服务器的 IP 地址与实际网关数据中心 1的 IP 地址相匹配。为第一个 SQL Server 实例保留的 IP 地址是实际网关数据中心 2的 IP 地址。
发生了什么事情?
在服务器的初始配置期间,IP 地址部分由网络技术人员使用。因为服务器的当前物理网关在服务器上运行,
10.58.194.5
所以能够配置为运行和启动10.58.194.4
。NIC 上附加 IP 地址的配置不是问题,因为它最初只是注册表中的一个条目。然后将服务器移交给 DBA 团队。
然后出现了 DBA 人(我),并尝试在实际网关数据中心 2的 IP 地址上配置一个新的 SQL Server 实例。因为这个地址实际上被用作 Windows Server 的当前网关,所以 SQL Server 实例无法启动。
提示 1
运行 an
ipconfig
会显示服务器上处于活动状态的实际 IP 地址:这向我们展示了这一点,
...194.5
并且...194.6
即使它们已为 NIC 配置,也不能用于服务器/实例。提示 2
在不同的 IP 范围内运行
tracert
到不同的服务器将同样表明该 IP 地址10.58.194.5
被用作服务器的当前网关。解决方案
我们的问题的解决方案是将服务器移动到不同的 IP 范围,并记录该范围的前七个 IP 地址是为网络技术人员保留的。