|
51 | 51 | DECLARE @_collection_time_end datetime;
|
52 | 52 | DECLARE @IsBlockingIssue BIT;
|
53 | 53 | DECLARE @AreInDirectConnections BIT;
|
| 54 | + DECLARE @IsBaseCapturingDoneInLast5Minutes BIT; |
54 | 55 | DECLARE @_SendMailRequired BIT;
|
55 | 56 | DECLARE @JobSchedule varchar(255),
|
56 | 57 | @NextRunTime datetime;
|
@@ -356,9 +357,11 @@ BEGIN
|
356 | 357 | left join msdb.dbo.sysschedules SS on SS.schedule_id = SJ.schedule_id
|
357 | 358 | where s.name = @p_JobName
|
358 | 359 | )
|
359 |
| - SELECT @JobSchedule = Frequency + ' (' + Interval + ') - ' + [Time] |
| 360 | + SELECT TOP (1) |
| 361 | + @JobSchedule = Frequency + ' (' + Interval + ') - ' + [Time] |
360 | 362 | ,@NextRunTime = NextRunTime
|
361 |
| - FROM T_Schedules; |
| 363 | + FROM T_Schedules |
| 364 | + ORDER BY CAST(NextRunTime AS DATETIME) ASC; |
362 | 365 |
|
363 | 366 | -- Find Job Session along with its Blockers
|
364 | 367 | IF OBJECT_ID('tempdb..#JobSessionBlockers') IS NOT NULL
|
@@ -562,38 +565,48 @@ RCA: Kindly execute below query to find out details of Blockers.
|
562 | 565 | IF @p_Verbose = 1
|
563 | 566 | PRINT 'Logic processing when @p_PerformAutoExecutionOfLogWalkJob = 1';
|
564 | 567 |
|
| 568 | + -- Find if sp_WhoIsActive capturing is done within last 5 minutes |
565 | 569 | IF @p_Verbose = 1
|
566 |
| - PRINT 'Finding Direct/Indirect connections for database '+QUOTENAME(@p_DbName); |
567 |
| - INSERT #DatabaseConnections (session_id, dbName, IsDirectConnection) |
568 |
| - SELECT session_id, dbName, MAX(IsDirectConnection) AS IsDirectConnection |
569 |
| - FROM ( |
570 |
| - SELECT s.session_id, DB_NAME(r.database_id) as dbName, 1 as IsDirectConnection |
571 |
| - FROM sys.dm_exec_sessions as s |
572 |
| - INNER JOIN sys.dm_exec_requests as r on r.session_id = s.session_id |
573 |
| - WHERE r.database_id = db_id(@p_DbName) |
574 |
| - -- |
575 |
| - UNION ALL |
576 |
| - -- |
577 |
| - SELECT l.request_session_id, db_name(l.resource_database_id) as dbName, 0 as IsDirectConnection |
578 |
| - FROM sys.dm_tran_locks as l left join sys.dm_exec_sessions as s on s.session_id = l.request_session_id |
579 |
| - WHERE l.resource_type = 'DATABASE' AND l.resource_database_id = db_id(@p_DbName) |
580 |
| - GROUP BY l.resource_database_id, l.request_session_id |
581 |
| - ) AS c |
582 |
| - GROUP BY c.dbName, c.session_id; |
583 |
| - |
584 |
| - IF NOT EXISTS(SELECT * FROM #DatabaseConnections WHERE dbName = @p_DbName AND IsDirectConnection = 0) |
| 570 | + PRINT 'Checking if sp_WhoIsActive capturing is done within last 5 minutes..'; |
| 571 | + IF EXISTS(SELECT * FROM dbo.WhoIsActive_ResultSets as r WHERE r.collection_time >= DATEADD(MINUTE,-5,GETDATE())) |
| 572 | + SET @IsBaseCapturingDoneInLast5Minutes = 1; |
| 573 | + ELSE |
585 | 574 | BEGIN
|
586 |
| - IF DBA.dbo.fn_IsJobRunning(@p_JobName) = 0 |
| 575 | + IF @p_Verbose = 1 |
| 576 | + PRINT ' Starting sp_WhoIsActive capturing..'; |
| 577 | + EXEC DBA.dbo.usp_SendWhoIsActiveMessage @p_JobName = @p_JobName; |
| 578 | + WAITFOR DELAY '00:05'; |
| 579 | + SET @IsBaseCapturingDoneInLast5Minutes = 1; |
| 580 | + END |
| 581 | + |
| 582 | + IF @IsBaseCapturingDoneInLast5Minutes = 1 |
| 583 | + BEGIN |
| 584 | + IF @p_Verbose = 1 |
| 585 | + PRINT ' Checking for Indirect connections for database '+QUOTENAME(@p_DbName); |
| 586 | + ;WITH t_results as |
| 587 | + ( |
| 588 | + SELECT @p_DbName as dbName, * |
| 589 | + FROM [DBA]..[WhoIsActive_ResultSets] r |
| 590 | + WHERE r.collection_time >= DATEADD(MINUTE,-5,GETDATE()) |
| 591 | + AND r.database_name <> @p_DbName |
| 592 | + ) |
| 593 | + SELECT * INTO #ActiveIndirectDbSessions from t_results as r |
| 594 | + WHERE r.locks.exist( '/Database[@name=sql:column("dbName")]') = 1; |
| 595 | + |
| 596 | + IF EXISTS(SELECT * FROM #ActiveIndirectDbSessions) |
| 597 | + PRINT 'There are inDirect connections against '+QUOTENAME(@p_DbName)+' database. So cannot run Log Walk job.'; |
| 598 | + ELSE |
587 | 599 | BEGIN
|
588 |
| - IF @p_Verbose = 1 |
589 |
| - PRINT 'Trying to start job '''+@p_JobName+''''; |
590 |
| - EXEC msdb..sp_start_job @job_name = @p_JobName; |
| 600 | + IF DBA.dbo.fn_IsJobRunning(@p_JobName) = 0 |
| 601 | + BEGIN |
| 602 | + IF @p_Verbose = 1 |
| 603 | + PRINT 'Trying to start job '''+@p_JobName+''''; |
| 604 | + EXEC msdb..sp_start_job @job_name = @p_JobName; |
| 605 | + END |
| 606 | + ELSE |
| 607 | + PRINT 'Job '''+@p_JobName+''' is already running.'; |
591 | 608 | END
|
592 |
| - ELSE |
593 |
| - PRINT 'Job '''+@p_JobName+''' is already running.'; |
594 |
| - END |
595 |
| - ELSE |
596 |
| - PRINT 'There are inDirect connections against '+QUOTENAME(@p_DbName)+' database. So cannot run Log Walk job.'; |
| 609 | + END |
597 | 610 | END
|
598 | 611 | END -- Block -> Logic if Job Failure is due to Blocking Issue
|
599 | 612 | ELSE IF @NoOfContinousFailures <> 0 AND @IsBlockingIssue = 0
|
|
0 commit comments