"Le journal des transactions de la base de données est plein en raison de" LOG_BACKUP "" dans un hôte partagé

89

J'ai un site Web Asp.Net MVC 5 avec l'approche EntityFramework codefirst dans un plan d'hébergement partagé. Il utilise le WebbsitePanel open source pour le panneau de configuration et son panneau SQL Server est quelque peu limité. Aujourd'hui, lorsque je voulais modifier la base de données, j'ai rencontré cette erreur:

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

J'ai cherché et j'ai trouvé beaucoup de réponses connexes comme ceci et ceci ou ceci, mais le problème est qu'ils suggèrent d'exécuter une requête sur la base de données. J'ai essayé de courir

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

avec le studio visuel (sur le HomeController) mais j'obtiens l'erreur suivante:

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

Comment puis-je résoudre mon problème? Dois-je contacter l'équipe d'assistance (ce qui est un peu médiocre pour mon hôte) ou puis-je résoudre ce problème moi-même?

Alireza Noori
la source
Exécutez ALTER sans transaction.
usr
@usr Comment pourrais-je faire ça?
Alireza Noori
C'est un problème de base de données, la réduction de la base de données pourrait fonctionner. Demandez à un DBA de vous aider à ce sujet.
Shashank Chaturvedi
Vous devez avoir ouvert une transaction d'une manière ou d'une autre. Je ne sais pas, peut-être qu'EF le fait automatiquement. Vous auriez besoin de faire des recherches sur EF et transaction. Ou exécutez ceci à partir de SSMS. Ou utilisez ADO.NET brut. Votre hébergeur n'autorisera probablement pas cette déclaration de toute façon et il devra effectuer des sauvegardes de journaux plus fréquemment.
usr

Réponses:

38

Appelez votre société d'hébergement et demandez-lui de configurer des sauvegardes régulières des journaux ou de définir le modèle de récupération sur simple. Je suis sûr que vous savez ce qui informe le choix, mais je serai quand même explicite. Définissez le modèle de récupération sur complet si vous avez besoin de la possibilité de restaurer à un moment arbitraire. Dans tous les cas, la base de données est mal configurée telle quelle.

Ben Thul
la source
Merci. Je voulais le faire moi-même mais les ai également contactés et ils ont mis en place la récupération et exécuté un shrinksur la base de données. De plus, je n'avais pas besoin de la récupération, alors je leur ai dit de le mettre en SIMPLEmode.
Alireza Noori
1
Cette page MSDN explique comment définir le modèle de récupération sur simple!
shekhar
143

En plus de la réponse de Ben, vous pouvez essayer les requêtes ci-dessous selon vos besoins

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 

Mettre à jour Credit @ cema-sp

Pour trouver les noms de fichiers de base de données, utilisez la requête ci-dessous

select * from sys.database_files;
Mohit Dharmadhikari
la source
8
Supplémentaire: pour trouver {database-file-name}:select * from sys.database_files;
cema-sp
2
Je peux confirmer que cela fonctionne un régal. Devrait être la réponse acceptée.
garrettendi
2
Merci @Mohit Dharmadhikari; J'ai essayé beaucoup d'autres choses, y compris l'allocation de plus d'espace disque et l'augmentation de la taille du fichier journal, mais rien n'a fonctionné jusqu'à ce que je réduise d'abord le fichier journal existant.
Johnny
1
Merci, très utile.
Obakeng Molebatsi
2
Je crois que {database-file-name} équivaudrait à la namecolonne, pour la ligne du journal, à partir de cette requête:select * from sys.database_files
Bob Horn
13

Parfois, lorsqu'un disque manque d'espace, le message «Le journal des transactions de la base de données XXXXXXXXXX est plein en raison de« LOG_BACKUP »» sera renvoyé lorsqu'une instruction SQL de mise à jour échoue. Vérifiez votre espace disque :)

Hein Gous
la source
5

Cette erreur se produit car le journal des transactions devient plein en raison de LOG_BACKUP. Par conséquent, vous ne pouvez effectuer aucune action sur cette base de données et dans ce cas, le moteur de base de données SQL Server déclenchera une erreur 9002.

Pour résoudre ce problème, procédez comme suit

  • Effectuez une sauvegarde complète de la base de données.
  • Réduisez le fichier journal pour réduire la taille physique du fichier.
  • Créez un LOG_BACKUP.
  • Créez un plan de maintenance LOG_BACKUP pour prendre fréquemment des journaux de sauvegarde.

J'ai écrit un article avec tous les détails concernant cette erreur et comment la résoudre à Le journal des transactions pour la base de données 'SharePoint_Config' est plein en raison de LOG_BACKUP

Mohamed
la source
8
Publier le message d'erreur comme votre réponse n'est pas du tout très utile. Les réponses aux liens uniquement sont également mal vues sur StackOverflow. Vous devez extraire le texte pertinent du lien et le citer ici. Ceci est particulièrement important dans le cas où le lien meurt à l'avenir, comme tous les liens le font inévitablement.
Dan Bechard
1

J'ai eu la même erreur mais d'un travail backend (travail SSIS). Lors de la vérification du paramètre de croissance du fichier journal de la base de données, le fichier journal a une croissance limitée de 1 Go. Ainsi, ce qui s'est passé, c'est lorsque le travail s'est exécuté et qu'il a demandé au serveur SQL d'allouer plus d'espace de journal, mais la limite de croissance du journal refusé a provoqué l'échec du travail. J'ai modifié la croissance du journal et l'ai configurée pour qu'elle augmente de 50 Mo et de croissance illimitée et l'erreur a disparu.

Andy
la source
1

Cela peut également se produire lorsque la taille du fichier journal est limitée.

Cliquez avec le bouton droit sur la base de données dans l'Explorateur d'objets

Sélectionnez Propriétés

Sélectionnez les fichiers

Sur la ligne du journal, cliquez sur les points de suspension dans la colonne Autogrowth / Maxsize

Modifier / vérifier que la taille maximale du fichier est illimitée.

entrez la description de l'image ici

Après avoir changé pour illimité, la base de données est revenue à la vie.

Roy Latham
la source