IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Le journal des transactions de la base de données est plein en raison de 'ACTIVE_TRANSACTION'


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Par défaut Le journal des transactions de la base de données est plein en raison de 'ACTIVE_TRANSACTION'
    Bonjour à toutes et tous,

    J'ai un problème récent, quand je lance de grosses requêtes en insert ou en delete, j'ai ce message : "Le journal des transactions de la base de données <ma_base> est plein en raison de 'ACTIVE_TRANSACTION' "

    Or (et je vous explique le contexte):
    - Mon mode de récupération est en simple. Il n'est donc pas sensé être plein, il est sensé se recycler non ?
    - J'ai 6 Go pour ce journal de transaction.
    - J'ai encore beaucoup de place sur le disque dur.
    - C'est l’environnement de dev de mon entrepôt de données.
    - Je suis assez débutant en gestion de base de données. A la base j'intègre des données via SSIS et ne m'occupe pas trop du versant administration du server SQL, mais je suis "obligé" (mais ça me plait hein !) de m'y coller.

    Plus généralement j'ai un peu du mal avec le concept de journal de transaction. Je vois à peu près la différence entre FULL et SIMPLE et BULCK... Si je comprends bien un FULL et un BULCK se vide quand ils sont sauvegarder, et je n'ai pas besoin de m'occuper de la taille d'un SIMPLE...

    Une idée d'ou pourrait venir le problème et une idée pour le régler ? N'hésitez pas si vous avez besoin d'autres renseignements (je compléterais de mon côté si je trouve d'autres infos)

    Merci d'avance

    Slaveak

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    - Mon mode de récupération est en simple. Il n'est donc pas sensé être plein, il est sensé se recycler non ?
    Il se recycle mais pas tant que la transaction courante est terminée.
    Et vraisemblablement, ta transaction requiert plus de 6 Go de JT.
    Soit tu augmentes tes fichiers de JT, soit tu vois pour optimiser / fragmenter ton process.

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Par défaut
    Ah ok... c'est donc bien ce que je pensais alors... Il ne tient pas la transaction...

    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    soit tu vois pour optimiser / fragmenter ton process.
    Le problème c'est que ces requêtes sont placées en ELT dans mes packages SSIS... donc malheureusement... je ne vois pas trop comment optimiser et fragmenter.

    En tout cas merci pour ta réponse rapide.

    EDIT: je sais que c'est totalement à ne pas faire... mais je l'ai mis en croissance illimitée... et bien j'ai toujours le même plantage.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Et vraisemblablement, ta transaction requiert plus de 6 Go de JT.
    Ou que la plus ancienne transaction non validée a fait que le journal n'a pas pu se vider avant.

    Dans ton cas Slaveak tu peux commencer par utiliser la commande suivante sur la base de données concernée:

    Ce qui te donnera le numéro de session correspondant à ta session encore ouverte (SPID).
    A toi de voir ce que tu veux faire avec .. Tu peux par exemple la supprimer (qui nécessitera de toute façon un rollback) avec la commande


    Plus généralement j'ai un peu du mal avec le concept de journal de transaction. Je vois à peu près la différence entre FULL et SIMPLE et BULCK... Si je comprends bien un FULL et un BULCK se vide quand ils sont sauvegarder, et je n'ai pas besoin de m'occuper de la taille d'un SIMPLE...
    Le modèle de récupération SIMPLE permet d'enregistrer au minimum certaines opérations et le journal est automatiquement tronqué après qu'un CHECKPOINT soit passé et qu'aucune transaction ouverte / ou enregistrement ne soit nécessaire pour de la réplication par exemple. Ceci dit il arrive que certaines fois, comme le dit 7gyY9w1ZY6ySRgPeaefZ, ta transaction va nécessité une certaine quantité d'espace disque dans le journal avant d'être validé. Dans ce cas la taille du journal peut tout à fait augmenter. En résumé il faut toujours se soucier et contrôler les grossissements de fichiers qui peuvent survenir dans tous les modes de récupération SQL Server.

    ++









    A+

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Par défaut
    Rein que pour ça, merci ! Je ne connaissais pas cette commande, que je viens d'utiliser, mais rien qui traine...

    Citation Envoyé par mikedavem Voir le message
    Tu peux par exemple la supprimer (qui nécessitera de toute façon un rollback) avec la commande
    Tu veux dire qu'il faut que je fasse un ROLLBACK manuel une fois le KILL effectué ?

    Citation Envoyé par mikedavem Voir le message
    Le modèle de récupération SIMPLE permet d'enregistrer au minimum certaines opérations et le journal est automatiquement tronqué après qu'un CHECKPOINT soit passé et qu'aucune transaction ouverte / ou enregistrement ne soit nécessaire pour de la réplication par exemple. Ceci dit il arrive que certaines fois, comme le dit 7gyY9w1ZY6ySRgPeaefZ, ta transaction va nécessité une certaine quantité d'espace disque dans le journal avant d'être validé. Dans ce cas la taille du journal peut tout à fait augmenter. En résumé il faut toujours se soucier et contrôler les grossissements de fichiers qui peuvent survenir dans tous les modes de récupération SQL Server.
    Différentes questions :
    - Est-ce que je peux anticiper la taille que va prendre une transaction avant de la lancer ?
    - Comment fait on pour contrôler les grossissement des fichiers ? contrôle des fichiers des journaux de transac ? ou autre ?

    En tout cas merci pour ton aide.

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    Rein que pour ça, merci ! Je ne connaissais pas cette commande, que je viens d'utiliser, mais rien qui traine...
    Tu t'es bien mis dans le contexte de la base de données concernée dans ton cas? C'est important.
    A moins que tu n'as plus de transaction active depuis ... ou que tu utilises le mode SERIALIZABLE mais j'en doute ici.


    Citation Envoyé par Slaveak Voir le message
    Tu veux dire qu'il faut que je fasse un ROLLBACK manuel une fois le KILL effectué ?
    Non et c'est un manque de précision de ma part. le Kill va automatiquement invalider la transaction correspondante, ce qui provoquera automatiquement un ROLLBACK en arrière plan.

    Citation Envoyé par Slaveak Voir le message

    Différentes questions :
    - Est-ce que je peux anticiper la taille que va prendre une transaction avant de la lancer ?
    - Comment fait on pour contrôler les grossissement des fichiers ? contrôle des fichiers des journaux de transac ? ou autre ?

    En tout cas merci pour ton aide.
    Pour anticiper la taille, cela reste un exercice assez difficile à ma connaissance
    Pour le contrôle il y a plusieurs possibilités. Deja il faut configurer une taille initiale suffisamment grande qui permettra d'absorber ta transaction sans déclenchement des accroissements automatiques (autogrow). Les autogrow sont des opérations bloquantes pour les transactions qui doivent attendre que le fichier finisse de s'agrandir avant de continuer.

    L'autogrowth est contrôlable via les options de fichiers dans SQL Server ou commande ALTER DATABASE si tu préfères les commandes. De manière générale ne pas mettre un autogrow trop petit, ce qui va générer de la fragmentation logique du journal et NTFS par la même occasion. Ne pas laisser non plus en % car l'agrandissement est moins prédictible dans ce cas (10% de 1GB n'est pas le même chose que 10% de 500GB par ex).

    ++

  7. #7
    Membre éclairé Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Par défaut
    tu peux aussi essayer le Traceflag T610 qui minimise les logs

    TF610 can be used to get minimal logging in a non-empty B-Tree. The idea is that when you insert a large amount of data, you don't want to create a lot of transaction log. Initially the idea was to automatically do this in the engine, but we ran into a bunch of issues and thus we put it under a traceflag.

    lien :

    http://sqlblogcasts.com/blogs/simons...ou-use-it.aspx

    pour activer un traceflag sur une instance :

    DBCC TRACEON (610);

    pour le desactiver :

    DBCC TRACEON (610, -1)
    GO

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Tu t'es bien mis dans le contexte de la base de données concernée dans ton cas? C'est important.
    A moins que tu n'as plus de transaction active depuis ... ou que tu utilises le mode SERIALIZABLE mais j'en doute ici.
    Oui oui j'ai bien visé la bonne base et même vérifié une deuxième fois que je trouvais justement assez étonnant qu'il n"y en ai aucune d'active vu la taille des logs. Dond non, je pense que mon INSERT est trop gros pour le journal de transaction tel qu'il est actuellement.

    Citation Envoyé par mikedavem Voir le message
    Pour anticiper la taille, cela reste un exercice assez difficile à ma connaissance
    Pour le contrôle il y a plusieurs possibilités. Deja il faut configurer une taille initiale suffisamment grande qui permettra d'absorber ta transaction sans déclenchement des accroissements automatiques (autogrow). Les autogrow sont des opérations bloquantes pour les transactions qui doivent attendre que le fichier finisse de s'agrandir avant de continuer.

    L'autogrowth est contrôlable via les options de fichiers dans SQL Server ou commande ALTER DATABASE si tu préfères les commandes. De manière générale ne pas mettre un autogrow trop petit, ce qui va générer de la fragmentation logique du journal et NTFS par la même occasion. Ne pas laisser non plus en % car l'agrandissement est moins prédictible dans ce cas (10% de 1GB n'est pas le même chose que 10% de 500GB par ex).

    ++
    Ahh ok ! Merci pour ces précisions ! Bon avec tout ça je vais tenter de trouver la bonne taille, sans forcement mettre l'autogrow ( je me méfie un peu des trucs qui se font dans mon dos... car j'ai tendance à les oublier dans un coin.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/08/2009, 09h44
  2. [interbase] journal des transactions
    Par maamar1979 dans le forum InterBase
    Réponses: 4
    Dernier message: 03/10/2006, 11h47
  3. PB : Comment regénérer mon journal des transactions ?
    Par SPIKE84 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/02/2006, 09h38
  4. Automatisation de la purge du journal des transactions
    Par Nathan dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/09/2004, 08h05
  5. vider le journal des transactions
    Par coucoucmoi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/05/2004, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo