From 66cd0256725edca9c702b0683ae2bc181658aed9 Mon Sep 17 00:00:00 2001 From: Dan Denney Date: Thu, 25 Apr 2019 13:34:35 -0700 Subject: [PATCH 1/9] RunBook --- RunBook/RunBook - Job.sql | 355 ++++++++++++++++++++++++++++++ RunBook/RunBook - Permissions.sql | Bin 0 -> 1440 bytes RunBook/RunBook.sql | 177 +++++++++++++++ 3 files changed, 532 insertions(+) create mode 100644 RunBook/RunBook - Job.sql create mode 100644 RunBook/RunBook - Permissions.sql create mode 100644 RunBook/RunBook.sql diff --git a/RunBook/RunBook - Job.sql b/RunBook/RunBook - Job.sql new file mode 100644 index 0000000..f25eed7 --- /dev/null +++ b/RunBook/RunBook - Job.sql @@ -0,0 +1,355 @@ +USE [msdb] +GO + +/****** Object: Job [Run Book] Script Date: 4/25/2019 11:55:06 AM ******/ +BEGIN TRANSACTION +DECLARE @ReturnCode INT +SELECT @ReturnCode = 0 +/****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 4/25/2019 11:55:06 AM ******/ +IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) +BEGIN +EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +END + +DECLARE @jobId BINARY(16) +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Run Book', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @category_name=N'[Uncategorized (Local)]', + @owner_login_name=N'sa', @job_id = @jobId OUTPUT +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +/****** Object: Step [PS - Query Servers] Script Date: 4/25/2019 11:55:07 AM ******/ +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'PS - Query Servers', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', + @command=N'$RunBookInstance = "CHDC-CAR-THSQL2\DataMartDev" + +$ServersQuery = "SELECT InstanceName FROM Sys_Admin.RunBook.DatabaseInstances WHERE IsActive = 1" +$LastCheckQuery = "SELECT TOP (1) CheckDateTime FROM Sys_Admin.RunBook.ServerCheckDates ORDER BY CheckDateTime DESC" +$Servers = Invoke-Sqlcmd -Query $ServersQuery -ServerInstance $RunBookInstance +$LastCheck = Invoke-Sqlcmd -Query $LastCheckQuery -ServerInstance $RunBookInstance +[datetime]$LastCheckDate = Get-Date -Date $LastCheck.CheckDateTime -Format ''yyyy-MM-dd hh:mm:ss.fff'' +[datetime]$CurrentCheckDate = Get-Date -Format ''yyyy-MM-dd HH:mm:ss.fff'' + +$RestartQuery = "SELECT create_date AS LastRestarted + ,LEFT(@@VERSION, CHARINDEX(''('', @@VERSION) - 1) + CAST(SERVERPROPERTY (''edition'') AS varchar(50)) AS SQLEdition + ,SERVERPROPERTY(''productversion'') AS SQLVersion +FROM sys.databases WHERE name = ''tempdb''" + +$PrimaryReplicaQuery = "DECLARE @PrimaryReplica NVARCHAR(254) + ,@Version NUMERIC(18,10) +SET @Version = CAST(LEFT(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)),CHARINDEX(''.'',CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max))) - 1) + ''.'' + REPLACE(RIGHT(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max))) - CHARINDEX(''.'',CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)))),''.'','''') AS numeric(18,10)) + +IF @Version < 11 -- Below 2012; + BEGIN + SET @PrimaryReplica = NULL; + END +ELSE + BEGIN + + SELECT @PrimaryReplica = Primary_Replica + FROM sys.dm_hadr_availability_group_states; + + IF @PrimaryReplica IS NOT NULL AND @PrimaryReplica = @@SERVERNAME + SET @PrimaryReplica = 1; + ELSE IF @PrimaryReplica IS NOT NULL AND @PrimaryReplica <> @@SERVERNAME + SET @PrimaryReplica = 0; + ELSE + + SET @PrimaryReplica = NULL; + END +SELECT @PrimaryReplica AS PrimaryReplica; +" + +$DatabaseHealthQuery = "SELECT name AS DatabaseName, state_desc AS DatabaseState FROM sys.databases WHERE state <> 0" + +$FailedBackupsQuery = ";WITH cteBackups AS +( + SELECT + DB_ID(bus.database_name) AS DatabaseId + ,MAX(CASE WHEN bus.type = ''D'' THEN bus.Backup_Finish_Date END) AS LastFullBackup + ,MAX(CASE WHEN bus.Type <> ''D'' THEN bus.Backup_Finish_Date END) AS LastDiffBackup + FROM msdb.dbo.backupset bus + GROUP BY bus.Database_Name +) +SELECT d.name AS DatabaseName + ,b.LastFullBackup + ,b.LastDiffBackup +FROM sys.Databases d + LEFT JOIN cteBackups b + ON d.database_id = b.DatabaseId +WHERE b.DatabaseId IS NULL + AND d.database_id NOT IN (2,3) + AND d.State = 0 + AND d.name NOT LIKE ''AdventureWorks%'' + AND d.name NOT LIKE ''x^_%'' ESCAPE ''^'' + OR (b.LastDiffBackup < ''$LastCheckDate'' + AND b.LastFullBackup < ''$LastCheckDate'' + );" + +$AlertsQuery = ";WITH cteAlerts AS +( + SELECT a.name AS AlertName + ,a.message_id AS MessageId + ,a.severity + ,msdb.dbo.agent_datetime(a.last_occurrence_date, a.last_occurrence_time) AS AlertDateTime + FROM msdb.dbo.sysalerts a + WHERE a.last_occurrence_date > 0 + AND (a.Severity > 20 + OR a.Severity = 0) +) +SELECT ca.AlertName + ,ca.MessageId + ,ca.Severity + ,ca.AlertDateTime +FROM cteAlerts ca +WHERE ca.AlertDateTime > ''$LastCheckDate'';" + +$FailedJobsQuery = ";WITH cteFailedJobs AS +( + SELECT sjh.job_id + ,MAX(msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time)) AS RunDateTime + FROM msdb.dbo.sysjobhistory sjh + WHERE sjh.run_status NOT IN (1,4) -- Succeed, In Progress + AND sjh.step_id <> 0 + AND sql_message_id <> 50000 + group by sjh.job_id +), +cteSuccessAfter AS +( + SELECT cfj.job_id + ,cfj.RunDateTime + ,COUNT(sjh.job_id) AS Success + FROM cteFailedJobs cfj + LEFT JOIN msdb.dbo.sysjobhistory sjh + ON sjh.job_id = cfj.job_id + AND msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) > cfj.RunDateTime + AND sjh.run_status = 1 -- Succeed + AND sjh.step_id = 0 + GROUP BY cfj.job_id, cfj.RunDateTime +) +SELECT sj.name AS JobName + ,csa.RunDateTime + ,CASE + WHEN csa.Success > 0 THEN 1 + ELSE 0 + END AS RanSuccessfulAfter +FROM cteSuccessAfter csa + inner join msdb.dbo.sysjobs sj + ON sj.job_id = csa.job_id +WHERE RunDateTime > ''$LastCheckDate''" + +$MemoryDumpQuery = "SELECT creation_time +FROM sys.dm_server_memory_dumps +WHERE creation_time > ''$LastCheckDate''" + + +Foreach ($Server in $Servers) { + $InstanceName = $Server.InstanceName + $RestartTime = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $RestartQuery + [datetime]$rs = get-date -date $RestartTime.LastRestarted -Format ''yyyy-MM-dd HH:mm:ss.fff'' + $SQLEdition = $RestartTime.SQLEdition + $SQLVersion = $RestartTime.SQLVersion + $InstanceUpdate = "UPDATE Sys_Admin.RunBook.DatabaseInstances + SET LastRestarted = ''$rs'' + ,LastCheckDateTime = ''$CurrentCheckDate'' + ,SQLEdition = ''$SQLEdition'' + ,SQLVersion = ''$SQLVersion'' + WHERE InstanceName = ''$InstanceName'';" + Invoke-Sqlcmd -Query $InstanceUpdate -ServerInstance $RunBookInstance + + $PrimaryReplicas = Invoke-SqlCmd -ServerInstance $InstanceName -Query $PrimaryReplicaQuery + $PrimaryReplica = $PrimaryReplicas.PrimaryReplica + if ($PrimaryReplica -ne [System.DBNULL]::Value){ + $ReplicaUpdate = "UPDATE Sys_Admin.RunBook.DatabaseInstances + SET IsCurrentPrimary = $PrimaryReplica + WHERE InstanceName = ''$InstanceName'';" + Invoke-SqlCmd -Query $ReplicaUpdate -ServerInstance $RunBookInstance + } + + $DatabasesHealth = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $DatabaseHealthQuery + if ($DatabasesHealth.count -gt 0) { + foreach ($DatabaseHealth in $DatabasesHealth) { + $DBName = $DatabaseHealth.DatabaseName + $DBState = $DatabaseHealth.DatabaseState + $UnhealthyDatabaseInsert = "INSERT INTO Sys_Admin.RunBook.UnhealthyDatabases (InstanceName, DatabaseName, DatabaseState, CheckDateTime) + VALUES (''$InstanceName'', ''$DBName'', ''$DBState'', ''$CurrentCheckDate'');" + Invoke-Sqlcmd -Query $UnhealthyDatabaseInsert -ServerInstance $RunBookInstance + } + } + +$FailedBackupsQuery = "DECLARE @SQL NVARCHAR(4000) + ,@Version NUMERIC(18,10) + SET @Version = CAST(LEFT(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)),CHARINDEX(''.'',CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max))) - 1) + ''.'' + REPLACE(RIGHT(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max))) - CHARINDEX(''.'',CAST(SERVERPROPERTY(''ProductVersion'') AS nvarchar(max)))),''.'','''') AS numeric(18,10)) + + IF @Version < 11 -- Below 2012 + BEGIN + SET @SQL = + ''WITH cteBackups AS + ( + SELECT + DB_ID(bus.database_name) AS DatabaseId + ,MAX(CASE WHEN bus.type = ''''D'''' THEN bus.Backup_Finish_Date END) AS LastFullBackup + ,MAX(CASE WHEN bus.Type <> ''''D'''' THEN bus.Backup_Finish_Date END) AS LastDiffBackup + FROM msdb.dbo.backupset bus + GROUP BY bus.Database_Name + ) + SELECT d.name AS DatabaseName + ,b.LastFullBackup + ,b.LastDiffBackup + FROM sys.Databases d + LEFT JOIN cteBackups b + ON d.database_id = b.DatabaseId + WHERE d.database_id NOT IN (2,3) + AND d.name NOT LIKE ''''AdventureWorks%'''' + AND d.name NOT LIKE ''''x^_%'''' ESCAPE ''''^'''' + AND (b.DatabaseId IS NULL + OR (b.LastDiffBackup < ''''$LastCheckDate'''' + AND b.LastFullBackup < ''''$LastCheckDate'''' + ) + );'' + END + ELSE + BEGIN + SET @SQL = + ''WITH cteBackups AS + ( + SELECT + DB_ID(bus.database_name) AS DatabaseId + ,MAX(CASE WHEN bus.type = ''''D'''' THEN bus.Backup_Finish_Date END) AS LastFullBackup + ,MAX(CASE WHEN bus.Type <> ''''D'''' THEN bus.Backup_Finish_Date END) AS LastDiffBackup + FROM msdb.dbo.backupset bus + GROUP BY bus.Database_Name + ) + SELECT d.name AS DatabaseName + ,b.LastFullBackup + ,b.LastDiffBackup + FROM sys.Databases d + LEFT JOIN cteBackups b + ON d.database_id = b.DatabaseId + WHERE d.database_id NOT IN (2,3) + AND d.name NOT LIKE ''''AdventureWorks%'''' + AND d.name NOT LIKE ''''x^_%'''' ESCAPE ''''^'''' + AND (d.group_database_id IS NULL + OR EXISTS + ( + SELECT 1 + FROM sys.dm_hadr_availability_group_states States + INNER JOIN master.sys.availability_groups Groups ON States.group_id = Groups.group_id + INNER JOIN sys.availability_databases_cluster AGDatabases ON Groups.group_id = AGDatabases.group_id + WHERE primary_replica = @@Servername + AND d.group_database_id = AGDatabases.group_database_id + ) + ) + AND (b.DatabaseId IS NULL + OR (b.LastDiffBackup < ''''$LastCheckDate'''' + AND b.LastFullBackup < ''''$LastCheckDate'''' + ) + );'' + END;" + + $FailedBackups = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $FailedBackupsQuery + foreach ($FailedBackup in $FailedBackups) { + $DBName = $FailedBackup.DatabaseName + + if (-not [String]::IsNullOrEmpty($DBName)){ + $FailedBackupInsert = "INSERT INTO Sys_Admin.RunBook.FailedBackups (InstanceName, DatabaseName, CheckDateTime" + $FailedBackupValues = " VALUES (''$InstanceName'', ''$DBName'', ''$CurrentCheckDate''" + if ($FailedBackup.LastFullBackup -isnot [DBNull]){ + $LastFull = $FailedBackup.LastFullBackup + $FailedBackupInsert = $FailedBackupInsert + ", LastFullBackup" + $FailedBackupValues = $FailedBackupValues + ", ''$LastFull''" + } + if ($FailedBackup.LastDiffBackup -isnot [DBNull]){ + $LastDiff = $FailedBackup.LastDiffBackup + $FailedBackupInsert = $FailedBackupInsert + ", LastDiffBackup" + $FailedBackupValues = $FailedBackupValues + ", ''$LastDiff ''" + } + $FailedBackupInsert = $FailedBackupInsert + ")" + $FailedBackupValues = $FailedBackupValues + ")" + + $FailedBackupInsertValues = $FailedBackupInsert + $FailedBackupValues + Invoke-Sqlcmd -Query $FailedBackupInsertValues -ServerInstance $RunBookInstance + } + } + + $Alerts = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $AlertsQuery + foreach ($Alert in $Alerts) { + $AlertName = $Alert.AlertName + $AlertMessageId = $Alert.MessageId + $AlertSeverity = $Alert.severity + $AlertDateTime = $Alert.AlertDateTime + $InsertAlert = "INSERT INTO Sys_Admin.RunBook.Alerts (InstanceName, AlertName, MessageId, Severity, AlertDateTime, CheckDateTime) + VALUES (''$InstanceName'', ''$AlertName'', $AlertMessageId, $AlertSeverity, ''$AlertDateTime'', ''$CurrentCheckDate'')" + Invoke-Sqlcmd -Query $InsertAlert -ServerInstance $RunBookInstance + } + + $FailedJobs = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $FailedJobsQuery + foreach ($FailedJob in $FailedJobs) { + $JobName = $FailedJob.JobName + $JobDate = $FailedJob.RunDateTime + $JobSuccess = $FailedJob.RanSuccessfulAfter + if (-not [String]::IsNullOrEmpty($JobName)) { + $InsertJob = "INSERT INTO Sys_Admin.RunBook.FailedJobs (InstanceName, JobName, RunDateTime, RanSuccessfulAfter, CheckDateTime) + VALUES (''$InstanceName'', ''$JobName'', ''$JobDate'', $JobSuccess, ''$CurrentCheckDate'')" + $InsertJob + Invoke-Sqlcmd -Query $InsertJob -ServerInstance $RunBookInstance + } + } + + $MemoryDumps = Invoke-Sqlcmd -ServerInstance $InstanceName -Query $MemoryDumpQuery + foreach ($MemoryDump in $MemoryDumps) { + $MemoryDumpDate = $MemoryDump.Creation_time + if (-not [String]::IsNullOrEmpty($MemoryDumpDate)) { + $InsertMemoryDump = "INSERT INTO Sys_Admin.RunBook.MemoryDumps (InstanceName, MemoryDumpDateTime, CheckDateTime) + VALUES (''$InstanceName'',''$MemoryDumpDate'',''$CurrentCheckDate'')" + Invoke-Sqlcmd -Query $InsertMemoryDump -ServerInstance $RunBookInstance + } + } +} + +$ServerCheckDateInsert = "INSERT INTO Sys_Admin.RunBook.ServerCheckDates (CheckDateTime) VALUES (''$CurrentCheckDate'')" +Invoke-Sqlcmd -Query $ServerCheckDateInsert -ServerInstance $RunBookInstance', + @database_name=N'master', + @output_file_name=N'\\chdc-car-thsql2\d$\SQLAgent_Output\DATAMARTDEV\RunBook\Step01.txt', + @flags=0 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Daily - 7 AM', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20190222, + @active_end_date=99991231, + @active_start_time=70000, + @active_end_time=235959, + @schedule_uid=N'745f4a10-2bc2-42ea-b333-a7e25daafcb1' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: +GO + + diff --git a/RunBook/RunBook - Permissions.sql b/RunBook/RunBook - Permissions.sql new file mode 100644 index 0000000000000000000000000000000000000000..33b8c177f32053a1726a632f01b3423211602e11 GIT binary patch literal 1440 zcmeH{&rZTX5XQf=iSN)eiSPs-DlKRNR-uRq5>lWlDi8tj?bY8*Awdpa(3@$xyR-A} zoB4M4^P{4Yj&-Cf+_2p#NmbSpjj z+}5=k$e|vPXY2=VvCx|MBe%(zN5rsbrr-J&@rRrEfu2|m(ZA#Q!WV$Td;%X0-C~2H zq>7`lnmTGL#->MI8M#+(*LQtgiO*GPiNTn^ZDUjSWjI(luD&5Cb2T=(3DOqk{ErzkcnP?#w`Pyi=rzHjZVZGi*VDj#%T~hy$^R#RC u&-q_*9_tpCt1wW!2Fd0fFb?LhQ089QJuhCf?Mcl!trK2?-0%JGo{29B#Nu}V literal 0 HcmV?d00001 diff --git a/RunBook/RunBook.sql b/RunBook/RunBook.sql new file mode 100644 index 0000000..1a6834d --- /dev/null +++ b/RunBook/RunBook.sql @@ -0,0 +1,177 @@ + +use Sys_Admin +go + + +CREATE SCHEMA RunBook AUTHORIZATION dbo; +GO + +create table RunBook.ServerCheckDates +( + CheckDateTime DATETIME2 NOT NULL + ,CONSTRAINT PK_ServerCheckDates_CheckDateTime PRIMARY KEY CLUSTERED + (CheckDateTime) +); + +create table RunBook.DatabaseInstances +( + InstanceName varchar(254) NOT NULL + ,Environment varchar(5) NOT NULL + ,ServerUse varchar(20) NOT NULL + ,LastRestarted DATETIME2 NOT NULL + ,LastCheckDateTime DATETIME2 NOT NULL + ,IsActive BIT NOT NULL CONSTRAINT DF_DatabaseInstances_IsActive DEFAULT (1) + ,Comments varchar(254) NULL + ,SQLEdition varchar(100) NULL + ,SQLVersion varchar(20) NULL + ,IsCurrentPrimary BIT NULL + ,CONSTRAINT PK_DatabaseInstances_InstanceName PRIMARY KEY CLUSTERED + (InstanceName) +); + +INSERT INTO RunBook.DatabaseInstances (InstanceName, Environment, ServerUse, LastRestarted, LastCheckDateTime, + IsActive, SQLEdition, SQLVersion, Comments, IsCurrentPrimary) +VALUES ('CHDC-CAR-PHSQL4\DataMartProd','Prod','DataMart','2019-01-01','2019-01-01',1,NULL,NULL,NULL,1) + ,('CHDC-CAR-PHSQL5\DataMartProd','Prod','DataMart','2019-01-01','2019-01-01',1,NULL,NULL,NULL,0) + ,('CHDC-CAR-THSQL2\DataMartDev','Dev','DataMart','2019-01-01','2019-01-01',1,NULL,NULL,NULL,NULL) + ,('CHDC-CAR-THSQL2\DataMartTest','Test','DataMart','2019-01-01','2019-01-01',1,NULL,NULL,NULL,NULL) + ,('CHDC-CLS-PHSQL9\Prod','Prod','SQL9','2019-01-01','2019-01-01',1,NULL,NULL,NULL,NULL) + ,('CHDC-CLS-DHSQL9\Dev','Dev','SQL9','2019-01-01','2019-01-01',1,NULL,NULL,NULL,NULL) + ,('CHDC-S13-PCSQL1\S13','Prod','SharePoint','2019-01-01','2019-01-01',1,NULL,NULL,NULL,1) + ,('CHDC-S13-PCSQL2\S13','Prod','SharePoint','2019-01-01','2019-01-01',1,NULL,NULL,NULL,0) + ,('CHDC-SQL-DVCH1C\I1','Dev','Apps','2019-01-01','2019-01-01',1,NULL,NULL,NULL,NULL) + ,('CHDC-SQL-PCCH2A\I1','Prod','Apps','2019-01-01','2019-01-01',1,NULL,NULL,NULL,1) + ,('CHDC-SQL-PCCH2B\I1','Prod','Apps','2019-01-01','2019-01-01',1,NULL,NULL,NULL,0) + ,('CHDC-SQL-UCCH2A\I1','Test','Apps','2019-01-01','2019-01-01',1,NULL,NULL,NULL,1) + ,('CHDC-SQL-UCCH2B\I1','Test','Apps','2019-01-01','2019-01-01',1,NULL,NULL,NULL,0) + ; + +create table RunBook.UnhealthyDatabases +( + UnhealthyDatabaseId INT NOT NULL IDENTITY(1,1) + ,InstanceName varchar(254) NOT NULL + ,DatabaseName sysname NOT NULL + ,DatabaseState varchar(60) NOT NULL + ,CheckDateTime DATETIME2 NOT NULL + ,CONSTRAINT PK_UnhealthyDatabases_InstanceNameCheckDateTimeUnhealthyDatabaseId PRIMARY KEY CLUSTERED + (InstanceName, CheckDateTime, UnhealthyDatabaseId) +); + +create table RunBook.FailedBackups +( + FailedBackupId INT NOT NULL IDENTITY(1,1) + ,InstanceName varchar(254) NOT NULL + ,DatabaseName varchar(254) NOT NULL + ,LastFullBackup DATETIME2 NULL + ,LastDiffBackup DATETIME2 NULL + ,CheckDateTime DATETIME2 NOT NULL + ,CONSTRAINT PK_FailedBackups_InstanceNameCheckDateTimeFailedBackupId PRIMARY KEY CLUSTERED + (InstanceName, CheckDateTime, FailedBackupId) +); + +create table RunBook.Alerts +( + AlertId INT NOT NULL IDENTITY(1,1) + ,InstanceName varchar(254) NOT NULL + ,AlertName sysname NOT NULL + ,MessageId INT NOT NULL + ,Severity INT NOT NULL + ,AlertDateTime DATETIME2 NOT NULL + ,CheckDateTime DATETIME2 NOT NULL + ,CONSTRAINT PK_Alerts_InstanceNameCheckDateTimeAlertId PRIMARY KEY CLUSTERED + (InstanceName, CheckDateTime, AlertId) +); + +create table RunBook.FailedJobs +( + FailedJobId INT NOT NULL IDENTITY(1,1) + ,InstanceName varchar(254) NOT NULL + ,JobName sysname NOT NULL + ,RunDateTime DATETIME2 NOT NULL + ,RanSuccessfulAfter BIT NOT NULL CONSTRAINT DF_FailedJobs_RanSuccessfulAfter DEFAULT 0 + ,CheckDateTime DATETIME2 NOT NULL + ,CONSTRAINT PK_FailedJobs_InstanceNameCheckDateTimeFailedJobId PRIMARY KEY CLUSTERED + (InstanceName, CheckDateTime, FailedJobId) +); + + +/* +/* Queries */ +-- Last Run: +SELECT create_date AS LastRestarted FROM sys.databases WHERE name = 'tempdb'; + +-- Database Health: +SELECT name AS DatabaseName, state_desc AS DatabaseState FROM sys.databases WHERE state <> 0 + +-- Failed Backup: +;WITH cteBackups AS +( + SELECT + DB_ID(bus.database_name) AS DatabaseId + ,MAX(CASE WHEN bus.type = 'D' THEN bus.Backup_Finish_Date END) AS LastFullBackup + ,MAX(CASE WHEN bus.Type <> 'D' THEN bus.Backup_Finish_Date END) AS LastDiffBackup + FROM msdb.dbo.backupset bus + GROUP BY bus.Database_Name +) +SELECT d.name AS DatabaseName + ,b.LastFullBackup + ,b.LastDiffBackup +FROM sys.Databases d + LEFT JOIN cteBackups b + ON d.database_id = b.DatabaseId +WHERE b.DatabaseId IS NULL + AND d.database_id NOT IN (2,3) + OR (b.LastDiffBackup < DATEADD(HOUR, -24, SYSDATETIME()) + AND b.LastFullBackup < DATEADD(HOUR, -24, SYSDATETIME()) + ); + +-- Alerts +;WITH cteAlerts AS +( + SELECT a.name AS AlertName + ,a.message_id AS MessageId + ,a.severity + ,msdb.dbo.agent_datetime(a.last_occurrence_date, a.last_occurrence_time) AS AlertDateTime + FROM msdb.dbo.sysalerts a + WHERE a.last_occurrence_date > 0 +) +SELECT * +FROM cteAlerts ca +WHERE ca.AlertDateTime > DATEADD(HOUR, -24, SYSDATETIME()); + +-- Failed Jobs +;WITH cteFailedJobs AS +( + SELECT sjh.job_id + ,MAX(msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time)) AS RunDateTime + FROM msdb.dbo.sysjobhistory sjh + WHERE sjh.run_status NOT IN (1,4) -- Succeed, In Progress + AND sjh.step_id <> 0 + group by sjh.job_id +), +cteSuccessAfter AS +( + SELECT cfj.job_id + ,cfj.RunDateTime + ,COUNT(sjh.job_id) AS Success + FROM cteFailedJobs cfj + LEFT JOIN msdb.dbo.sysjobhistory sjh + ON sjh.job_id = cfj.job_id + WHERE msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) > cfj.RunDateTime + AND sjh.run_status = 1 -- Succeed + AND sjh.step_id = 0 + GROUP BY cfj.job_id, cfj.RunDateTime +) +SELECT sj.name AS JobName + ,csa.RunDateTime + ,CASE + WHEN csa.Success > 0 THEN 1 + ELSE 0 + END AS RanSuccessfulAfter +FROM cteSuccessAfter csa + inner join msdb.dbo.sysjobs sj + ON sj.job_id = csa.job_id +WHERE RunDateTime > DATEADD(HOUR, -24, SYSDATETIME()) + + +*/ \ No newline at end of file From 09462f07ca57063f68d002a2117525ff7c08584c Mon Sep 17 00:00:00 2001 From: Dan Denney Date: Thu, 25 Apr 2019 13:35:53 -0700 Subject: [PATCH 2/9] RunBook Include RDL --- RunBook/Run Book Details.rdl | 3343 ++++++++++++++++++++++++++++++++++ RunBook/Run Book.rdl | 1334 ++++++++++++++ 2 files changed, 4677 insertions(+) create mode 100644 RunBook/Run Book Details.rdl create mode 100644 RunBook/Run Book.rdl diff --git a/RunBook/Run Book Details.rdl b/RunBook/Run Book Details.rdl new file mode 100644 index 0000000..aeacb4a --- /dev/null +++ b/RunBook/Run Book Details.rdl @@ -0,0 +1,3343 @@ + + + 0 + + + /Data Sources/THSQL1DataMartDev + None + 178ac664-42ce-49f6-bcc9-10ddd18977fd + + + + + + dsDMDev + SELECT di.InstanceName + ,di.Environment + ,di.ServerUse + ,RIGHT(di.SQLEdition, LEN(di.SQLEdition) - 21) AS SQLEdition + ,di.SQLVersion + ,di.Comments + ,di.LastRestarted + ,di.LastCheckDateTime + ,unhealthyDatabase.UnhealthyDatabaseCnt + ,alerts.AlertCnt + ,failedBackups.BackupCnt + ,failedJobs.JobCnt + ,ISNULL(failedJobs.SuccessAfterCnt,0) AS SuccessAfterCnt + ,MemDmp.MemoryDmpCnt + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +FROM Sys_Admin.RunBook.DatabaseInstances di + CROSS APPLY + (SELECT COUNT(*) AS UnhealthyDatabaseCnt + FROM Sys_Admin.RunBook.UnhealthyDatabases ud + WHERE ud.CheckDateTime = di.LastCheckDateTime + and ud.InstanceName = di.InstanceName + ) unhealthyDatabase + CROSS APPLY + (SELECT COUNT(*) AS AlertCnt + FROM Sys_Admin.RunBook.Alerts a + WHERE a.CheckDateTime = di.LastCheckDateTime + AND a.InstanceName = di.InstanceName + ) alerts + CROSS APPLY + (SELECT COUNT(*) AS BackupCnt + FROM Sys_Admin.RunBook.FailedBackups fb + WHERE fb.CheckDateTime = di.LastCheckDateTime + AND fb.InstanceName = di.InstanceName + ) failedBackups + CROSS APPLY + (SELECT COUNT(*) AS JobCnt + ,SUM(CASE WHEN fj.RanSuccessfulAfter = 1 THEN 1 ELSE 0 END) AS SuccessAfterCnt + FROM Sys_Admin.RunBook.FailedJobs fj + WHERE fj.CheckDateTime = di.LastCheckDateTime + AND fj.InstanceName = di.InstanceName + ) failedJobs + CROSS APPLY + (SELECT COUNT(*) AS MemoryDmpCnt + FROM Sys_Admin.RunBook.MemoryDumps md + WHERE md.CheckDateTime = di.LastCheckDateTime + AND md.InstanceName = di.InstanceName + ) MemDmp +WHERE di.IsActive = 1; + + + + InstanceName + System.String + + + Environment + System.String + + + ServerUse + System.String + + + LastRestarted + System.DateTime + + + LastCheckDateTime + System.DateTime + + + SQLEdition + System.String + + + SQLVersion + System.String + + + UnhealthyDatabaseCnt + System.Int32 + + + Comments + System.String + + + AlertCnt + System.Int32 + + + BackupCnt + System.Int32 + + + JobCnt + System.Int32 + + + MemoryDmpCnt + System.Int32 + + + SuccessAfterCnt + System.Int32 + + + GroupOrder + System.Int32 + + + + + + dsDMDev + +select di.InstanceName + ,di.Environment + ,ud.DatabaseName + ,ud.DatabaseState + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +from Sys_Admin.RunBook.UnhealthyDatabases ud + INNER JOIN Sys_Admin.RunBook.DatabaseInstances di + ON di.InstanceName = ud.InstanceName + AND di.LastCheckDateTime = ud.CheckDateTime + + + + InstanceName + System.String + + + Environment + System.String + + + DatabaseName + System.String + + + DatabaseState + System.String + + + GroupOrder + System.Int32 + + + + + + dsDMDev + +SELECT di.InstanceName + ,di.Environment + ,a.AlertName + ,a.AlertDateTime + ,'Message Id: ' + CAST(a.MessageId as VARCHAR(100)) + ', Severity: ' + CAST(a.Severity AS VARCHAR(100)) AS ErrorNbr + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +from Sys_Admin.RunBook.Alerts a + INNER JOIN Sys_Admin.RunBook.DatabaseInstances di + ON di.InstanceName = a.InstanceName + AND di.LastCheckDateTime = a.CheckDateTime + + + + InstanceName + System.String + + + Environment + System.String + + + AlertName + System.String + + + AlertDateTime + System.DateTime + + + ErrorNbr + System.String + + + GroupOrder + System.Int32 + + + + + + dsDMDev + +select di.InstanceName + ,di.Environment + ,fb.DatabaseName + ,fb.LastFullBackup + ,fb.LastDiffBackup + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +from Sys_Admin.RunBook.FailedBackups fb + INNER JOIN Sys_Admin.RunBook.DatabaseInstances di + ON di.InstanceName = fb.InstanceName + AND di.LastCheckDateTime = fb.CheckDateTime + + + + InstanceName + System.String + + + Environment + System.String + + + DatabaseName + System.String + + + LastFullBackup + System.DateTime + + + LastDiffBackup + System.DateTime + + + GroupOrder + System.Int32 + + + + + + dsDMDev + select di.InstanceName + ,di.Environment + ,fj.JobName + ,fj.RunDateTime + ,fj.RanSuccessfulAfter + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +from Sys_Admin.RunBook.FailedJobs fj + INNER JOIN Sys_Admin.RunBook.DatabaseInstances di + ON di.InstanceName = fj.InstanceName + AND di.LastCheckDateTime = fj.CheckDateTime + + + + InstanceName + System.String + + + Environment + System.String + + + JobName + System.String + + + RunDateTime + System.DateTime + + + RanSuccessfulAfter + System.Boolean + + + GroupOrder + System.Int32 + + + + + + dsDMDev + +select di.InstanceName + ,di.Environment + ,md.MemoryDumpDateTime + ,CASE + WHEN di.Environment = 'Prod' THEN 1 + WHEN di.Environment = 'Test' THEN 2 + WHEN di.Environment = 'Dev' THEN 3 + WHEN di.Environment = 'DR' THEN 4 + ELSE 5 + END AS GroupOrder +from Sys_Admin.RunBook.MemoryDumps md + INNER JOIN Sys_Admin.RunBook.DatabaseInstances di + ON di.InstanceName = md.InstanceName + AND di.LastCheckDateTime = md.CheckDateTime + + + + InstanceName + System.String + + + Environment + System.String + + + MemoryDumpDateTime + System.DateTime + + + GroupOrder + System.Int32 + + + + + + + + + + true + true + + + + + Run Book + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.69915in + + + 1.14584in + + + 1.82291in + + + 0.85416in + + + 0.60417in + + + 0.66667in + + + 0.5625in + + + 0.625in + + + + + 0.41667in + + + + + true + true + + + + + Instance Name + + + + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Server Use + + + + + + + Textbox3 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Restarted + + + + + + + Textbox15 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Unhealthy Databases + + + + + + + Textbox17 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Alerts + + + + + + + Textbox19 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Missing Backups + + + + + + + Textbox21 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Failed Jobs + + + + + + + Textbox23 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Memory Dumps + + + + + + + Textbox25 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!InstanceName.Value + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!ServerUse.Value + + + + + + + ServerUse + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!LastRestarted.Value + + + + + + + LastRestarted + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!UnhealthyDatabaseCnt.Value + + + + + + + UnhealthyDatabaseCnt + + + + txtUnhealthy + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!AlertCnt.Value + + + + + + + AlertCnt + + + + txtAlerts + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!BackupCnt.Value + + + + + + + BackupCnt + + + + txtBackups + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!JobCnt.Value-Fields!SuccessAfterCnt.Value + + + + + + + JobCnt + + + + txtJobs + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!MemoryDmpCnt.Value + + + + + + + MemoryDmpCnt + + + + txtMemory + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + Instance + 0.46944in + 0.11333in + 0.66667in + 9.66791in + 1 + + + + + + true + true + + + + + =Format(Globals!ExecutionTime,”MMM-dd-yyyy”) + + + + + + + Textbox28 + 6.21875in + 0.4in + 3.56249in + 2 + + + Bottom + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.69915in + + + 2.67708in + + + 1.40625in + + + + + 0.25in + + + + + true + true + + + + + Instance Name + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Database Name + + + + + + + Textbox31 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Database State + + + + + + + Textbox33 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!InstanceName.Value + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!DatabaseName.Value + + + + DatabaseName + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!DatabaseState.Value + + + + DatabaseState + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + UnhealthyDB + 1.70708in + 0.11333in + 0.5in + 7.46999in + 3 + + + + + + true + true + + + + + Unhealthy Databases + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.78125in + + + 1.57292in + + + 1.92708in + + + + + 0.25in + + + + + true + true + + + + + Alert Name + + + + + + + Textbox42 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Alert Date Time + + + + + + + Textbox46 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Error Nbr + + + + + + + Textbox48 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!AlertName.Value + + + + AlertName + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!AlertDateTime.Value + + + + AlertDateTime + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!ErrorNbr.Value + + + + ErrorNbr + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 2.69915in + + + true + true + + + + + Instance Name + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + =Fields!InstanceName.Value + + + + + =Fields!InstanceName.Value + + + + 2.69915in + + + true + true + + + + + =Fields!InstanceName.Value + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + Alerts + 2.56472in + 0.11333in + 0.5in + 9.66791in + 5 + + + + + + true + true + + + + + SQL Server Alerts + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.40625in + + + 1.94792in + + + 2.05207in + + + + + 0.25in + + + + + true + true + + + + + Database Name + + + + + + + Textbox53 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Full Backup + + + + + + + Textbox55 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Diff Backup + + + + + + + Textbox59 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!DatabaseName.Value + + + + DatabaseName1 + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!LastFullBackup.Value + + + + LastFullBackup + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!LastDiffBackup.Value + + + + LastDiffBackup + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 2.69915in + + + true + true + + + + + Instance Name + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + =Fields!InstanceName.Value + + + + + =Fields!InstanceName.Value + + + + 2.69915in + + + true + true + + + + + =Fields!InstanceName.Value + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + Backups + 3.49181in + 0.11333in + 0.5in + 9.7929in + 7 + + + + + + true + true + + + + + No Backups in Last 24 hours + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 3.26042in + + + 1.80208in + + + 1.21875in + + + + + 0.41667in + + + + + true + true + + + + + Job Name + + + + + + + Textbox68 + + + WhiteSmoke + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Run Date + + + + + + + Textbox70 + + + WhiteSmoke + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Ran Successful After + + + + + + + Textbox76 + + + WhiteSmoke + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!JobName.Value + + + + JobName + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!RunDateTime.Value + + + + RunDateTime + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!RanSuccessfulAfter.Value + + + + + + + RanSuccessfulAfter + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + WhiteSmoke + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + 2.69915in + + + true + true + + + + + Instance Name + + + + + + WhiteSmoke + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + =Fields!InstanceName.Value + + + + + =Fields!InstanceName.Value + + + + 2.69915in + + + true + true + + + + + =Fields!InstanceName.Value + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + Jobs + 4.48833in + 0.11333in + 0.66667in + 9.66791in + 9 + + + + + + true + true + + + + + Failed Jobs + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.69915in + + + 2.26042in + + + + + 0.25in + + + + + true + true + + + + + Instance Name + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Memory Dump Date + + + + + + + Textbox81 + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!InstanceName.Value + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!MemoryDumpDateTime.Value + + + + MemoryDumpDateTime + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + WhiteSmoke + 2pt + 2pt + 2pt + 2pt + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + MemoryDumps + 5.72792in + 0.11333in + 0.5in + 5.64708in + 11 + + + + + + true + true + + + + + Memory Dumps + + + + + + 2pt + 2pt + 2pt + 2pt + + + + 6.35292in + + + + + 10.65625in + + + 0.45in + true + true + + + true + true + + + + + =Globals!ExecutionTime + + + + ExecutionTime + 0.06944in + 0.11333in + 0.25in + 2in + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0in + 8.5in + 1in + 1in + 1in + 1in + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.69915in + + + 1.14584in + + + 1.82291in + + + 0.85416in + + + 0.60417in + + + 0.66667in + + + 0.5625in + + + 0.625in + + + + + 0.41667in + + + + + true + true + + + + + Instance Name + + + + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Server Use + + + + + + + Textbox3 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Last Restarted + + + + + + + Textbox15 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Unhealthy Databases + + + + + + + Textbox17 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Alerts + + + + + + + Textbox19 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Missing Backups + + + + + + + Textbox21 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Failed Jobs + + + + + + + Textbox23 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Memory Dumps + + + + + + + Textbox25 + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.25in + + + + + true + true + + + + + =Fields!InstanceName.Value + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!ServerUse.Value + +Switch( + IsNothing(Fields!IsCurrentPrimary.Value), "", + Fields!IsCurrentPrimary.Value = true, " (Primary)", + Fields!IsCurrentPrimary.Value = false, " (Secondary)", + true, "" + ) + + + + + + + ServerUse + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!LastRestarted.Value + + + + + + + LastRestarted + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!UnhealthyDatabaseCnt.Value + + + + + + + UnhealthyDatabaseCnt + + + + txtUnhealthy + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!AlertCnt.Value + + + + + + + AlertCnt + + + + txtAlerts + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!BackupCnt.Value + + + + + + + BackupCnt + + + + txtBackups + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!JobCnt.Value-Fields!SuccessAfterCnt.Value + + + + + + + JobCnt + + + + txtJobs + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!MemoryDmpCnt.Value + + + + + + + MemoryDmpCnt + + + + txtMemory + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + + + 0.68751in + + + true + true + + + + + + + + + + + Gainsboro + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + After + + + + + =Fields!GroupOrder.Value + + + + + =Fields!GroupOrder.Value + + + + 0.68751in + + + true + true + + + + + =Fields!Environment.Value + + + + + + =Iif(Fields!Environment.Value="Prod","No Color", "WhiteSmoke") + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + Instance + 0.46944in + 0.11333in + 0.66667in + 9.66791in + 1 + + + + + + true + true + + + + + =Format(First(Fields!CheckDateTime.Value, "CheckDate"),”MMM-dd-yyyy”) + + + + + + + Textbox28 + 6.21875in + 0.4in + 3.56249in + 2 + + + Bottom + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Click here to view details + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + ="Server statistics update as of " + CStr(First(Fields!CheckDateTime.Value, "CheckDate")) + + + + + + + Textbox4 + 1.23833in + 4.64583in + 0.25in + 5.13541in + 4 + + + 2pt + 2pt + 2pt + 2pt + + + + 1.61334in + + + + + 10.04167in + + 0in + 8.5in + 1in + 1in + 1in + 1in +