Вот код, который я использую для выполнения этой операции, чтобы сжать журналы в базах данных, начиная с 'MPS_', которые являются простым восстановлением. Это можно установить как план обслуживания задачи выполнения SQL и запланировать соответствующим образом. Текущий код сокращает журнал до 1 ГБ, что делает нас достойными, чтобы избежать фрагментации диска.
Обратите внимание, что это все изменчивые базы данных. Никогда не делайте этого с производственными базами данных, если вы действительно не знаете, что делаете. Кроме того, не просто делает это для каждой простой базы данных модели восстановления. Несколько системных баз данных (master
, для одной) просты для восстановления!
use [master]
set nocount on
declare @name sysname,
@file_id int,
@sqlcmd varchar(max)
DECLARE db_mps_simple_logs_cur CURSOR FOR
select d.name, mf.file_id
from sys.databases d
join sys.master_files mf
on d.database_id = mf.database_id
where d.[name] like 'MPS_%'
and d.recovery_model = 3 --simple only
and mf.type = 1 --0 is data, 1 is log
open db_mps_simple_logs_cur
fetch next from db_mps_simple_logs_cur into @name, @file_id
while @@fetch_status = 0 begin
set @sqlcmd = 'use ' + QUOTENAME(@name) + '; checkpoint; dbcc shrinkfile ( ' + cast(@file_id as varchar) + ', 1024 );'
exec ( @sqlcmd )
fetch next from db_mps_simple_logs_cur into @name, @file_id
end
close db_mps_simple_logs_cur
deallocate db_mps_simple_logs_cur
go
Вот хорошая команда, которая покажет текущий размер журнала транзакций для баз данных с простой моделью восстановления, чтобы вы могли легко увидеть результаты:
select
d.database_id,
d.name,
d.recovery_model_desc,
mf.name [file_name],
mf.size * 8 / 1024 [size_in_mb],
d.log_reuse_wait_desc
from sys.databases d
join sys.master_files mf
on d.database_id = mf.database_id
where d.[name] like 'MPS_%'
and d.recovery_model = 3 --simple only
and mf.type = 1 --0 is data, 1 is log
order by mf.size desc