暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server 警报(自动化运维)

SQLServer 2021-11-01
1383

说到自动化运维呢,我们是不是要收集数据、预警触发、执行脚本等一系列操作呢?其实,SQL Server 也可以实现自动化运维,那就是 SQL Server 代理警报!

什么是警报

相信很多同学使用客户端工具SSMS时都应该看到过,甚至专业是DBA,但是有没有考虑它有什么用呢?先说说“警报”功能有什么用,警报可以根据MSSQL 系统错误级别、错误编号、WMI(Windows Management Instrumentation)事件、性能计数器进行触发,触发后可邮件通知给相关操作员,同时可设置使其执行相关作业,以达到自动化运维的目的。这几乎可以实现任何性能、问题、操作对象的触发。

警报可以做什么

性能预警。对于没有监控系统的企业或个人系统,使用警报可以及时通知到管理人员。

自动化运维。如tempdb收缩、结束堵塞进程、AlwaysOn AG 账号同步、初始化对象等。

操作实践

在我们配置警报并创建将发送通知作业之前,我们需要启用 SQL Server 代理的 “为警报的所有作业响应替换标志”

    EXEC msdb.dbo.sp_set_sqlagent_properties @alert_replace_runtime_tokens=1
    复制

    在当前示例,我们跟踪数据库的创建事件为例。其中创建数据库、还原数据库、附加数据库 都属于新建数据库。

    请右键“警报”创建一个警报,类型有事件警报、性能计数器、WMI事件,这里我选择“WMI事件警报”。对于性能计数器的警报很简单,这里就不举例说明了。

    命名空间默认是已填写好的,其中最后名称MSSQLSERVER为实例名称。这里的 WMI 查询脚本为:

      select * from Audit_Database_Management_Event where EventSubClass = 1
      复制

      WMI 脚本我是怎么知道的呢?这里的表名称可以通过POWERSHELL 执行函数 get-wmiobject 查看。

        get-wmiobject -list
        get-wmiobject -list -namespace "root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER"
        复制

        而具体的表和字段说明,也可以参考官方文档:

        https://docs.microsoft.com/zh-cn/sql/relational-databases/event-classes/audit-database-management-event-class?view=sql-server-ver15

        用于测试,我们创建一张表来记录执行情况:

          create table dba.dbo.test(name varchar(1000),create_time datetime)
          复制

          接下来创建一个作业,步骤内容如下SQL,其中的字段信息可参考 “Audit Database Management 事件类”,SQL获取字段的格式为:$(ESCAPE_SQUOTE(WMI(字段名)))

            insert into dba.dbo.test values('$(ESCAPE_SQUOTE(WMI(DatabaseName)))| $(ESCAPE_SQUOTE(WMI(ObjectName)))| $(ESCAPE_SQUOTE(WMI(Success)))| $(ESCAPE_SQUOTE(WMI(TextData)))',getdate())
            复制

            该作业不需要创建“计划”,仅填写一个步骤即可。再打开刚才创建的警报,在“响应”选项中选择该作业。意思是,当警报触发时(如数据库创建、新还原、附加,不管成功还是失败),将执行该作业的脚本。

            这时候,我们创建一个数据库,然后分离后附加、备份删库还原

            可以看到,附加或还原数据库中,$(ESCAPE_SQUOTE(WMI(ObjectName))) 是获取不到数据库名称的,为了捕获更准确,可以再创建一个 WMI 事件填写以下查询:

              select * from Audit_Backup_Restore_Event where EventSubClass=2
              复制

              而还原的数据库名称,读取的是字段 $(ESCAPE_SQUOTE(WMI(DatabaseName))) 。当然,还原日志也一样可以读取到。

              抓取这个数据有什么用呢?当我们新建一个数据库,它需要初始化一些脚本、它需要自动配置镜像/AlwaysOn AG、它需要触发告警告诉管理员等。这些操作都可以实现,并且是异步执行,不会重复操作。类似的,可以跟踪登录账号的增删改操作,以及时同步至 AlwaysOn AG 的所有副本。

              在没了解该功能之前,你是否考虑使用作业定时检测并同步账号呢?是否可能存在不及时或遗漏呢?是否总占用着线程去检查呢?还是考虑服务器级别的触发器(触发作为事件的同一个事务)?……

              使用警报还有另一方面优势。我们知道 AlwaysOn AG 的性能计数器很少,很多重要的监控指标都没有,使用计数器不好判断副本和数据库的可用性,也不好在故障转移后做相关的后续工作。但是,警报可以实现!可以根据“错误号”去触发警报。

              该错误号如何查找呢?

                SELECT * FROM sys.messages WHERE TEXT LIKE ( '%availability%') AND language_id = 1033
                SELECT * FROM sys.messages WHERE TEXT LIKE ( '%可用性%') AND language_id = 2052
                复制

                其中为例,message_id 即为错误号,如

                41407某些可用性副本未在同步数据。
                41419某个可用性数据库的数据同步状态是非正常的。
                41425可用性数据库的数据同步状态是非正常的。

                当系统出现该事务编号的错误时,警报将提醒给管理员,你也可以设置相应指定的作业来进行自动化运维,以及时处理相关问题。

                结论

                怎么样,是不是很简单,是否有亲自实践了呢?SQL Server 代理警报是众多功能里面最被忽视的一个功能。警报功能对于自动化运维来说,是比较及时响应的。如果你所在的公司没有完善的预警系统或自愈功能,使用SQL Server 代理警报对运维同学来说是非常可行的方案。

                文章转载自SQLServer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论