angle-left

Усечение файлов журналов транзакций MS SQL

Постановка проблемы

По разным причинам (например произведенной ранее реиндексацией rebuild index) может случиться, что операция Shrink Database или Shrink file не освобождают дисковое пространство занимаемое файлами журналов транзацкий (transaction log) даже после операций резервного копирования с включением усечение журнала транзакций (truncate log) в полной модели восстановления (recovery model full).
 
Усечение возможно только после достижения контрольной точки. в описанной постановке задачи требовалось сократить всеми средствами и силами занимаемый базами данных размер на файловой системе, с минимизацией рисков потери/порчи данных и простоях системы. 
 

Необходимые действия

Переключение модели восстановления (Recovery Model) на ходу возможно, только в случае выполнения необходимо подойти к задаче по уму, понимая чем может обернуться переключение, и в выбранное время выполнить рекомендации:
 - выполнитьрезервную копию журнала транзакций transaction log
 - перевести базу данных в readonly (снизить риски)
 
 Далее необходимо переключить модель восстановления базы данных в Simple (внимание, на этом шаге выполняется критическое изменение).
 После перевода, уже не актуальный файл журналов транзакций можно "зарезать" с помощью DBCC SHRINKFILE, например, до 1 МБ.
  DBCC SHRINKFILE (databasename, 1)
  Далее возвращаем обратно модель восстановления базы данных (Full), переводим базу в Read/Write. 
  

 Комманды для выполнения описанных действий

USE databasename ;  
ALTER DATABASE databasename SET READ_ONLY
BACKUP LOG databasename to DISK = 'Backup storage\databasename.trn';
ALTER DATABASE databasename SET RECOVERY Simple ;
DBCC SHRINKFILE (databasename_log, 1)
ALTER DATABASE databasename SET RECOVERY FULL ;
ALTER DATABASE databasename SET READ_WRITE

Вместо эпилога

  В конце заметки хочу отметить, что необходимость операции Shrink database является спорной [1][2][3][4][5][6][7]..., а предложенный в заметке путь со сменой модели восстановления для некоторых дикостью. Я не агитирую за "Красную Армию", а привожу возможное решение конкретной поставленной задачи сокращения "несокращаемых" maintenance операциями файлов журналов транзакций.