SQL数据库有阻塞就自动发邮件警报

1.建查询是否有阻塞的视图

create view [dbo].[VW_WaitingCount]
as
SELECT     s.session_id, r.blocking_session_id, s.host_name, s.login_name, databasename = db_name(r.database_id), r.command, r.status AS sqlexecstatus,
                      current_execute_sql = substring(t .text, r.statement_start_offset / 2 + 1, CASE WHEN statement_end_offset = - 1 THEN len(t .text)
                      ELSE (r.statement_end_offset - statement_start_offset) / 2 + 1 END), s.program_name, s.status, s.cpu_time, memory_usage_kb = s.memory_usage * 8, s.reads,
                      s.writes, s.transaction_isolation_level, c.connect_time, c.last_read, c.last_write, c.net_transport, c.client_net_address, c.client_tcp_port, c.local_tcp_port, r.start_time,
                      r.wait_time, r.wait_type, r.last_wait_type, r.wait_resource, r.open_transaction_count, r.transaction_id
FROM         sys.dm_exec_sessions s LEFT JOIN
                      sys.dm_exec_connections c ON s.session_id = c.session_id LEFT JOIN
                      sys.dm_exec_requests r ON s.session_id = r.session_id AND c.connection_id = r.connection_id OUTER apply sys.dm_exec_sql_text(r.sql_handle) t
WHERE     1 = 1 AND s.is_user_process = 1 AND command IS NOT NULL

2.配置SQL发送邮件(略去。。。)

3.建存储过程

USE [qhw_shop]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CheckBlockingAndSendmail]
@sendtype int =1
as
declare @ccount int
select @ccount=COUNT(1) from [VW_WaitingCount] where blocking_session_id<>0
--print @ccount
if(@ccount>0)
begin
    waitfor delay ‘00:00:10‘--定义等待10秒
    select @ccount=COUNT(1) from [VW_WaitingCount] where blocking_session_id<>0
    if(@ccount>0)
        begin
            waitfor delay ‘00:00:10‘--定义等待10秒
            select @ccount=COUNT(1) from [VW_WaitingCount] where blocking_session_id<>0
            if(@ccount>0)
            begin
                if @sendtype=1
                    begin
                        --发送简单文本的邮件
                        EXEC msdb..sp_send_dbmail
                        @profile_name = ‘sendmailby126‘,--profile名称
                        @recipients = ‘[email protected];[email protected]‘,--收件人
                        @subject = N‘数据库有阻塞,请登录服务器查看‘,--邮件标题
                        @body = N‘数据库有阻塞,请登录服务器查看‘,--邮件内容
                        @body_format = ‘HTML‘--邮件格式
                    end
                if @sendtype=2
                    begin

                        --发送包含查询的邮件
                        EXEC msdb..sp_send_dbmail
                        @profile_name = ‘sendmailby126‘,
                        @recipients = ‘[email protected];[email protected]‘,
                        @subject = ‘数据库有阻塞,结果见正文‘,
                        --@query = ‘SET NOCOUNT  ON;select getdate()‘
                        --@query = ‘select getdate() as 发生时间;select count(1) 记录总数 from [VW_WaitingCount] where blocking_session_id<>0;select * from vw_waitingcount where session_id in (select blocking_session_id from vw_waitingcount where blocking_session_id>0) and blocking_session_id=0‘
                        @query = ‘select getdate() as 发生时间;select session_id,blocking_session_id,databasename,current_execute_sql,wait_time,last_wait_type from [VW_WaitingCount] where session_id in (select blocking_session_id from [qhw_shop].[dbo].[VW_WaitingCount] where blocking_session_id>0) and blocking_session_id=0‘
                        --,@body_format = ‘HTML‘--邮件格式
                    end
            end
        end
end

4.建立作业,每隔1分钟或10分钟或多长时间自己设置,作业执行如下代码

exec dbname.dbo.CheckBlockingAndSendmail @sendtype=2

5.邮箱可以和微信绑定,一有阻塞警报,微信即可收到信息,登录服务器,查询出阻塞的源头SPID,并查询出执行的sql语句,如果不是很重要,可以KILL掉。

时间: 2024-10-31 14:24:00

SQL数据库有阻塞就自动发邮件警报的相关文章

自动发邮件、面向对象

一.自动发邮件 1.使用模块 yagmail,安装模块,python install yagmail-0.10.212-py2.py3-none-any.whl 如果直接pip install yagmail,发中文附件,文件名显示为乱码 2.在邮箱设置开启smtp服务 3.开启邮箱授权码,授权码是用于登录第三方邮件客户端的专用密码. 适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 自动发邮件代码示例: import yagmail use

linux 自动发邮件

背景介绍:公司需要运维在工作日内定时给测试部门发邮件通知SVN版本号并且去测试,每天手动发太烦,纯手工重复无效益的活,那就来自动的吧.linux自动发邮件还在zabbix监控通知等方面也可以用到. 关键点:centos7,svn版本号获取,发邮件工具以及设置,定时执行crontab. 一.svn版本号获取: 命令:svn info URL 获取最新版本信息之后通过一些组合命令即可获取SVN版本号. 二.发邮件: 工具:yum安装即可,mailx-12.5-12.el7_0.x86_64,post

redmine创建新闻,自动发邮件给项目组所有成员

redmine创建新闻,自动发邮件给项目组所有成员: 1.添加用户至公共项目内 2.配置系统邮件推送配置 3.检查用户接受推送配置 3.使用管理员账户发布新闻(不能自己发送自己) 4.查看邮件接受邮件

java windows自动化-mail自动发邮件

本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即为我的java代码package util;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.*;impo

python自动发邮件库yagmail

一般发邮件方法 我以前在通过Python实现自动化邮件功能的时候是这样的: import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smtpserver = 'smtp.sina.com' # 发送邮箱用户/密码 user = '[email protected]' password = '123456' # 发送邮箱 sender = '[email protec

python自动发邮件

想着能用程序自动发邮件就好了,想到就动手写了一个自动发邮件的脚本. 一:前提准备(我使用的是qq邮箱) 1.开通qq邮箱的smtp服务 2.上代码 # -*- coding: utf-8 -*- # @Time : 18-10-14 上午11:00 # @Author : Felix Wang from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.im

python 自动发邮件

一.一般发邮件的方法 Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件. 注意到构造MIMETEXT对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性. 然后,通过SMTP发出去: 1 # coding:utf-8 2 import smtplib 3 from email.mime.text i

Selenium 2自动化测试实战37(自动发邮件功能)

自动发邮件功能 例如,如果想在自动化脚本运行完成之后,邮箱就可以收到最新的测试报告结果.SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规划,由它来控制信件的中转方式.python的smtplib模块提供了一种很方便的途径用来发送电子邮件,它对SMTP协议进行了简单的封装.可以使用SMTP对象的sendmail方法发送邮件,通过help()可查看SMTP所提供的方法,命令如下: -from smtplib impo

自动发邮件功能

HTMLTestRunner.py """A TestRunner for use with the Python unit testing framework. Itgenerates a HTML report to show the result at a glance. The simplest way to use this is to invoke its main method. E.g. import unittest import HTMLTestRunne