"Il registro delle transazioni per il database è pieno a causa di 'LOG_BACKUP'" in un host condiviso


92

Ho un sito Web Asp.Net MVC 5 con l'approccio codefirst EntityFramework in un piano di hosting condiviso. Utilizza il WebbsitePanel open source per il pannello di controllo e il suo pannello SQL Server è piuttosto limitato. Oggi quando ho voluto modificare il database, ho riscontrato questo errore:

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

Ho cercato in giro e ho trovato molte risposte correlate come questa e questa o questa, ma il problema è che suggeriscono di eseguire una query sul database. Ho provato a correre

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

con lo studio visivo (su HomeController) ma ottengo il seguente errore:

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

Come posso risolvere il mio problema? Devo contattare il team di supporto (che è un po 'scarso per il mio host) o posso risolverlo da solo?


Esegui l'ALTER senza una transazione.
usr

@usr Come potrei farlo?
Alireza Noori

È un problema di database, ridurre il database potrebbe funzionare. Chiedi a un DBA di aiutarti in questo.
Shashank Chaturvedi

Devi aver aperto una transazione in qualche modo. Non lo so, forse EF lo fa automaticamente. Avresti bisogno di fare qualche ricerca su EF e transazione. Oppure eseguilo da SSMS. In alternativa, utilizza ADO.NET grezzo. Probabilmente il tuo hoster non consentirà comunque quella dichiarazione e dovrà emettere backup del log più frequentemente.
usr

Risposte:


39

Chiama la tua società di hosting e chiedi loro di impostare backup regolari del registro o impostare il modello di ripristino su semplice. Sono sicuro che tu sappia cosa ispira la scelta, ma sarò comunque esplicito. Impostare il modello di ripristino su pieno se è necessaria la possibilità di ripristinare un punto nel tempo arbitrario. In entrambi i casi, il database è configurato in modo errato così com'è.


Grazie. Volevo farlo da solo, ma ho contattato anche loro e hanno impostato il ripristino e eseguito un file shrinksul DB. Inoltre, non avevo bisogno del ripristino, quindi ho detto loro di impostarlo in SIMPLEmodalità.
Alireza Noori

1
Questa pagina MSDN spiega come impostare il modello di ripristino su semplice!
shekhar

147

Oltre alla risposta di Ben, puoi provare Below Queries secondo le tue necessità

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 

Aggiorna Credit @ cema-sp

Per trovare i nomi dei file di database, utilizzare la query seguente

select * from sys.database_files;

8
Aggiuntivo: per trovare {database-nome-file}:select * from sys.database_files;
cema-sp

2
Posso confermare che funziona a meraviglia. Dovrebbe essere la risposta accettata.
garrettendi

2
Grazie @Mohit Dharmadhikari; Ho provato molte altre cose, inclusa l'allocazione di più spazio su disco e l'aumento della dimensione del file di registro, ma nulla ha funzionato finché non ho ridotto il file di registro esistente prima.
Johnny

1
Grazie, molto utile.
Obakeng Molebatsi

3
Credo che {database-file-name} corrisponderebbe alla namecolonna, per la riga del log, da questa query:select * from sys.database_files
Bob Horn

14

A volte, quando un disco esaurisce lo spazio, verrà restituito il messaggio "registro delle transazioni per il database XXXXXXXXXX pieno a causa di" LOG_BACKUP "" quando un'istruzione SQL di aggiornamento non riesce. Controlla il tuo spazio su disco :)


5

Questo errore si verifica perché il registro delle transazioni è pieno a causa di LOG_BACKUP. Pertanto, non è possibile eseguire alcuna azione su questo database e in questo caso, il Motore di database di SQL Server genererà un errore 9002.

Per risolvere questo problema dovresti fare quanto segue

  • Fai un backup completo del database.
  • Riduci il file di registro per ridurre le dimensioni del file fisico.
  • Crea un LOG_BACKUP.
  • Crea un piano di manutenzione LOG_BACKUP per prendere frequentemente i registri di backup.

Ho scritto un articolo con tutti i dettagli riguardanti questo errore e come risolverlo in Il registro delle transazioni per il database "SharePoint_Config" è pieno a causa di LOG_BACKUP


9
Pubblicare il messaggio di errore come risposta non è affatto utile. Anche le risposte di solo collegamento sono disapprovate su StackOverflow. Dovresti estrarre il testo pertinente dal link e citarlo qui. Ciò è particolarmente importante nel caso in cui il collegamento muoia in futuro, come inevitabilmente fanno tutti i collegamenti.
Dan Bechard

3

Ciò può accadere anche quando le dimensioni del file di registro sono limitate.

Fare clic con il pulsante destro del mouse sul database in Esplora oggetti

Seleziona Proprietà

Seleziona i file

Nella riga del registro, fare clic sui puntini di sospensione nella colonna Aumento automatico / Dimensione massima

Modificare / verificare che la dimensione massima del file sia illimitata.

inserisci qui la descrizione dell'immagine

Dopo essere passato a illimitato, il database è tornato in vita.


1

Ho ricevuto lo stesso errore ma da un lavoro di backend (lavoro SSIS). Dopo aver verificato l'impostazione di crescita del file di registro del database, la crescita del file di registro era limitata a 1 GB. Quindi quello che è successo è quando il lavoro è stato eseguito e ha chiesto al server SQL di allocare più spazio di log, ma il limite di crescita del log è stato rifiutato ha causato il fallimento del lavoro. Ho modificato la crescita del registro e l'ho impostato per aumentare di 50 MB e crescita illimitata e l'errore è scomparso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.