Files
sql-scripts/OCTPDBA-345 - monitor dbmail/OCTPDBA-345/check dbmail status.sql
Thierry Schork 7cf858256a initial commit
2022-12-30 12:10:12 +01:00

178 lines
6.6 KiB
Transact-SQL

USE [HCITools];
SET NOCOUNT ON;
IF OBJECT_ID('dbo.mon_get_dbMail_status') IS NOT NULL BEGIN
DROP PROCEDURE dbo.mon_get_dbMail_status;
END;
GO
/*=============================================================================
Vérifie que tout les composants nécessaire à db_mail soient actif et configuré, ainsi que l'on ait pas de mail(s) en erreurs
adapté depuis https://www.mssqltips.com/sqlservertip/5258/sql-server-database-mail-health-check-for-all-sql-servers/
Les composants vérifiés sont:
* Sql express
db_mail n'est pas disponible sur cette version
* Est-ce que l'agent SQL tourne ?
* Est-ce que db_mail est actif ?
* Est-ce qu'un profil db_mail existe
* Est-ce qu'un accompte mail existe ?
* Est-ce que l'agent SQL à la fonction mail active ?
* Est-ce que le profil db_mail est associé à l'agent SQL ?
* Est-ce que l'ont trouve des entrées en erreur dans le log des mails dans les derniers X jours (défaut = 7) ?
Si aucun de ces composants est en echec, la valeur de "mails_are_sent" dans l'output est à 1.
Si n'importe quel de ces composant empêche l'envoi de mails, ou que des mails sont en erreur, la valeur est 0
Le champ "notes" contient un détail en toute lettre de ce qui peut bloquer / est bloquant lorsque "mails_are_sent" = 0
Contexte d'utilisation
----------------------
Sur tous les serveurs où db_mail est supposé tourner
Création : 18.10.2022 / TSC
=============================================================================*/
CREATE PROCEDURE dbo.mon_get_dbMail_status @check_failed_mail_in_past_days INT = 7
AS BEGIN
DECLARE
@SQLAgentEnabled INT = 0
,@SQLAgentStarted INT = 0
,@DBMailEnabled INT = 0
,@MailProfileEnabled INT = 0
,@MailAccountEnabled INT = 0
,@SQLAgentMailEnabled INT = 0
,@SQLAgentMailProfileEnabled sysname = ''
,@failed_email_error INT = 0;
-- SQL Server Agent enabled
SELECT @SQLAgentEnabled = CAST(value_in_use AS INT)
FROM sys.configurations
WHERE [name] = 'Agent XPs';
-- SQL Server Agent status
IF (SELECT CAST(SERVERPROPERTY('Edition') AS VARCHAR(30))) NOT LIKE 'Express Edition%' BEGIN
SELECT @SQLAgentStarted = CASE
WHEN status_desc = 'Running' THEN 1
ELSE 0
END
FROM sys.dm_server_services
WHERE SERVICENAME LIKE 'SQL Server Agent%'
OR servicename LIKE 'sqlagent$%'
;
END
-- SQL Database Mail is enabled
SELECT @DBMailEnabled = CAST(value_in_use AS INT)
FROM sys.configurations
WHERE [name] = 'Database Mail XPs';
-- @SQLAgentMailEnabled
SELECT @MailProfileEnabled = CASE
WHEN COUNT(*) > 0 THEN 1
ELSE 0
END
FROM msdb.dbo.sysmail_profile;
-- @MailAccountEnabled
SELECT @MailAccountEnabled = CASE
WHEN COUNT(*) > 0 THEN 1
ELSE 0
END
FROM msdb.dbo.sysmail_account;
-- SQL Server Agent is enabled to use Database Mail
EXECUTE master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE'
,N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent'
,N'UseDatabaseMail'
,@SQLAgentMailEnabled OUTPUT;
-- SQL Server Agent is enabled to use Database Mail and Mail Profile is assigned
EXECUTE master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE'
,N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent'
,N'DatabaseMailProfile'
,@SQLAgentMailProfileEnabled OUTPUT;
-- Check if there are failed email send in the last x days
--SELECT @failed_email_error = CASE
-- WHEN COUNT(*) > 0 THEN 1
-- ELSE 0 END
SELECT @failed_email_error = COUNT(1)
--SELECT *
FROM msdb.dbo.sysmail_event_log
WHERE event_type = 'error'
AND log_date > DATEADD(DAY, @check_failed_mail_in_past_days * -1, CURRENT_TIMESTAMP);
/*
--check each conditions
SELECT
@SQLAgentEnabled AS SQLAgentEnabled
,@SQLAgentStarted AS SQLAgentStarted
,@DBMailEnabled AS DBMailEnabled
,@MailProfileEnabled AS MailProfileEnabled
,@MailAccountEnabled AS MailAccountEnabled
,@SQLAgentMailEnabled AS SQLAgentMailEnabled
,@SQLAgentMailProfileEnabled AS SQLAgentMailProfileEnabled
,@failed_email_error AS failed_email_error
;
*/
-- Final report
SELECT
@@SERVERNAME AS Server_Name
,CAST(CURRENT_TIMESTAMP AS SMALLDATETIME) AS Run_Date
,@SQLAgentEnabled * @SQLAgentStarted * @DBMailEnabled * @MailProfileEnabled * @MailAccountEnabled
* @SQLAgentMailEnabled * (CASE WHEN @SQLAgentMailProfileEnabled IS NOT NULL THEN 1 ELSE 0 END)
* (CASE WHEN ISNULL(@failed_email_error, 0) = 0 THEN 1 ELSE 0 END) AS mails_are_sent
,CASE
WHEN CAST(SERVERPROPERTY('Edition') AS VARCHAR(30)) LIKE 'Express Edition%' THEN
'Express Edition, DB Mail not supported'
ELSE
CASE
WHEN @SQLAgentEnabled = 0 THEN 'SQL Agent disabled; '
ELSE ''
END
+
CASE
WHEN @SQLAgentStarted = 0 THEN 'SQL Agent is stopped; '
ELSE ''
END
+
CASE
WHEN @DBMailEnabled = 0 THEN 'DB Mail disabled; '
ELSE ''
END
+
CASE
WHEN @MailProfileEnabled = 0 THEN 'Mail Profile disabled; '
ELSE ''
END
+
CASE
WHEN @MailAccountEnabled = 0 THEN 'Mail Account disabled; '
ELSE ''
END
+
CASE
WHEN @SQLAgentMailEnabled = 0 THEN 'SQL Agent Mail disabled; '
ELSE ''
END
+
CASE
WHEN @SQLAgentMailProfileEnabled IS NOT NULL THEN ''
ELSE 'SQL Agent Mail Profile disabled; '
END
+
CASE
WHEN @failed_email_error > 0 THEN
'found ' + CAST(@failed_email_error AS VARCHAR(10)) + ' failed email(s) during last '
+ CONVERT(VARCHAR(5), @check_failed_mail_in_past_days) + ' days; '
ELSE ''
END
END AS Notes;
END;
GO
--sur ssunbqmsdb02.sunstore.ch\apssql, l'agent est stoppé et il y a des mails en erreur depuis le 12.10.22
EXECUTE HCITools.[dbo].[mon_get_dbMail_status] @check_failed_mail_in_past_days = 30; -- int