"Das Transaktionsprotokoll für die Datenbank ist aufgrund von 'LOG_BACKUP'" auf einem gemeinsam genutzten Host voll

89

Ich habe eine Asp.Net MVC 5-Website mit EntityFramework-Codefirst-Ansatz in einem gemeinsamen Hosting-Plan. Es verwendet das Open Source WebbsitePanel für die Systemsteuerung und die SQL Server- Anzeige ist etwas eingeschränkt. Als ich heute die Datenbank bearbeiten wollte, ist dieser Fehler aufgetreten:

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

Ich suchte herum und fand eine Menge von verwandten Antworten wie diese und dies oder das , aber das Problem ist , dass sie eine Abfrage auf der Datenbank schlagen laufen. Ich habe versucht zu rennen

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

mit dem Visual Studio (auf dem HomeController) bekomme ich aber folgenden Fehler:

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

Wie kann ich mein Problem lösen? Soll ich mich an das Support-Team wenden (was für meinen Gastgeber etwas schlecht ist) oder kann ich das selbst lösen?

Alireza Noori
quelle
Führen Sie den ALTER ohne Transaktion aus.
usr
@usr Wie würde ich das machen?
Alireza Noori
Es ist ein Datenbankproblem, das Verkleinern der Datenbank könnte funktionieren. Bitten Sie einen DBA, Ihnen dabei zu helfen.
Shashank Chaturvedi
Sie müssen irgendwie eine Transaktion eröffnet haben. Ich weiß nicht, vielleicht macht EF das automatisch. Sie müssten einige Nachforschungen über EF und Transaktionen anstellen. Oder führen Sie dies über SSMS aus. Oder verwenden Sie rohes ADO.NET. Wahrscheinlich lässt Ihr Hoster diese Anweisung sowieso nicht zu und muss häufiger Protokollsicherungen durchführen.
usr

Antworten:

38

Rufen Sie Ihr Hosting-Unternehmen an und lassen Sie es entweder regelmäßige Protokollsicherungen einrichten oder das Wiederherstellungsmodell auf einfach einstellen. Ich bin sicher, Sie wissen, was die Wahl beeinflusst, aber ich werde es trotzdem explizit sagen. Setzen Sie das Wiederherstellungsmodell auf "Voll", wenn Sie die Wiederherstellung zu einem beliebigen Zeitpunkt benötigen. In beiden Fällen ist die Datenbank unverändert falsch konfiguriert.

Ben Thul
quelle
Vielen Dank. Ich wollte dies selbst tun, kontaktierte sie aber auch und sie haben die Wiederherstellung eingerichtet und eine shrinkauf der DB ausgeführt. Außerdem brauchte ich die Wiederherstellung nicht, also sagte ich ihnen, sie sollten sie in den SIMPLEModus versetzen.
Alireza Noori
1
Auf dieser MSDN-Seite wird erläutert, wie Sie das Wiederherstellungsmodell auf einfach einstellen!
Shekhar
143

Zusätzlich zu Bens Antwort können Sie die folgenden Abfragen nach Bedarf ausprobieren

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 

Aktualisieren Sie Credit @ cema-sp

Verwenden Sie die folgende Abfrage, um Datenbankdateinamen zu finden

select * from sys.database_files;
Mohit Dharmadhikari
quelle
8
Zusätzlich: um {Datenbank-Dateiname} zu finden:select * from sys.database_files;
cema-sp
2
Ich kann bestätigen, dass dies ein Vergnügen ist. Sollte die akzeptierte Antwort sein.
Garrettendi
2
Danke @Mohit Dharmadhikari; Ich habe viele andere Dinge ausprobiert, darunter das Zuweisen von mehr Speicherplatz und das Erhöhen der Größe der Protokolldatei, aber nichts hat funktioniert, bis ich die vorhandene Protokolldatei zuerst verkleinert habe.
Johnny
1
Danke, sehr hilfreich.
Obakeng Molebatsi
2
Ich glaube, {Datenbank-Dateiname} würde der nameSpalte für die Zeile des Protokolls aus dieser Abfrage entsprechen:select * from sys.database_files
Bob Horn
13

Gelegentlich, wenn auf einer Festplatte nicht genügend Speicherplatz vorhanden ist, wird die Meldung "Transaktionsprotokoll für Datenbank XXXXXXXXXX ist aufgrund von 'LOG_BACKUP' voll" zurückgegeben, wenn eine SQL-Aktualisierungsanweisung fehlschlägt. Überprüfen Sie Ihren Speicherplatz :)

Hein Gous
quelle
5

Dieser Fehler tritt auf, weil das Transaktionsprotokoll aufgrund von LOG_BACKUP voll wird. Daher können Sie für diese Datenbank keine Aktion ausführen. In diesem Fall löst das SQL Server-Datenbankmodul einen 9002-Fehler aus.

Um dieses Problem zu lösen, sollten Sie Folgendes tun

  • Erstellen Sie eine vollständige Datenbanksicherung.
  • Verkleinern Sie die Protokolldatei, um die physische Dateigröße zu verringern.
  • Erstellen Sie ein LOG_BACKUP.
  • Erstellen Sie einen LOG_BACKUP-Wartungsplan, um häufig Sicherungsprotokolle zu erstellen.

Ich habe einen Artikel mit allen Details zu diesem Fehler und seiner Behebung unter geschrieben. Das Transaktionsprotokoll für die Datenbank 'SharePoint_Config' ist aufgrund von LOG_BACKUP voll

Mohamed
quelle
8
Das Posten der Fehlermeldung als Antwort ist überhaupt nicht sehr hilfreich. Nur-Link-Antworten sind bei StackOverflow ebenfalls verpönt. Sie sollten den relevanten Text aus dem Link extrahieren und hier zitieren. Dies ist besonders wichtig, wenn die Verbindung in Zukunft nicht mehr funktioniert, wie dies bei allen Verbindungen unweigerlich der Fall ist.
Dan Bechard
1

Ich habe den gleichen Fehler erhalten, aber von einem Backend-Job (SSIS-Job). Beim Überprüfen der Wachstumseinstellung für die Protokolldatei der Datenbank war das Wachstum der Protokolldatei auf 1 GB begrenzt. Was also geschah, war, als der Job ausgeführt wurde und SQL Server aufgefordert wurde, mehr Protokollspeicherplatz zuzuweisen, aber das Wachstumslimit des abgelehnten Protokolls führte dazu, dass der Job fehlschlug. Ich habe das Protokollwachstum geändert und es auf 50 MB und unbegrenztes Wachstum eingestellt, und der Fehler ist verschwunden.

Andy
quelle
1

Dies kann auch passieren, wenn die Größe der Protokolldatei eingeschränkt ist.

Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf Datenbank

Wählen Sie Eigenschaften

Dateien auswählen

Klicken Sie in der Protokollzeile auf die Auslassungspunkte in der Spalte Autogrowth / Maxsize

Ändern / Überprüfen Die maximale Dateigröße ist unbegrenzt.

Geben Sie hier die Bildbeschreibung ein

Nach dem Ändern auf unbegrenzt wurde die Datenbank wieder zum Leben erweckt.

Roy Latham
quelle