forked from Tavalik/SQL_TScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathПростая_модель_и_сжатие_лога_нескольких_БД.sql
115 lines (102 loc) · 5.81 KB
/
Простая_модель_и_сжатие_лога_нескольких_БД.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
-------------------------------------------
-- Скрипт переводит базы данных в простую модель восстановления и запускает сжатие файла журнала транзакций
-- (для экономии места на тестовых базах)
-- Алгоритм работы:
-- 1. Отбираются базы данных по задаваемому условнию
-- 2. Каждая из базы данных:
-- 2.1 Переводится в простую модель восстановления
-- 2.2 Сжимается файл журнала транзакций
-- 3. Отправляется электронное сообщение о результате работы с использованием настроенного почтового профиля
-- Автор: Онянов Виталий (Tavalik.ru)
-- Версия от 10.02.2018
-- Свежие версии скриптов: https://github.com/Tavalik/SQL_TScripts
---------------------------------------------
-- НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ
-- Условие для выборки, '%' - все базы данных
DECLARE @namelike varchar(100) = '%fto%'
-- Имя почтового профиля, для отправки электонной почты
DECLARE @profilename as nvarchar(100) = 'ОсновнойПрофиль'
-- Получатели сообщений электронной почты, разделенные знаком ";"
DECLARE @recipients as nvarchar(500) = '[email protected]'
-------------------------------------------
-- СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ
DECLARE @SQLString NVARCHAR(4000)
DECLARE @DBName varchar(100)
DECLARE @DBLogName varchar(100)
DECLARE @subject as NVARCHAR(1000) = ''
DECLARE @finalmassage as NVARCHAR(4000) = ''
-------------------------------------------
-- ТЕЛО СКРИПТА
-- Отберем базы для выполнения операций
DECLARE DBcursor CURSOR FOR
(
SELECT
t_Name.name as DatabaseName,
t_LogName.name as DatabaseLogName
FROM sys.databases as t_Name
Inner join sys.master_files as t_LogName
on t_Name.database_id = t_LogName.database_id
WHERE t_Name.database_id > 4
AND t_Name.state_desc = 'ONLINE' -- база должна быть в сети
AND t_Name.name like @namelike -- база должна содержать указанное слово
AND t_LogName.type = 1
)
-- Цикл по всем базам, попавшим в выборку
OPEN DBcursor
FETCH NEXT FROM DBcursor INTO @DBName, @DBLogName
WHILE @@FETCH_STATUS = 0
BEGIN
-- Переводим базы в простую модель восстановления
SET @SQLString = 'ALTER DATABASE ' + @DBName + ' SET RECOVERY SIMPLE WITH NO_WAIT;'
PRINT @SQLString
BEGIN TRY
EXEC sp_executesql @SQLString
END TRY
BEGIN CATCH
-- Ошбика выполнения операции
SET @finalmassage = @finalmassage + 'ОШИБКА перевода базы данных ' + @DBName + ' в простую модель восстановоления ' + CHAR(13) + CHAR(13)
+ 'Код ошибки: ' + CAST(ERROR_NUMBER() as nvarchar(10)) + CHAR(13) + CHAR(13)
+ 'Текст ошибки: ' + ERROR_MESSAGE() + CHAR(13) + CHAR(13)
+ 'Текст T-SQL:' + CHAR(13) + @SQLString + CHAR(13) + CHAR(13)
END CATCH;
-- Запускаем сжатие лога базы данных
SET @SQLString = 'USE [' + @DBName + ']; DBCC SHRINKFILE(' + @DBLogName + ', 0, truncateonly);'
PRINT @SQLString
BEGIN TRY
EXEC sp_executesql @SQLString
END TRY
BEGIN CATCH
-- Ошбика выполнения операции
SET @finalmassage = @finalmassage + 'ОШИБКА сжатия базы данных ' + @DBName + ' в простую модель восстановоления ' + CHAR(13) + CHAR(13)
+ 'Код ошибки: ' + CAST(ERROR_NUMBER() as nvarchar(10)) + CHAR(13) + CHAR(13)
+ 'Текст ошибки: ' + ERROR_MESSAGE() + CHAR(13) + CHAR(13)
+ 'Текст T-SQL:' + CHAR(13) + @SQLString + CHAR(13) + CHAR(13)
END CATCH;
-- Следующий элемент цикла
FETCH NEXT FROM DBcursor
INTO @DBName, @DBLogName
END
CLOSE DBcursor;
DEALLOCATE DBcursor;
-- Формируем сообщение об успешном или не успешном выполнении операций
IF @finalmassage = ''
BEGIN
-- Успешное выполнение всех операций
SET @subject = 'Успешное выполнение операций с базами данных '
SET @finalmassage = 'Успешный перевод в простую модель восстановления и сжатие файла журнала транзакций'
END
ELSE
-- Были ошибки
SET @subject = 'БЫЛИ ОШИБКИ при выполненит операций с базами данных '
-- Если задан профиль электронной почты, отправим сообщение
IF @profilename <> ''
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profilename,
@recipients = @recipients,
@body = @finalmassage,
@subject = @subject;
-- Выводим сообщение о результате
SELECT
@subject as subject,
@finalmassage as finalmassage
GO