如何在 Amazon RDS SQL Server 数据库实例上发生死锁事件时接收通知?
上次更新时间:2020 年 6 月 2 日
我有一个运行 SQL Server 的 Amazon Relational Database Service (Amazon RDS) 数据库实例。我希望在 RDS 数据库实例发生死锁事件时立即收到通知。我该如何操作?
简短描述
SQL Server 使用锁定监控线程监控死锁事件。如果检测到死锁事件,SQL Server 将使用基于资源/成本的机制将其中一项事务声明为死锁牺牲品。牺牲品事务将回滚,且错误日志中会发布错误代码 1205。
要解决此问题,请启用死锁跟踪标记(1222、1204)将死锁事件捕获到 SQL 错误日志中。接下来,将 SQL Server 错误日志发布到 Amazon CloudWatch 中,并创建 CloudWatch 警报和 Amazon Simple Notification Service (Amazon SNS) 通知以在发生死锁事件的任何时候发送提醒。
解决方法
通过 RDS 参数组启用跟踪标记
注意:如果您已经有自定义参数组,则跳到步骤 5。
-
打开 Amazon RDS 控制台,然后从导航窗格中选择参数组。
选择创建参数组。
对于参数组系列,请选择 SQL Server 版本和您正在编辑的版本。例如,SQL Server 2016 企业版本使用 sqlserver-ee-13.0。
输入组名称和描述,然后选择创建。
在参数组页面上,选择您在上一步中创建的组。
选择编辑参数,然后选中 1204 和 1222 旁的复选框。
将 1204 和 1222 的值都编辑为 1。
选择预览更改。在下一页上,选择保存更改。
从导航窗格中选择数据库。
在数据库标识符部分中,选择您的 RDS 数据库实例。
选择修改。
从数据库选项部分中,为数据库参数组选择您创建的参数组。
注意:创建新参数组并将其附加到 RDS 数据库实例上需要您重启 RDS 数据库实例,从而使更改生效。
将 SQL Server 错误日志推送到 Amazon CloudWatch
-
在错误日志部分中,选择错误日志的复选框。这可以确保将 SQL Server 错误日志发布到 CloudWatch Logs 中。
选择继续。
从修改计划部分中,选择立即应用,然后选择修改数据库实例。
注意:您的 RDS 数据库实例现在处于修改状态。等到它恢复可用状态。如果您使用现有参数组,请跳过步骤 4,因为您不需要重启您的 RDS 数据库实例。如果您创建了一个新的参数组,则继续执行步骤 4。
在数据库页面中,选择您的 RDS 数据实例,然后选择操作。重启 RDS 数据库实例,以使更改生效。在 RDS 数据库实例联网后,您可以通过在 RDS 数据库实例上运行 DBCC TRACESTATUS(1222、1204)来验证死锁跟踪状态。如果全局跟踪命令在输出窗口中返回 1,则死锁跟踪启用。
模拟死锁事务
在您的 RDS 数据库实例上模拟死锁事务,以验证死锁牺牲品查询是否记录在 SQL Server 错误日志中。您可以通过在您的 RDS 数据库实例上运行以下查询来检查 SQL Server 错误日志中的死锁事件:
sp_readerrorlog 0, 1, 'deadlock'
创建筛选条件模式和 Amazon CloudWatch 警报
-
打开 CloudWatch 控制台。
在日志部分中,选择日志组。
选择您的 RDS 数据库实例的 SQL Server 错误日志。日志以下面的格式列出:
(/aws/rds/instance/<Your-RDS-Instance-Name>/error)
选择创建指标筛选条件。 在筛选条件模式部分的定义日志指标筛选条件页面中,输入死锁。 选择分配指标。 在筛选条件名称和指标名称字段中输入死锁。 选择创建筛选条件。在创建死锁筛选条件后,请选择创建警报。 在指定指标和条件页面中的指标名称下,输入死锁。 在统计下,输入最小。 在周期下,从下拉菜单中选择警报的时间周期,例如 1 分钟。从条件部分中,选择以下设置:
阈值类型:静态
每当死锁为:大 > 阈值
比:输入 0
选择下一步。 从通知部分的警报状态触发器下,选择警报中。 选择一个 Amazon SNS 主题,或选择使用您要用来接收警报的电子邮件地址创建新主题,然后选择下一步。 在名称和描述部分中,输入警报名称和警报描述,然后选择下一步。 从预览和创建页面上,检查您的警报配置,然后选择创建警报。使用相同的过程为其他的 SQL Server 致命错误和登录失败错误创建 CloudWatch 警报。借助此功能,您可以在数据库系统发生重大问题前识别并接收很多 SQL Server 错误的通知。