130 votes

Le journal des transactions de la base de données est plein

J'ai un processus de longue durée qui maintient une transaction ouverte pendant toute sa durée.

Je n'ai aucun contrôle sur la façon dont cela est exécuté.

Comme une transaction est maintenue ouverte pendant toute sa durée, lorsque le journal des transactions se remplit, SQL Server ne peut pas augmenter la taille du fichier journal.

Le processus échoue donc avec l'erreur "The transaction log for database 'xxx' is full" .

J'ai essayé d'empêcher cela en augmentant la taille du fichier journal des transactions dans les propriétés de la base de données, mais j'obtiens la même erreur.

Je ne sais pas ce que je dois essayer ensuite. Le processus dure plusieurs heures, il n'est donc pas facile de jouer aux essais et aux erreurs.

Des idées ?

Si cela intéresse quelqu'un, le processus est une importation de l'organisation en Microsoft Dynamics CRM 4.0.

Il y a beaucoup d'espace disque, le journal est en mode de journalisation simple et nous avons sauvegardé le journal avant de lancer le processus.

-=-=--=-- MISE À JOUR -=-=--=-=----

Merci à tous pour les commentaires jusqu'à présent. Ce qui suit est ce qui m'a amené à croire que le journal n'augmenterait pas en raison de la transaction ouverte :

J'obtiens l'erreur suivante...

Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

En suivant ce conseil, je me suis rendu à " log_reuse_wait_desc column in sys.databases "et il détenait la valeur " ACTIVE_TRANSACTION ".

Selon Microsoft : http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx

Cela signifie ce qui suit :

Une transaction est active (tous les modèles de récupération). - Une transaction en cours depuis longtemps peut exister au début de la sauvegarde du journal. Dans ce cas, la libération de l'espace peut nécessiter une autre sauvegarde du journal. Pour plus d'informations, voir "Transactions actives de longue durée", plus loin dans cette rubrique.

- Une transaction est différée (SQL Server 2005 Enterprise Edition et versions ultérieures uniquement). Une transaction différée est en fait une transaction active dont le retour en arrière est bloqué en raison d'une ressource indisponible. Pour plus d'informations sur les causes des transactions différées et sur la manière de les sortir de l'état différé, voir Transactions différées.

Ai-je mal compris quelque chose ?

-=-=--- MISE À JOUR 2 -=-=--=---

Je viens de lancer le processus avec la taille initiale du fichier journal fixée à 30 Go. Cela prendra quelques heures pour terminer.

-=-=--- Final UPDATE -=-=-----.

Le problème était en fait causé par le fichier journal qui consommait tout l'espace disque disponible. Lors de la dernière tentative, j'ai libéré 120 Go, mais le fichier a tout utilisé et a finalement échoué.

Je n'avais pas réalisé que cela se produisait auparavant, car lorsque le processus était exécuté pendant la nuit, il revenait en arrière en cas d'échec. Cette fois, j'ai pu vérifier la taille du fichier journal avant le retour en arrière.

Merci à tous pour votre contribution.

114voto

user3774600 Points 1186

Pour résoudre ce problème, modifiez Modèle de récupération a Simple puis Journal des fichiers rétrécis

1. Propriétés de la base de données > Options > Modèle de récupération > Simple

2. Tâches de la base de données > Réduire > Fichiers > Log.

C'est fait.

Vérifiez ensuite la taille du fichier journal de votre base de données à l'adresse Propriétés de la base de données > Fichiers > Fichiers de la base de données > Chemin

Pour vérifier le journal complet du serveur sql : ouvrez le Log File Viewer à l'adresse suivante SSMS > Base de données > Gestion > Journaux du serveur SQL > Actuel

51voto

user2813989 Points 38

J'ai eu cette erreur une fois et cela s'est avéré être le disque dur du serveur qui manquait d'espace disque.

22voto

Ross McNab Points 2995

Avez-vous Activer la croissance automatique y Croissance du dossier sans restriction tous deux activés pour le fichier journal ? Vous pouvez les modifier via SSMS dans "Database Properties > Files".

21voto

Mike Henderson Points 992

S'agit-il d'un script ponctuel, ou d'un travail régulier ?

Dans le passé, pour des projets spéciaux qui nécessitaient temporairement beaucoup d'espace pour le fichier journal, je créais un deuxième fichier journal et je le rendais énorme. Une fois le projet terminé, nous supprimions le fichier journal supplémentaire.

12voto

Brian Points 1531

C'est une approche de la vieille école, mais si vous effectuez une mise à jour itérative ou une opération d'insertion en SQL, quelque chose qui s'exécute pendant une longue période, c'est une bonne idée d'appeler périodiquement (par programmation) "checkpoint". L'appel de "checkpoint" fait que SQL écrit sur le disque toutes les modifications en mémoire seulement (les pages sales, comme on les appelle) et les éléments stockés dans le journal des transactions. Cela a pour effet de nettoyer périodiquement votre journal des transactions, évitant ainsi des problèmes comme celui décrit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X