-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCreateMaintenancePlans.sql
364 lines (311 loc) · 10.4 KB
/
CreateMaintenancePlans.sql
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
/*
Данный T-SQL сценарий предназанчен для создания планов обслуживания
по заданной в параметрах базе данных, размещаемой на текущем сервере
или с реплицируемыми таблицами на нескольких.
После выполнения будут созданы планы обслуживания:
- обновления статистики таблиц;
- дефрагментации индексов;
- реиндексации таблиц.
Разработчик: Александр Гелета <[email protected]>
*/
USE [msdb]; -- не трогать!
GO
/*
Перед созданием планов обслуживания необходимо
разрешить из выполнение, что мы и делаем. Активируем
расширенные возможности хранение процедур и включаем
агент XPs.
*/
DECLARE @_advanced_ops AS sql_variant;
SELECT
@_advanced_ops = value
FROM
sys.configurations
WHERE
name = 'show advanced options'
IF (@_advanced_ops <> 1)
BEGIN
PRINT N'Включение расширенных опций хранимых процедур...'
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
END
DECLARE @_xps_enable AS sql_variant;
SELECT
@_xps_enable = value
FROM
sys.configurations
WHERE
name = 'Agent XPs'
IF (@_xps_enable <> 1)
BEGIN
PRINT N'Активация Agent XPs...'
EXEC sp_configure 'Agent XPs', 1
RECONFIGURE
END
/*===========================================================================*/
/*
Ввиду того, что далее будет вызываться большое количество
блоков кода, будет удобным использовать временную таблицу
для хранения значений параметров планов обслуживания.
*/
IF EXISTS
(SELECT * FROM sys.sysobjects WHERE name = '_variables' and xtype = 'U')
DROP TABLE _variables
GO
CREATE TABLE _variables (
variable VARCHAR(40) PRIMARY KEY,
value VARCHAR(255)
)
GO
INSERT INTO _variables (variable, value) VALUES
('dbName', 'AdventureWorks2014'), -- имя базы данных
('statsStartTime', '180000'), -- время начала обновления статистики
('statsFreqInterval', '1'), -- частота обновления статистики в днях
('defragStartTime', '200000'), -- время начала дефрагментации индексов
('defragFreqInterval', '1'), -- частота дефрагментации в днях
('reindexStartTime', '220000'), -- время начала реиндексации таблиц
('reindexFreqInterval', '1') -- частота реиндексации таблиц в днях
GO
/*===========================================================================*/
/*
Создание плана обслуживания для обновления статистики
таблиц по выбранной базе данных.
Внимание: следующий блок кода не рекоммендуется изменять во избежании
возникновения непредвиденных ошибок в работе СУБД, что может повлечь за
собой нарушение целостности или утрату данных.
*/
PRINT N'Создание задачи обновления статистики...'
DECLARE @_dbName AS VARCHAR(40) =
(SELECT value FROM _variables WHERE variable = 'dbName')
DECLARE @_job_name AS VARCHAR(40) = @_dbName + '_stats_update';
DECLARE @_job_id BINARY(16);
SELECT @_job_id = job_id FROM msdb.dbo.sysjobs WHERE name = @_job_name
IF (@_job_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_job
@job_id = @_job_id;
END
EXEC dbo.sp_add_job
@job_name = @_job_name,
@enabled = 1,
@description = N'Updates all table statistics.';
EXEC dbo.sp_add_jobserver
@job_name = @_job_name;
DECLARE @_command AS NVARCHAR(MAX) =
N'USE [' + @_dbName + '];' +
'EXEC sp_msforeachtable N''UPDATE STATISTICS ? WITH FULLSCAN'';' +
'DBCC FREEPROCCACHE'
EXEC dbo.sp_add_jobstep
@job_name = @_job_name,
@step_name = N'Update all stats for each table in associated database.',
@subsystem = N'TSQL',
@command = @_command,
@database_name = @_dbName,
@retry_attempts = 5,
@retry_interval = 5;
DECLARE @_schedule_name AS VARCHAR(80) = @_job_name + '_schedule';
DECLARE @_schedule_id AS INT;
SELECT
@_schedule_id = schedule_id
FROM
sysschedules
WHERE
name = @_schedule_name
IF (@_schedule_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_schedule
@schedule_id = @_schedule_id;
END
DECLARE @_active_start_time AS INT =
(
SELECT
CAST(value AS INT)
FROM
_variables
WHERE
variable = 'statsStartTime'
)
DECLARE @_freq_interval AS INT =
(
SELECT
CAST(value as INT)
FROM
_variables
WHERE
variable = 'statsFreqInterval'
)
EXEC dbo.sp_add_schedule
@schedule_name = @_schedule_name,
@freq_type = 4,
@freq_interval = @_freq_interval,
@active_start_time = @_active_start_time;
EXEC sp_attach_schedule
@job_name = @_job_name,
@schedule_name = @_schedule_name;
GO
/*===========================================================================*/
/*
Создание плана обслуживания для дефрагментации
таблиц по выбранной базе данных.
Внимание: следующий блок кода не рекоммендуется изменять во избежании
возникновения непредвиденных ошибок в работе СУБД, что может повлечь за
собой нарушение целостности или утрату данных.
*/
PRINT N'Создание задачи дефрагментации индексов...'
DECLARE @_dbName AS VARCHAR(40) =
(SELECT value FROM _variables WHERE variable = 'dbName')
DECLARE @_job_name AS VARCHAR(40) = @_dbName + '_index_defrag';
DECLARE @_job_id BINARY(16);
SELECT @_job_id = job_id FROM msdb.dbo.sysjobs WHERE name = @_job_name
IF (@_job_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_job
@job_id = @_job_id;
END
EXEC dbo.sp_add_job
@job_name = @_job_name,
@enabled = 1,
@description = N'Permorms defragmentation of all indexes in database.';
EXEC dbo.sp_add_jobserver
@job_name = @_job_name;
DECLARE @_command AS NVARCHAR(MAX) =
N'USE [' + @_dbName + '];' +
FORMATMESSAGE(
'EXEC sp_msforeachtable N''DBCC INDEXDEFRAG (%s, ''''?'''')''',
@_dbName
)
EXEC dbo.sp_add_jobstep
@job_name = @_job_name,
@step_name = N'Perform indexes defragmentation in database for each table.',
@subsystem = N'TSQL',
@command = @_command,
@database_name = @_dbName,
@retry_attempts = 5,
@retry_interval = 5;
DECLARE @_schedule_name AS VARCHAR(80) = @_job_name + '_schedule';
DECLARE @_schedule_id AS INT;
SELECT
@_schedule_id = schedule_id
FROM
sysschedules
WHERE
name = @_schedule_name
IF (@_schedule_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_schedule
@schedule_id = @_schedule_id;
END
DECLARE @_active_start_time AS INT =
(
SELECT
CAST(value AS INT)
FROM
_variables
WHERE
variable = 'defragStartTime'
)
DECLARE @_freq_interval AS INT =
(
SELECT
CAST(value as INT)
FROM
_variables
WHERE
variable = 'defragFreqInterval'
)
EXEC dbo.sp_add_schedule
@schedule_name = @_schedule_name,
@freq_type = 4,
@freq_interval = @_freq_interval,
@active_start_time = @_active_start_time;
EXEC sp_attach_schedule
@job_name = @_job_name,
@schedule_name = @_schedule_name;
GO
/*===========================================================================*/
/*
Создание плана обслуживания для реиндексации
таблиц по выбранной базе данных.
Внимание: следующий блок кода не рекоммендуется изменять во избежании
возникновения непредвиденных ошибок в работе СУБД, что может повлечь за
собой нарушение целостности или утрату данных.
*/
PRINT N'Создание задачи реиндексации таблиц...'
DECLARE @_dbName AS VARCHAR(40) =
(SELECT value FROM _variables WHERE variable = 'dbName')
DECLARE @_job_name AS VARCHAR(40) = @_dbName + '_table_reindex';
DECLARE @_job_id BINARY(16);
SELECT @_job_id = job_id FROM msdb.dbo.sysjobs WHERE name = @_job_name
IF (@_job_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_job
@job_id = @_job_id;
END
EXEC dbo.sp_add_job
@job_name = @_job_name,
@enabled = 1,
@description = N'Recreates all indexes in target database.';
EXEC dbo.sp_add_jobserver
@job_name = @_job_name;
DECLARE @_command AS NVARCHAR(MAX) =
N'USE [' + @_dbName + '];' +
'EXEC sp_msforeachtable N''DBCC DBREINDEX (''''?'''')'''
EXEC dbo.sp_add_jobstep
@job_name = @_job_name,
@step_name = N'Perform reindexing of all tables in target database.',
@subsystem = N'TSQL',
@command = @_command,
@database_name = @_dbName,
@retry_attempts = 5,
@retry_interval = 5;
DECLARE @_schedule_name AS VARCHAR(80) = @_job_name + '_schedule';
DECLARE @_schedule_id AS INT;
SELECT
@_schedule_id = schedule_id
FROM
sysschedules
WHERE
name = @_schedule_name
IF (@_schedule_id IS NOT NULL)
BEGIN
EXEC dbo.sp_delete_schedule
@schedule_id = @_schedule_id;
END
DECLARE @_active_start_time AS INT =
(
SELECT
CAST(value AS INT)
FROM
_variables
WHERE
variable = 'reindexStartTime'
)
DECLARE @_freq_interval AS INT =
(
SELECT
CAST(value as INT)
FROM
_variables
WHERE
variable = 'reindexFreqInterval'
)
EXEC dbo.sp_add_schedule
@schedule_name = @_schedule_name,
@freq_type = 4,
@freq_interval = @_freq_interval,
@active_start_time = @_active_start_time;
EXEC sp_attach_schedule
@job_name = @_job_name,
@schedule_name = @_schedule_name;
GO
/*===========================================================================*/
/*
Удаляем временную таблицу с переменными по причине того,
что его содержимое нужно только в контексте выполнения
данного сценария.
*/
PRINT N'Удаление временной таблицы параметров...'
IF EXISTS
(SELECT * FROM sys.sysobjects WHERE name = '_variables' and xtype = 'U')
DROP TABLE _variables
GO