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

MS SQL Server Discussion :

Automatisation de la purge du journal des transactions


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut Automatisation de la purge du journal des transactions
    Salut à tous,
    Je cherche un moyen d'automatiser la purge de mon journal des transactions.
    Pour cela je crée la procédure stockée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    CREATE PROCEDURE PurgeLog
    	@DatabaseName varchar(128)
    AS
     
    -- déclarations et initialisations
    DECLARE @LogFileID smallint, @LogFileName nchar(260), @fileid smallint, @filename nchar(260), @status int
     
    SET @LogFileID = 0
    SET @LogFileName = ''
     
    -- recherche le fichier de log de la base de données à purger
    DECLARE SysfilesCursor CURSOR FOR
    	SELECT [fileid], [filename], [status] FROM sysfiles
     
    OPEN SysfilesCursor
     
    FETCH NEXT FROM SysfilesCursor
    INTO @fileid, @filename, @status
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	IF (@status & CAST(0x40 AS INT) =  CAST(0x40 AS INT))
    	BEGIN
    		SET @LogFileID = @fileid
    		SET @LogFileName = @filename
    	END
     
    	FETCH NEXT FROM SysfilesCursor
    	INTO @fileid, @filename, @status
    END
     
    -- si on a trouvé le fichier de log à purger
    IF @LogFileID <> 0
    BEGIN
    	-- backup (virtuel) du fichier de log
    	BACKUP LOG @DatabaseName WITH TRUNCATE_ONLY
     
    	-- purge le fichier de log
    	DBCC SHRINKFILE(@LogFileName)
    END
     
    CLOSE SysfilesCursor
     
    DEALLOCATE SysfilesCursor
    GO
    Le probleme c'est que j'ai une erreur sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	-- purge le fichier de log
    	DBCC SHRINKFILE(@LogFileName)
    Le message d'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le paramètre 1 est incorrect pour cette instruction DBCC.
    Please help me.
    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Août 2002
    Messages
    354
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 354
    Points : 398
    Points
    398
    Par défaut
    Slt,

    C'est l'id du fichier qu'attends l'ordre DBCC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    create procedure spu_dba_ShrinkDbEmptyLog
    -- Parametres Entree / Sortie
    @esysDataBase sysname
    as
    begin
     
    declare @vchcmd varchar(100)
    declare @intI integer
    declare @intCount integer
    declare @numFile numeric
     
    -- Réduit la taille des fichiers de données dans la base de données spécifiée.
     
    DBCC SHRINKDATABASE (@esysDataBase,10)
     
    -- recuperation des Id de fichier
     
    create table #tmpFileId
    (
      Tmp_Id numeric not null identity(1,1),
      Tmp_FileId numeric not null
    )
     
    select @vchcmd = 'use ' +  quotename(@esysDataBase) + ' select fileid from sysfiles order by fileid'
     
    insert into #tmpFileId (Tmp_FileId)
    exec (@vchcmd)
     
    select @intCount = count(*) from #tmpFileId
     
    set @intI = 1
     
    while @intI <= @intCount
    begin
     
      select @numFile = Tmp_FileId from #tmpFileId where Tmp_id = @intI
     
      select @vchcmd = 'use ' + quotename(@esysDataBase) + ' DBCC SHRINKFILE(' + convert(varchar,@numFile) + ', EMPTYFILE)'
     
      select @vchcmd
     
      exec (@vchcmd)
     
      set @intI = @intI + 1
    end
     
    -- Truncate Log
    select @vchcmd = 'BACKUP LOG '+  quotename(@esysDataBase) + 'WITH TRUNCATE_ONLY'
     
    exec (@vchcmd)
     
    drop table #tmpFileId
     
    Return 0
     
    end
    go

    a+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    J'ai essayé avec le ID du fichier et ça me donne la même erreur!
    Y a t il une autre solution?
    Merci.

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    C'est de l'artillerie lourde. Pourquoi pas simplement et une bonne fois pour toute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use master
    exec sp_dboption VotreBase, 'trunc log', true ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    D'apres ce que je lit dans la doc, si cette option est à vraie, je site
    un point de contrôle vide la partie inactive du journal lorsque la base de données est dans le mode troncature de journal
    Quand on dit que
    base de données est dans le mode troncature de journal
    , ca veut dire quoi?

    Est ce que c'est quand on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BACKUP LOG VotreBaseDeDonnes WITH TRUNCATE_ONLY
    ?

    J'ai activé cette option mais le journal des transactions a grossi de 2,5 Mo.
    Je n'arrive pas a le reduire (sauf en faisant un DBCC SHRINKFILE).

    Merci de m'aider.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Bon, je n'ai toujours pas compris ce que fait exactement l'option "trunc. log on chkpt.".
    Si quelqu’un peut m'expliquer, ca me rendrait service.
    Je pense notamment a fadace qui semble bien savoir manipuler cette option.

    Sinon, j'ai enfin réussi à faire une procédure stocké pour faire cette tache.
    Pour ceux que ça intéresse voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    CREATE PROCEDURE sp_purge_log
    	@DatabaseName varchar(128)
    AS
    BEGIN
     
    	-------------------------------------
    	-- déclarations et initialisations --
    	-------------------------------------
     
    	-- déclarations
    	DECLARE @LogFileID smallint, @CmdLine nchar(260)
     
    	-- initialisations
    	SET @LogFileID = 0
     
    	---------------------------------------------------------------------
    	-- recherche l'ID du fichier de log de la base de données à purger --
    	---------------------------------------------------------------------
     
    	-- préparation de la requete de selection du fichier de log
    	SELECT @CmdLine = 'USE ' + @DatabaseName + ' SELECT fileid FROM sysfiles WHERE (status & 64 = 64)'
     
    	-- création de la table temporaire qui vas recevoir le resultat de la requete
    	CREATE TABLE #tmp (fileid smallint)
     
    	-- lance la requete et ajoute le resultat dans la table temporaire
    	INSERT INTO #tmp EXEC(@CmdLine)
     
    	-- recuper le resultat de la table temporaire dans une variable
    	SET @LogFileID = (SELECT fileid FROM #tmp) 
     
    	-- détruit la table temporaire
    	DROP TABLE #tmp
     
    	---------------------------------------------------
    	-- purge le fichier de log si il a ete identifié --
    	---------------------------------------------------
     
    	-- si on a trouvé le fichier de log à purger
    	IF @LogFileID <> 0
    	BEGIN
    		-- backup (virtuel) du fichier de log
    		SELECT @CmdLine = 'USE ' + @DatabaseName + ' BACKUP LOG ' + @DatabaseName + ' WITH TRUNCATE_ONLY'
    		EXEC(@CmdLine)
     
    		-- purge le fichier de log
    		SELECT @CmdLine = 'USE ' + @DatabaseName + ' DBCC SHRINKFILE(' + STR(@LogFileID) + ')'
    		EXEC(@CmdLine)
    	END
    END
    GO
    Ensuite il suffit d'ajouter cette procédure dans un plan de maintenance qui s'exécute périodiquement.
    En espérant que ça serve à quelqu’un d'entre nous.
    @+.

  7. #7
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Le trunc log on checkpoint vide la partie inactive du journal de transactions (soient toutes les transactions terminées) à chaque checkpoint (soit plusieurs fois à la minute).

    Cette option peut être mise en place si l'on n'a pas de stratégies de backups par journaux de transaction (selon le modele 1) backup database 2) backup log 3) backup log ...).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MS-SQL8][SP3]Journal des Transactions
    Par LoDev dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/08/2007, 16h37
  2. [ASE 12.0] Checkpoint et purge du journal des transaction
    Par msomso dans le forum Adaptive Server Enterprise
    Réponses: 5
    Dernier message: 05/06/2007, 11h03
  3. [interbase] journal des transactions
    Par maamar1979 dans le forum InterBase
    Réponses: 4
    Dernier message: 03/10/2006, 11h47
  4. 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
  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