@Charrus

Как автоматически уменьшать лог транзакций?

Приветствую, коллеги.
Количество баз на обоих серверах MSSQL(2012) стремительно растет и все чаще мне приходится отвлекаться на подрезку логов.

Для всех баз данных у меня задан максимальный размер лога, поскольку используется тонкое выделение дисковых емкостей на виртуалях (исторически сложилось: админу, который это сделал, больше не наливают)
Написал страшный скрипт (не допер как вызывать процедуру отдавая ей переменные), но запускать на боевых серверах боюся
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, @size)'
	Set @qu=@qu + ' ALTER DATABASE [' + @name + ']  SET RECOVERY FULL'
	Exec (@qu) 
	Set @qu = '' 
	fetch next from icur into @name
END
close icur
deallocate icur

Я знаю, что согласно инструкции Мелкомягких при создании резервной копии из LOG удаляются завершенные транзакции, а потом SQL должен писать в освободившееся пространство новые транзакции, но всё равно растет и мне постоянно приходится уменьшать размер командой DBCC SHRINKFILE.
Recovery для баз у меня FULL, поэтому логи бекапятся в комплекте с самими таблицами, и необходимости отдельно бекапить лог у меня нет, да и некуда. Автоприрост включен, с небольшим шагом.

Так вот коллеги, как вы решаете этот вопрос с сильно разрастающмися логами? И как правильно? Может есть какая-то настройка или рекомендуемый алгоритм?
  • Вопрос задан
  • 565 просмотров
Пригласить эксперта
Ответы на вопрос 2
unfilled
@unfilled
Вы делаете очень странную вещь - бэкапите логи, потом переводите БД в симпл, ломаете цепочку восстановления и возвращаетесь обратно в полную модель восстановления.
Вы не сможете нормально воспользоваться своими бэкапами журнала транзакций после перевода в простую модель восстановления.
Если вы хотите всё-таки использовать полную модель восстановления и иметь возможность восстановления на любой момент времени - делайте резервные копии журнала транзакций чаще и после того, как копия снята делайте DBCC SHRINKFILE без перехода в симпл.
Если это не помогает - смотрите log_reuse_wait_desc в sys.databases - что именно мешает обрезать файл.
Не забывайте, что на время приращения журнала транзакций, БД переходит в режим "только для чтения" - формально, конечно, ничего никуда не переходит, просто все операции записи ждут пока ЖТ вырастет.
Ответ написан
Комментировать
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы