AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 311360
Accepted
Ronaldo
Ronaldo
Asked: 2022-04-27 08:09:15 +0800 CST2022-04-27 08:09:15 +0800 CST 2022-04-27 08:09:15 +0800 CST

如何根据 SQL Server 上默认未列出的验证创建全新警报?

  • 772

我想创建一个警报,就像 Brent Ozar 的How to Configure SQL Server Agent Alerts中的警报一样,但是我找不到与我想在 sys.messages 上监视的错误相关的消息,正如sp_add_alert文档所说的那样,我想要的问题监控没有产生任何记录的错误。如果我只使用sp_addmessage,我相信我仍然缺少触发错误的验证。如果我创建一个作业来进行验证,我不需要警报,因为该作业可以自己发送电子邮件。

创建新警报的正确方法是什么?

背景

最近,我环境中的应用程序开始无法在 SQL Server 上连接,我们花了一些时间才注意到问题是由于实例达到了实例的 32k 限制(SQL Server 最多允许 32,767 个用户连接)。连接吞噬者是一个配置错误的应用程序,开发人员现在已经纠正了它,但我不想再次感到惊讶,因为其他一些应用程序导致了同样的情况,因此需要警报。当连接数达到 10K 之类的限制时发出警报会很好,但如果达到 32K 限制就发出警报会有所帮助。

sql-server connections
  • 2 2 个回答
  • 36 Views

2 个回答

  • Voted
  1. Ronaldo
    2022-04-28T10:55:19+08:002022-04-28T10:55:19+08:00

    按照AMtwo和Tibor Karaszi的指示,我决定创建一个 Agent 作业来验证是否超过了阈值,如果是,将报告消耗最多连接的前 10 个应用程序。我可以得到我需要的信息:

    --The number of connections to be considered abnormal for your environment.
    --It should be bellow SQL Server max supported 32,767 user connections
    DECLARE @ConnectionThreshold int = 1000;
    
    IF @ConnectionThreshold < (SELECT COUNT(*) FROM sys.dm_exec_connections)
    
    --List the top 10 apps using connections
    SELECT TOP(10)
        s.login_name    AS [Login name],
        s.host_name     AS [Host name],
        d.name          AS [Database name],
        s.program_name  AS [Program name],
        COUNT(*)        AS [Connections]
    FROM sys.dm_exec_connections AS c  
        INNER JOIN sys.dm_exec_sessions AS s  
            ON c.session_id = s.session_id
        INNER JOIN sys.databases AS d
            ON s.database_id = d.database_id
    GROUP BY s.login_name,
        s.host_name,
        d.name,
        s.program_name
    ORDER BY COUNT(*) DESC;
    

    为了生成内容更丰富、格式更佳的电子邮件,我从 AMtwo 的SQL Server Blocking 警报中借鉴了一些想法(不是说大部分代码),结果如下:

    --The number of connections to be considered abnormal for the environment.
    --It should be bellow SQL Server max supported 32,767 user connections
    DECLARE @ConnectionThreshold int = 1000;
    
    IF @ConnectionThreshold < (SELECT COUNT(*) FROM sys.dm_exec_connections)
    BEGIN
        DECLARE @EmailBody nvarchar(4000);
        SELECT @EmailBody = dbo.EmailCSS_Get();
    
        SELECT @EmailBody = @EmailBody + N'<h2>Top 10 apps connected:</h2>' + CHAR(10) +
                N'<table><tr>' +
                N'<th>Login name</th>' +
                N'<th>Host name</th>' +
                N'<th>Database name</th>' +
                N'<th>Program name</th>' +
                N'<th>Connections</th>' +
                N'</tr>' +
                CAST(( SELECT TOP(10)
                            td = s.login_name, '',
                            td = s.host_name, '',
                            td = d.name, '',
                            td = s.program_name, '',
                            td = COUNT(*), ''
                        FROM sys.dm_exec_connections AS c  
                            INNER JOIN sys.dm_exec_sessions AS s  
                                ON c.session_id = s.session_id
                            INNER JOIN sys.databases AS d
                                ON s.database_id = d.database_id
                        GROUP BY s.login_name,
                            s.host_name,
                            d.name,
                            s.program_name
                        ORDER BY COUNT(*) DESC
                        FOR XML PATH ('tr'), ELEMENTS
                        ) AS nvarchar(max)) +
                N'</table>';
    
        SELECT @EmailBody = @EmailBody + '<hr>' + dbo.EmailServerInfo_Get();
    
        EXEC msdb.dbo.sp_send_dbmail  
            @profile_name = 'YourMailProfile',  
            @recipients = '[email protected]',
            @subject = 'Number of connections above defined threshold',  
            @body = @EmailBody,
            @body_format = 'HTML';
    END
    

    此代码已添加到每隔一段时间运行的作业中,并在需要时以格式化的电子邮件发送警报。它成功了。


    引用内容:
    dbo.EmailCSS_Get()
    dbo.EmailServerInfo_Get()

    • 2
  2. Best Answer
    Tibor Karaszi
    2022-04-27T08:43:09+08:002022-04-27T08:43:09+08:00

    你没有错过任何东西。代理事件警报需要事件日志中的 sql server 实例出错。代理每 20 秒轮询一次事件日志。非常简单直接。

    因此,如果您需要自己产生该错误(如在本例中),您不妨从该代码发送电子邮件,而不是绕过事件警报。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve