Скрипт очистки логов всех баз MSSQL
Изначально статья была выложена на своём сервере https://ast-1c.kz/almasoft/?p=1443
Ничего сверхъестественного, но может кому пригодится:)
В процессе работы с сервером 1С, который в качестве сервера баз данных использует MSSQL сервер, очень часто приходится решать задачу по очистке логов базы. Сама по себе задача достаточно тривиальная и решается исполнением скрипта (при полной модели восстановления):
USE база_данных; GO -- Изменяем модель восстановления базы данных на SIMPLE. ALTER DATABASE база_данных SET RECOVERY SIMPLE; GO -- Обрезаем LOG файл до 1 мегабайта. DBCC SHRINKFILE (база_данных_log, 1); GO -- Возвращаем модель восстановления базы данных на FULL. ALTER DATABASE база_данных SET RECOVERY FULL; GO
либо же для базы использующей простой тип модели восстановления:
USE база_данных; GO -- Обрезаем LOG файл до 1 мегабайта. DBCC SHRINKFILE (база_данных_log, 1); GO
Всё, просто и хорошо, но вот если на сервере скажем 100 баз, писать такой скрипт для каждой в отдельности — это не очень приятное задание, да и времени уйдет предостаточно. А ещё есть одно неудобство — если в последствии будет добавлена очередная база, то Вы не должны забыть и для неё прописать отдельный скрипт. Очень часто базы добавляют программисты 1С, а вот слежение за состоянием сервера ложится на плечи системного администратора. Ну и тут главное не просмотреть этот момент. В общем не очень удобная штука.
Было принято решение написать универсальный скрипт, который бы сам определял все базы и в зависимости от модели их восстановления выполнял бы необходимые процедуры для обрезки файла лога. А вот и полученный скрипт:
Declare @name varchar(100) declare @qu as varchar(1200) declare icur cursor fast_forward for SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') --and recovery_model_desc = 'FULL' open icur fetch next from icur into @name While @@Fetch_Status = 0 Begin Set @qu='use [' + @name + '] Declare @logname varchar(64), @size int' Set @qu=@qu + ' Set @logname = (SELECT [name] FROM [sys].[database_files] where type_desc=''LOG'')' Set @qu=@qu + ' Set @size = (SELECT max_size FROM [sys].[database_files] where type_desc=''LOG'') * 0.7/128' Set @qu=@qu + ' ALTER DATABASE [' + @name + '] SET RECOVERY SIMPLE DBCC SHRINKFILE (@logname, 7)' Set @qu=@qu + ' ALTER DATABASE [' + @name + '] SET RECOVERY FULL' Exec (@qu) Set @qu = '' fetch next from icur into @name END close icur SELECT name FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') --and recovery_model_desc = 'SIMPLE' open icur fetch next from icur into @name While @@Fetch_Status = 0 Begin Set @qu='use [' + @name + '] Declare @logname varchar(64), @size int' Set @qu=@qu + ' Set @logname = (SELECT [name] FROM [sys].[database_files] where type_desc=''LOG'')' Set @qu=@qu + ' Set @size = (SELECT max_size FROM [sys].[database_files] where type_desc=''LOG'') * 0.7/128' Set @qu=@qu + ' ALTER DATABASE [' + @name + '] SET RECOVERY SIMPLE DBCC SHRINKFILE (@logname, 7)' Exec (@qu) Set @qu = '' fetch next from icur into @name END close icur deallocate icur DBCC SHRINKDATABASE (TEMPDB);
