如何排查我的 EC2 Windows 实例上的 Microsoft SQL 问题?

上次更新时间:2021 年 6 月 25 日

我在运行 Microsoft SQL Server 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上遇到错误。或者,SQL Server 变慢导致应用程序日志记录超时错误。我该如何排查我的实例上的 SQL Server 问题?

简短描述

以下是可能在您的 SQL Server 上发生的常见错误。

  • SQL Server 实例发生故障,从主副本转移到辅助副本。
  • 事件查看器每隔 15 分钟发生日志事件 1196 "Cluster network name resource 'Cluster Name' failed registration of one or more associated DNS name(s) for the following reason"(集群网络名称资源 'Cluster Name' 因为以下原因无法注册一个或更多关联 DNS 名称)。
  • 您无法创建 SQL 侦听器。
  • SQL Server 速度慢,导致应用程序日志记录超时错误。
  • 在 SQL 设置上检测独立服务器的设置以后,添加节点失败并发生无效凭证错误。

解决方法

SQL Server 实例发生故障,从主副本转移到辅助副本

故障转移经常发生于底层集群组。要确定问题是否发生在集群级别,执行以下步骤查看事件查看器中的系统日志

  1. 打开运行应用程序,然后输入 eventvwr 并选择确定
  2. 选择 Windows 日志系统。如果在日志中看到事件 1069、1146、1230 或 1135,则通过生成集群日志在集群级别开始调查。
    注意:若看到事件 1135,说明发生了集群节点故障转移。如需了解关于解决此问题的信息,见排查事件 ID 为 1135 的集群问题

要生成与检索集群日志:

  1. 通过在 Windows PowerShell 中运行 get-clusterlogs 命令生成最新的集群日志集。
  2. C:\windows\cluster\reports 的默认位置检索集群日志。

如果集群日志显示由于 SQL 资源的原因而发生集群故障转移,检查事件查看器应用程序日志以确定是否发生 SQL 错误。如需了解更多信息,见针对 Always On 可用性组的租赁、集群和运行状况检查超时的机制与指南

事件查看器每隔 15 分钟发生日志事件 1196 "Cluster network name resource 'Cluster Name' failed registration of one or more associated DNS name(s) for the following reason"(集群网络名称资源 'Cluster Name' 因为以下原因无法注册一个或更多关联 DNS 名称)

在默认的情况下,集群名称对象 (CNO) 每隔 15 分钟会进入 DNS,以检查必要的记录是否依然存在。如果检查失败,您会收到 Cluster network name resource "Cluster Name" failed(集群网络名称资源 "Cluster Name" 失败)的注册错误消息。

此错误经常在当 CNO 对于集群中的网络名称缺少集群 DNS 记录权限时发生。要加以解决,向 CNO 赋予完全的 DNS 记录控制权。在默认情况下,集群通常会在创建时赋予这些权限。

如果您使用静态 DNS 记录,或者如果您不希望集群持续更新您的 DNS 记录,请执行以下操作:

  1. 导航到 ncpa.cplNIC card properties(NIC 卡属性)、Ipv4 properties(Ipv4 属性)、Advanced(高级)、DNS
  2. 取消选中 Register this connection's addresses in DNS(在 DNS 中注册此连接的地址)。

您无法创建 SQL 侦听器

SQL Server 速度慢,导致应用程序日志记录超时错误

验证您的 SQL Server 是否遇到高内存、高 CPU 或磁盘瓶颈:

检查操作系统中的高内存消耗。 打开任务管理器,然后选择性能选项卡。如果您看到高内存消耗,为 SQL 内存设置上限(如果还没有这么做)。若 SQL 内存的上限已设置,访问 Windows 性能监视器 (perfmon) 以确定什么应用程序正在使用内存。您可以在本地或通过远程方式设置 perfmon。

检查操作系统中的高 CPU。打开任务管理器,然后选择性能选项卡。或者,查看 AWS CloudWatch 指标。 访问 Windows 性能监视器以确定什么应用程序正在使用内存。高 CPU 通常由过时的驱动程序导致。 升级到最新的 PV 驱动程序版本。或者,升级 AWS NVMe 驱动程序至最新的版本。

检查服务器上的高磁盘消耗、卷变慢或高 I/O。和高 CPU 一样,过时的驱动程序可能导致磁盘消耗。升级到最新的 PV 驱动程序版本。或者,升级 AWS NVMe 驱动程序至最新的版本。如果该问题在更新驱动程序后依然存在,配置 perfmon 以确定是什么在消耗磁盘 I/O。

在 SQL 设置上检测独立服务器的设置以后,添加节点失败并发生无效凭证错误

验证以下是否有一条是真的:

  • 检测到第二条服务器详细信息后,在次节点上,SQL 设置中的 SQL 代理账户名称为空。
  • 注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\ConfigurationState 有一项或多项的值为 2。

如果上述一条或全部两条都是真的,请执行以下操作:

1.    打开 Microsoft PowerShell,然后运行以下命令:

$ClusterName = "YourClusterName"
$FciClusterGroupName = "SQL Server (MSSQLSERVER)"
Add-ClusterResourceType -Name "SQL Server Agent" -Dll "sqagtres.dll"

注意:在上文命令示例中修改变量名称,如 YourClusterName,以匹配您的环境。

2.    打开故障转移集群管理器,然后选择 Roles(角色)、SQL role(SQL 角色)、Add a resource(添加资源)、More resources(更多资源)。

3.    选择 New SQL Server Agent(新建 SQL Server 代理)、Properties(属性)、Dependencies(依赖关系)。

4.    在 Resource(资源)字段,选择 SQL Server

5.    选择 Properties(属性)选项卡,然后在InstanceName 字段输入您的 SQL Server 实例的名称。接着,在 VirtualServerName 字段输入 SQL 集群的名称。新的 SQL Server 代理将启动。

6.    确保您在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\ConfigurationState 中将所有注册表项的值更改为 1。

7.    再次运行设置。您现在可以添加节点,而不会收到凭证错误消息。