„Dziennik transakcji bazy danych jest pełny z powodu„ LOG_BACKUP ”” na udostępnionym hoście

89

Mam witrynę sieci Web Asp.Net MVC 5 z podejściem Codefirst EntityFramework we wspólnym planie hostingu. Używa panelu WebbsitePanel typu open source do panelu sterowania, a jego panel SQL Server jest nieco ograniczony. Dzisiaj, gdy chciałem edytować bazę danych, napotkałem ten błąd:

The transaction log for database 'db_name' is full due to 'LOG_BACKUP'

Szukałem wokół i znalazłem wiele odpowiedzi powiązanych, takich jak ten i ten lub ten , ale problemem jest to, że proponujemy uruchomienie kwerendy w bazie danych. Spróbowałem biec

db.Database.ExecuteSqlCommand("ALTER DATABASE db_name SET RECOVERY SIMPLE;");

ze studiem wizualnym (włączone HomeController), ale pojawia się następujący błąd:

System.Data.SqlClient.SqlException: ALTER DATABASE statement not allowed within multi-statement transaction.

Jak mogę rozwiązać mój problem? Czy powinienem skontaktować się z zespołem wsparcia (który jest trochę kiepski dla mojego gospodarza), czy mogę rozwiązać ten problem samodzielnie?

Alireza Noori
źródło
Wykonaj ALTER bez transakcji.
usr
@usr Jak mam to zrobić?
Alireza Noori,
Jest to problem z bazą danych, zmniejszanie bazy danych może działać. Poproś administratora DBA o pomoc w tym.
Shashank Chaturvedi,
Musiałeś jakoś otworzyć transakcję. Nie wiem, może EF robi to automatycznie. Musiałbyś poszukać informacji na temat EF i transakcji. Lub wykonaj to z SSMS. Lub użyj surowego ADO.NET. Prawdopodobnie Twój dostawca usług hostingowych i tak nie zezwoli na takie oświadczenie i musi częściej tworzyć kopie zapasowe dziennika.
usr

Odpowiedzi:

38

Zadzwoń do firmy hostingowej i poproś o skonfigurowanie regularnych kopii zapasowych dziennika lub ustaw prosty model odzyskiwania. Jestem pewien, że wiesz, co wpływa na wybór, ale i tak powiem. Ustaw model odzyskiwania na pełny, jeśli potrzebujesz możliwości przywrócenia do dowolnego punktu w czasie. Tak czy inaczej, baza danych jest źle skonfigurowana.

Ben Thul
źródło
Dziękuję Ci. Chciałem to zrobić sam, ale skontaktowałem się z nimi, a oni skonfigurowali odzyskiwanie i uruchomili shrinkDB. Ponadto nie potrzebowałem odzyskiwania, więc powiedziałem im, aby ustawić go w SIMPLEtrybie.
Alireza Noori,
1
Ta strona MSDN wyjaśnia, jak ustawić prosty model odzyskiwania!
shekhar
143

Oprócz odpowiedzi Bena możesz wypróbować poniższe zapytania zgodnie z potrzebami

USE {database-name};  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE {database-name}
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.  
DBCC SHRINKFILE ({database-file-name}, 1);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE {database-name}
SET RECOVERY FULL;  
GO 

Zaktualizuj Credit @ cema-sp

Aby znaleźć nazwy plików bazy danych użyj poniższego zapytania

select * from sys.database_files;
Mohit Dharmadhikari
źródło
8
Dodatkowe: aby znaleźć {nazwa-pliku-bazy danych}:select * from sys.database_files;
cema-sp
2
Mogę potwierdzić, że to działa wspaniale. Powinna być zaakceptowana odpowiedź.
garrettendi
2
Dzięki @Mohit Dharmadhikari; Próbowałem wielu innych rzeczy, w tym przydzielania większej ilości miejsca na dysku i zwiększania rozmiaru pliku dziennika, ale nic nie działało, dopóki najpierw nie zmniejszyłem istniejącego pliku dziennika.
Johnny,
1
Dzięki, bardzo pomocna.
Obakeng Molebatsi
2
Wydaje mi się, że {nazwa-pliku-bazy-danych} odpowiadałoby namekolumnie wiersza dziennika z tego zapytania:select * from sys.database_files
Bob Horn
13

Czasami, gdy na dysku zabraknie miejsca, komunikat „Dziennik transakcji bazy danych XXXXXXXXXX jest pełny z powodu„ LOG_BACKUP ””, gdy instrukcja aktualizacji SQL nie powiedzie się. Sprawdź swoje miejsce na dysku :)

Hein Gous
źródło
5

Ten błąd występuje, ponieważ dziennik transakcji jest pełny z powodu LOG_BACKUP. W związku z tym nie można wykonać żadnej akcji w tej bazie danych, aw takim przypadku Aparat baz danych programu SQL Server zgłosi błąd 9002.

Aby rozwiązać ten problem, wykonaj następujące czynności

  • Wykonaj pełną kopię zapasową bazy danych.
  • Zmniejsz plik dziennika, aby zmniejszyć rozmiar pliku fizycznego.
  • Utwórz LOG_BACKUP.
  • Utwórz plan konserwacji LOG_BACKUP, aby często tworzyć kopie zapasowe dzienników.

Napisałem artykuł ze wszystkimi szczegółami dotyczącymi tego błędu i jak go rozwiązać w Dziennik transakcji dla bazy danych „SharePoint_Config” jest pełny z powodu LOG_BACKUP

Mohamed
źródło
8
Opublikowanie komunikatu o błędzie jako odpowiedzi nie jest wcale pomocne. Odpowiedzi zawierające tylko łącze są również mile widziane w StackOverflow. Powinieneś wyodrębnić odpowiedni tekst z linku i zacytować go tutaj. Jest to szczególnie ważne w przypadku, gdy link zaniknie w przyszłości, tak jak wszystkie linki nieuchronnie.
Dan Bechard
1

Otrzymałem ten sam błąd, ale z pracy zaplecza (zadanie SSIS). Po sprawdzeniu ustawienia wzrostu pliku dziennika bazy danych, plik dziennika był ograniczony do 1 GB. Więc co się stało, gdy zadanie zostało uruchomione i poprosiło serwer SQL o przydzielenie większej ilości miejsca na dzienniki, ale limit wzrostu dziennika spadł, co spowodowało niepowodzenie zadania. Zmodyfikowałem wzrost dziennika i ustawiłem go na wzrost o 50 MB i nieograniczony wzrost, a błąd zniknął.

Andy
źródło
1

Może się to również zdarzyć, gdy plik dziennika ma ograniczony rozmiar.

Kliknij prawym przyciskiem myszy bazę danych w Object Explorer

Wybierz Właściwości

Wybierz pliki

W wierszu dziennika kliknij wielokropek w kolumnie Autogrowth / Maxsize

Zmień / sprawdź, czy maksymalny rozmiar pliku jest nieograniczony.

wprowadź opis obrazu tutaj

Po zmianie na nieograniczoną bazę danych wróciła do życia.

Roy Latham
źródło