web-dev-qa-db-fra.com

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

J'ai un long processus qui maintient ouverte une transaction pour toute la durée.

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

Dans la mesure où une transaction est maintenue ouverte pendant toute la durée du processus, SQL Server ne peut pas augmenter la taille du fichier journal lorsqu'il est rempli.

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

J'ai tenté d'éviter 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.

Pas sûr de ce que je devrais essayer ensuite. Le processus dure plusieurs heures, il n'est donc pas facile de jouer par essais et erreurs.

Des idées?

Si quelqu'un est intéressé, le processus est une importation d'organisation dans Microsoft Dynamics CRM 4.0.

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

- = - = - = - = - UPDATE - = - = - = - = -

Merci à tous pour les commentaires jusqu'à présent. Voici ce qui m'a amené à croire que le journal ne grossirait pas à cause de la transaction ouverte:

Je reçois 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

Alors, suivant ce conseil, je suis allé dans "log_reuse_wait_desc column in sys.databases" et il contenait la valeur "ACTIVE_TRANSACTION".

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

Cela signifie que:

Une transaction est active (tous les modèles de récupération). • Une transaction de longue durée 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 réalité une transaction active dont l'annulation est bloquée à cause d'une ressource indisponible. Pour plus d'informations sur les causes des transactions différées et sur la façon de les sortir de l'état différé, voir Transactions différées.

Ai-je mal compris quelque chose?

- = - = - = - - UPDATE 2 - = - = - = -

Il suffit de lancer le processus avec une taille de fichier journal initiale de 30 Go. Cela prendra quelques heures à compléter.

- = - = - = - UPDATE final - = - = - = -

Le problème était dû au fait que le fichier journal utilisait tout l'espace disque disponible. Lors de la dernière tentative, j'ai libéré 120 Go et il a tout utilisé et a finalement échoué.

Je n'avais pas réalisé que cela se produisait auparavant, car lorsque le processus fonctionnait du jour au lendemain, il revenait à l'échec. Cette fois, j'ai pu vérifier la taille du fichier journal avant la restauration.

Merci à tous pour votre contribution.

94
Jimbo

Est-ce un script ponctuel, ou un travail régulier?

Dans le passé, pour les projets spéciaux nécessitant temporairement beaucoup d'espace pour le fichier journal, je créais un deuxième fichier journal et le rendais énorme. Une fois le projet terminé, nous avons ensuite supprimé le fichier journal supplémentaire.

18
Mike Henderson

Pour résoudre ce problème, remplacez Modèle de récupération par Simple alors Journal des fichiers réductibles

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

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

Terminé.

Vérifiez ensuite la taille de votre fichier journal de base de données sous 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 l’afficheur de fichier journal dans SSMS> Base de données> Gestion> Journaux SQL Server> Actuel.

82
user3774600

J'ai eu cette erreur une fois et cela a fini par être le disque dur du serveur qui manque d'espace disque.

33
PretoriaCoder

Avez-vous Activer la croissance automatique et Croissance de fichier sans restriction tous les deux activés pour le fichier journal? Vous pouvez les éditer via SSMS dans "Propriétés de la base de données> Fichiers"

15
Ross McNab

C'est une approche classique, mais si vous effectuez une mise à jour itérative ou une opération d'insertion dans SQL, une opération qui dure longtemps, il est judicieux d'appeler périodiquement (par programme) un "point de contrôle". L'appel de "point de contrôle" amène SQL à écrire sur le disque toutes ces modifications (uniquement les pages modifiées) (uniquement les pages modifiées) 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 similaires à celui décrit.

9
Brian

Ce qui suit tronquera le journal.

USE [yourdbname] 
GO

-- TRUNCATE TRANSACTION LOG --
DBCC SHRINKFILE(yourdbname_log, 1)
BACKUP LOG yourdbname WITH TRUNCATE_ONLY
DBCC SHRINKFILE(yourdbname_log, 1)
GO

-- CHECK DATABASE HEALTH --
ALTER FUNCTION [dbo].[checker]() RETURNS int AS BEGIN  RETURN 0 END
GO
2
Pinal

Si votre modèle de récupération de base de données est plein et que vous n'avez pas de plan de maintenance de sauvegarde du journal, vous obtiendrez cette erreur car le journal des transactions devient saturé en raison de LOG_BACKUP.

Cela empêchera toute action sur cette base de données (par exemple, réduire) et le moteur de base de données SQL Server générera une erreur 9002.

Pour résoudre ce problème, je vous conseille de vérifier ceci Le journal des transactions de la base de données ‘SharePoint_Config’ est saturé en raison de LOG_BACKUP qui indique la procédure détaillée à suivre pour résoudre le problème.

1
DevoWorx

J'ai rencontré l'erreur suivante: "Le journal des transactions de la base de données '...' est saturé en raison de 'ACTIVE_TRANSACTION' lors de la suppression des anciennes lignes des tables de ma base de données afin de libérer de l'espace disque. J'ai compris que cette erreur se produirait si le nombre de lignes à Dans mon cas, be delete était plus grand que 1 000 000. Par conséquent, au lieu d’utiliser une instruction DELETE, j’ai divisé la tâche de suppression à l’aide de DELETE TOP (1000000) ....

Par exemple:

au lieu d'utiliser cette déclaration:

DELETE FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

en utilisant l'instruction suivante à plusieurs reprises:

DELETE TOP(1000000) FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())
0
Linh Dao

Mon problème résolu avec plusieurs exécutions de suppressions limitées comme

Avant

DELETE FROM TableName WHERE Condition

Après

DELETE TOP(1000) FROM TableName WHERECondition