SQL: Shrink: Cannot shrink log file because the logical log file located at the end of the file is in use.

5-paź-2014

Dysk z logiem pełny. Logi pełne. Pliki loga posadowione już na dwóch dyskach. Trzeba zwolnić trochę miejsca

Zaczynasz od

select name, log_reuse_wait_desc from sys.databases

Druga kolumna  zwraca informację o tym, co powoduje przepełnienie loga. W moim przypadku było dość standardowo LOG_BACKUP. Oznacza to, że w pierwszej kolejności należy zwolnić miejsce przez wykonanie bakupu loga. Jest to konieczne, gdy baza pracuje w recovery modelu full, a na systemach produkcyjnych tak jest najczęściej.

Po backupie loga, widać już, że w logu jest sporo wolnego miejsca:

USE db_name
dbcc SQLperf(logspace)
No to można shrinkować plik loga:
USE db_name
GO
DBCC SHRINKFILE (N’LogFileName’ , 10240)
GO

A tu niespodzianke. Log się nie skurczył a jeszcze pojawia się komunikat:

Cannot shrink log file <…>  because the logical log file located at the end of the file is in use.

Porady na forach zazwyczaj zalecają przełączenie bazy w recovery model simple, co wyrzuci z loga niebackupowane transakcje i zupełnie przebuduje jego strukturę, a potem powrót  do modelu full. Ale to raczej nie tędy droga. System jest produkcyjny i nie należy przełączać modelu na simple, a na dodatek w moim przypadku… baza pracowała w mirroringu.

Wczytaj się w komunikat. Shrinkować nie można, bo aktywna część loga jest na końcu pliku… Więc może przesuniemy ten „logical log file”. To proste. Wygeneruj po prostu kilka pustych „dummy” transakcji:

 create table tabtodelete
(id int identity primary key,
x char(10))
GO
–100-krotny insert
insert tabtodelete values(’x’)
GO 100
drop table tabtodelete

I gotowe! Teraz shrink zadziałał od razu!

 

Komentarze są wyłączone

Autor: Rafał Kraik