2014-05-23 9 views
10

Mam bardzo dużą bazę danych (50 GB). Aby zwolnić miejsce na dysku twardym, próbowałem usunąć stare rekordy z jednej z tabel. Pobiegłem polecenia:Serwer Sql - rejestracja jest pełna z powodu ACTIVE_TRANSACTION

delete from Table1 where TheDate<'2004-01-01'; 

Jednak SQL Server 2012 powiedział:

Msg 9002, Level 17, State 4, Line 1 
The transaction log for database 'MyDb' is full due to 'ACTIVE_TRANSACTION'. 

i nie usuwać rzeczy. Co oznacza ta wiadomość? Jak mogę usunąć rekordy?

+0

Mały;) Niezbyt duży. Zdecydowanie NIE są one duże, o ile mieszczą się w pamięci serwera o średnim zasięgu. – TomTom

Odpowiedz

3

Ponowne uruchomienie programu SQL Server spowoduje wyczyszczenie obszaru dziennika używanego przez bazę danych. Jeśli jednak nie jest to możliwe, można spróbować wykonać następujące czynności:

* Issue a CHECKPOINT command to free up log space in the log file. 

* Check the available log space with DBCC SQLPERF('logspace'). If only a small 
    percentage of your log file is actually been used, you can try a DBCC SHRINKFILE 
    command. This can however possibly introduce corruption in your database. 

* If you have another drive with space available you can try to add a file there in 
    order to get enough space to attempt to resolve the issue. 

nadzieję, że pomoże Ci w znalezieniu rozwiązania.

+0

DBCC SQLPERF ("logspace") pokaże Ci "Log Size (MB)" i "Log Space Used (%)". Należy pamiętać, że rozmiar dziennika nie wskazuje faktycznego rozmiaru zapisanych dzienników, ale rozmiar pliku dziennika na dysku. Aby uzyskać prawdziwy rozmiar logu MB, pomnóż dwie kolumny. Np. Rozmiar dziennika wynoszący 2,00 MB i 70% używane oznacza, że ​​masz 1,4 MB danych dziennika. – brentlightsey

8

Oto, co zrobiłem, aby obejść błąd.

Najpierw skonfigurowałem model odzyskiwania bazy danych jako PROSTY. Więcej informacji: here.

Następnie, usuwając niektóre stare pliki, udało mi się zrobić 5 GB wolnego miejsca, co dało plikowi więcej miejsca do powiększenia.

Polecenie DELETE powiodło się bez żadnego ostrzeżenia.

Myślałem, że po uruchomieniu instrukcji DELETE baza danych będzie się natychmiast zmniejszać, zwalniając miejsce na dysku twardym. Ale to nie była prawda. Przestrzeń uwolniony po DELETE nie jest zwracana do systemu operacyjnego inmediatedly chyba uruchom następujące polecenie:

DBCC SHRINKDATABASE (MyDb, 0); 
GO 

więcej informacji na temat tego polecenia here.