Generar Sensor de Chequeo de Ejecución de Jobs


Es necesario en ciertas ocasiones, tener que auditar ciertos jobs sabiendo que su ejecución es crucial y no debe demorarse mas de cierto tiempo.
Para estos casos, si el mismo se encuentra ejecutando alguna rutina rara, o esta lockeado por otro proceso y nosotros no estamos chequeando los mismos por estar fuera de la oficina, es necesario contar con un control en backgroud que nos ayude a mantener las cosas en orden.

Este Stored Procedure, generado en la base Master por cuestiones de comodidad, sirve para determinar si todo esta Ok o no.
Si el mismo devuelve 1, esta todo dentro del tiempo estipulado en las siguientes variables:

@Minutes_FROM_LAST_DURATION = 40
@Minutes_FROM_LAST_START = 90

Es decir, dicho proceso no puede exceder su ejecución en mas de 40 minutos, y ademas, no puede pasar mas 1 hora 30 minutos desde su ultima ejecución exitosa.
En caso de que dicho Job finalice con error, dispondremos de otro sensor que audite dicho estado para su posterior informe.

El script del mismo es el siguiente.


CREATE PROC DBA_ChecheaDelayConsolidacion  
   @JobName NVARCHAR(4000)  
AS  

DECLARE @Minutes_FROM_LAST_START SMALLINT  
DECLARE @Minutes_FROM_LAST_DURATION SMALLINT  
DECLARE @LastRunTime DATETIME  

DECLARE      @StartTime AS DATETIME
DECLARE      @Duration AS DATETIME
DECLARE      @Duration_MINUTES AS INT
DECLARE      @EndExecution AS DATETIME

----------------------------------------
SET @Minutes_FROM_LAST_START = 90  
SET @Minutes_FROM_LAST_DURATION = 40
----------------------------------------

SELECT	@StartTime =	CAST(CONVERT(CHAR(10), CAST(STR(JH.run_date,8, 0) AS DATETIME), 112) + ' ' +   
						STUFF(STUFF(RIGHT('000000' + CAST(JH.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') AS DATETIME),
		@Duration  =	CAST(STUFF(STUFF(RIGHT('000000' + CAST(JH.run_duration AS VARCHAR(6)),6),5,0,':'),3,0,':') AS DATETIME),
		@EndExecution =	CAST(CONVERT(CHAR(10), CAST(STR(JH.run_date,8, 0) AS DATETIME), 112) + ' ' +   
						STUFF(STUFF(RIGHT('000000' + CAST(JH.run_time AS VARCHAR(6)) ,6),5,0,':'),3,0,':') AS DATETIME) +  
						CAST(STUFF(STUFF(RIGHT('000000' + CAST(JH.run_duration AS VARCHAR(6)),6),5,0,':'),3,0,':') AS DATETIME)
FROM msdb.dbo.sysjobs J  
INNER JOIN msdb.dbo.sysjobhistory JH  
ON  J.job_id = JH.job_id  
WHERE J.name = @JobName  
AND  Jh.step_id = 0  
AND  JH.run_status = 1   

/*
SELECT @StartTime AS StartTime,
             @Duration AS Duration,
             @EndExecution AS EndExecution

  
SELECT DATEDIFF(MINUTE, @EndExecution, GETDATE()) AS Diferencia  
SELECT @EndExecution AS EndExecution  
SELECT GETDATE()  
*/

SELECT @Duration_MINUTES = DATEPART(HOUR,@Duration) * 60 + DATEPART(MINUTE,@Duration)
  
IF DATEDIFF(MINUTE, @EndExecution, GETDATE()) > @Minutes_FROM_LAST_START  OR @Duration_MINUTES>@Minutes_FROM_LAST_DURATION
BEGIN  
 PRINT 'Proceso Demorado en mas de 1 hora...'  
 SELECT 1/0 AS 'Error Forzado'  
END ELSE  
BEGIN  
 PRINT 'Proceso en Tiempo OK !!!'  
 SELECT 1  
END  

END

Nuestra ejecución seria de esta forma

EXEC master.dbo.DBA_ChecheaDelayJob @JobName = 'Nombre_Job'

Generar Backup de todas las Bases de Datos de una Instancia especifica.


Con este Script, generamos el backup de todas las bases que tenemos en nuestra instancia a excepción de la base TempDb, Model y msdb.
Simplemente tenemos que especificarle a la variable @BackupLocation, el destino de todos los archivos de Backups.

CREATE PROC DBA_BackupAllDatabase
		@BackupLocation NVARCHAR(500)
AS

DECLARE @dirContent TABLE(DatabaseName VARCHAR(255))
DECLARE	@Str NVARCHAR(4000)
DECLARE	@DatabaseName NVARCHAR(255)
--SET @BackupLocation = 'F:\Backup_BBDD_Nivel3'
SET @Str = ''
 
INSERT INTO @dirContent
SELECT name, * 
FROM sys.databases
WHERE name NOT IN ('tempdb', 'model', 'msdb', 'distribution')

DECLARE dd CURSOR FOR 
SELECT	DatabaseName 
FROM	@dirContent
OPEN dd
FETCH NEXT FROM dd INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
	SELECT @Str =	'BACKUP DATABASE [' + @DatabaseName + '] TO' + 
					' DISK = N''' + @BackupLocation + '\' + @DatabaseName + '.BAK''' + 
					' WITH NOFORMAT, NOINIT,  NAME = N''' + @DatabaseName + '-FULL Database Backup''' + 
					', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'

	EXEC(@Str)
		
FETCH NEXT FROM dd INTO @DatabaseName
END
CLOSE dd
DEALLOCATE dd

Nuestra ejecución seria de esta forma

EXEC DBA_BackupAllDatabase @BackupLocation= 'L:\Backup\DBSAFA3001'