-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathRunBook.sql
More file actions
177 lines (159 loc) · 6.34 KB
/
Copy pathRunBook.sql
File metadata and controls
177 lines (159 loc) · 6.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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())
*/