SQL Server数据库邮件功能全攻略 【HTML/JOB实例】

SQL Server数据库邮件功能全攻略 【HTML/JOB实例】

最近一个项目的需求,需要在数据库自动发送数据库Jobs的失败记录,便于系统管理人员及时检查,经过一番研究,虽然SQL Server数据库邮件非常全面,但也有一些必须关注的地方,以下是自己曾经踩过的坑,下面是配置数据库功能的全攻略,重点是坑的介绍,希望能帮助各位避免不必要的坑。以下是具体的介绍。

数据库邮件功能用户创建

笔者最大的坑,当然要第一时间说,数据库邮件要求用户角色必须具有数据库MSDB的DatabaseMailUserRole,故笔者的解决办法是先建一个登录新用户,以下以DBA Monitor作为示例。

  1. 创建登录新用户DBA Monitor,注意服务器角色的选择:
    在这里插入图片描述
  2. 在用户映射选项卡中选择MSDB:
    在这里插入图片描述
  3. 选择数据库MSDB下的新用户DBA Monitor,编辑数据库角色为DatabaseMailUserRole:
    在这里插入图片描述
  4. 启用Database Mail XPs功能
sp_configure 'show advanced options',1
go
reconfigure
go
sp_configure 'Database Mail XPs',1
go
reconfigure

数据库邮件配置账户和配置文件

基本上按照SQLServer的配置步骤一步一步进行配置。

  1. 右键【数据库邮件】–》选择【配置数据库邮件】,但必须注意邮件发送服务器的设置和端口号,必须注意邮箱发送服务器的smpt功能必须打开:
    在这里插入图片描述
  2. 以163邮箱为例,打开IMAP/SMTP功能:
    在这里插入图片描述
  3. 在配置文件安全性选择公共选项,可以作为所有邮件功能的配置使用:
    在这里插入图片描述
    到此数据库邮件发送的用户,配置账号,配置文件都完成,下面是具体说明两个数据库邮件发送的示例:

数据库邮件发送示例1–【SQLserver 代理】–【作业】

  1. 新建作业,注意作业的所有者需要选择我们在以前的新创建的数据库邮件用户DBA Monitor:
    在这里插入图片描述
  2. 步骤中输入数据库邮件发送代码,该代码以HTML的格式发送最近两天内数据库失败的JOB记录的相关信息:
    在这里插入图片描述
  3. 数据库邮件发送html格式代码,该代码已在sqlserver2017上验证运行:
--Sending JOBs message
DECLARE @d_nowdate datetime;
DECLARE @str_subject NVARCHAR(200);
DECLARE @tableHTML NVARCHAR(MAX);

--Current Datatime
set @d_nowdate = convert(datetime,convert(varchar(10),dateadd(day,-1,getdate()),120),120);
 
-- if exists the record for failed Job's lob
if exists (select top 1 a.job_id from msdb.dbo.sysjobhistory a inner join msdb.dbo.sysjobs b on a.job_id = b.job_id 
where a.run_status = 0 and run_date >= cast((FORMAT(getdate()-1, 'yyyyMMdd')) as int))
begin

set @str_subject='The failed JOBs from the database of ERP&BPM - ' + FORMAT(getdate(), 'yyyyMMdd');

SET @tableHTML = N'<H1>Please check the following failed JOBs[' + FORMAT(getdate(), 'yyyy-MM-dd HH:mm:ss') + N']</H1><table border="1" width="85%">' +
    N'<tr><th>NO.</th><th>Job Name</th><th>Step Name</th><th>Error Message</th><th>Date</th><th>Time</th><th>Server</th></tr>' +
    CAST((select row_number()over(order by a.instance_id desc)as 'td','',b.name as 'td','',a.step_name as 'td','',a.message as 'td','',a.run_date as 'td','',a.run_time as 'td','',a.server as 'td' 
	from msdb.dbo.sysjobhistory a inner join msdb.dbo.sysjobs b on a.job_id = b.job_id
	where a.run_status = 0 and run_date >= cast((FORMAT(getdate()-1, 'yyyyMMdd')) as int)
	order by a.instance_id desc
    FOR XML PATH('tr'),ELEMENTS) AS NVARCHAR(MAX)) + N'</table>';
 
 -- Send Email
 exec  msdb.dbo.sp_send_dbmail
        @profile_name = 'DBA Monitor',
        @recipients = '[email protected]', 
        @subject = @str_subject,
        @body = @tableHTML,
        @body_format = 'HTML';
end
  1. 邮件发送后的格式:
    在这里插入图片描述

数据库邮件发送示例2-- 作业失败自动发送警报邮件

  1. 如果需要在作业失败自动发送通知邮件,这是笔者踩过的又一个大坑,当时没有在【SQL Server代理】右键的属性页面中,将【警报系统】中的【启用邮件配置文件】选择,并选择在上文配置的邮件配置文件:DBA Monitor. 没有选择前,试了若干次邮件都不成功,勾选后,一切顺利,浪费时间若干。希望读者可以避免该坑。
    在这里插入图片描述
  2. 新建作业操作员,设置需要发送的警报邮件的邮件地址:
    在这里插入图片描述
  3. 选择一个作业,右键编辑属性中【通知】,选择【电子邮件】,选择刚刚创建的操作员,当作业失败的时候,数据库邮件会自动发送失败信息到该操作员的邮箱:
    在这里插入图片描述
  4. 重启【SQLserver代理】服务器,这个很重要,配置后,如果没有重启,自动发送功能无法生效。

关于数据邮件功能的介绍和坑的提醒就此告一段落,总的来说,该功能非常使用,对数据库运维工作提供非常好的体验。以上所有的操作和脚本都是基于Sqlserver2017实现,其它版本仅供参考执行。

发布了6 篇原创文章 · 获赞 1 · 访问量 347

猜你喜欢

转载自blog.csdn.net/u010617124/article/details/103343511