@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, поэтому логи бекапятся в комплекте с самими таблицами, и необходимости отдельно бекапить лог у меня нет, да и некуда. Автоприрост включен, с небольшим шагом.

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

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

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 17:14
4000 руб./за проект
29 мар. 2024, в 17:04
5000 руб./за проект
29 мар. 2024, в 17:03
3000 руб./за проект