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

Développement SQL Server Discussion :

transaction log qui explose


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut transaction log qui explose
    Bonjour,

    J'ai une base de donnée d'environ 30Go. Le recovery mode est "simple".

    J'ai une requête qui crée 135Go de transaction log... est-ce normal ? Je veux dire... pourquoi loguer la transaction : on restaure un back-up, dans ce cas, non ?

  2. #2
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Il est normal que même en mode simple, l'opération soit enregistré dans le journal ... En cas d'annulation de l'opération cela permet de relire ce journal pour effectuer un rollback.

    ++

  3. #3
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Oui, mais une opération de 135Go pour une base de 31Go, n'est-ce pas abusif ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je trouve quand même bizarre que la taille de votre journal des transactions soit plus de 4 fois plus gros que votre base de données.
    Quelle est donc cette requête ?

  5. #5
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Je dirais même plus ... quelle est donc cette requête ?

    ++

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Oui, alors... Cette requête ???

    Bonne vieille méthode :A +

  7. #7
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    A priori, c'est ici que ça explose (@withcheckpoint vaut 1) :

    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
    if @withcheckpoint = 1
    		begin
    			checkpoint
    		end
     
    		set @step = 'Lines to create are marked with TO_CREATE = 1'
    		if (@verbose = 1) exec dbo.ELL_Insert @ok = 1, @action = @action, @step = @step , @message = ' starting...'
     
    		insert
    			dbo.PCS_PROVIDERCITYSERVICE
    			(PVD_EXTERNAL_ID, SRV_EXTERNAL_ID, INSEE_CODE, TO_CREATE)
    			select
    				 PVD_EXTERNAL_ID, SRV_EXTERNAL_ID, INSEE_CODE, 1
    			from
    				dbo.PCS_PROVIDERCITYSERVICE_TEMP tmp
    			where
    				tmp.PCT_STATUS <> 3 and tmp.PSH_STATUS <> 3 
    		except
    			select
    			 PVD_EXTERNAL_ID, SRV_EXTERNAL_ID, INSEE_CODE, 1
    			from
    				dbo.PCS_PROVIDERCITYSERVICE pcs
     
     
    		if @withcheckpoint = 1
    		begin
    			checkpoint
    		end
    Du moins, ce bloc est dans un try catch (avec plein d'autres traitements sur les tables PCS), et, quand je n'ai que 90Go de disque sur le serveur, le catch récupère l'erreur avec le step : 'Lines to create are marked with TO_CREATE = 1'

    On a dans la table PCS_PROVIDERCITYSERVICE_TEMP environ 57 millions de lignes, et la table PCS_PROVIDERCITYSERVICE est vide, à ce moment là (c'est la 1ère insertion)


    Les scripts de création des tables :
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    USE [D_EAF_ETL]
    GO
    /****** Object:  Table [dbo].[PCS_PROVIDERCITYSERVICE]    Script Date: 04/08/2010 18:02:31 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[PCS_PROVIDERCITYSERVICE](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[PVD_EXTERNAL_ID] [varchar](36) NOT NULL,
    	[SRV_EXTERNAL_ID] [varchar](36) NOT NULL,
    	[INSEE_CODE] [varchar](10) NOT NULL,
    	[PVD_ID] [int] NULL,
    	[SRV_ID] [int] NULL,
    	[GEO_ID] [int] NULL,
    	[TO_CREATE] [bit] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_TO_CREATE]  DEFAULT ((0)),
    	[TO_UPDATE] [bit] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_TO_UPDATE]  DEFAULT ((0)),
    	[TO_DELETE] [bit] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_TO_DELETE]  DEFAULT ((0)),
    	[CREATION_DATE] [datetime] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_CREATION_DATE]  DEFAULT (getdate()),
    	[UPDATE_DATE] [datetime] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_UPDATE_DATE]  DEFAULT (getdate()),
     CONSTRAINT [PK_PCS_PROVIDERCITYSERVICE] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE]  WITH CHECK ADD  CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_GEO_GEOGRAPHY] FOREIGN KEY([GEO_ID])
    REFERENCES [dbo].[GEO_GEOGRAPHY] ([ID])
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE] CHECK CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_GEO_GEOGRAPHY]
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE]  WITH CHECK ADD  CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_PVD_PROVIDER] FOREIGN KEY([PVD_ID])
    REFERENCES [dbo].[PVD_PROVIDER] ([ID])
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE] CHECK CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_PVD_PROVIDER]
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE]  WITH CHECK ADD  CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_SRV_SERVICE] FOREIGN KEY([SRV_ID])
    REFERENCES [dbo].[SRV_SERVICE] ([ID])
    GO
    ALTER TABLE [dbo].[PCS_PROVIDERCITYSERVICE] CHECK CONSTRAINT [FK_PCS_PROVIDERCITYSERVICE_SRV_SERVICE]
     
    USE [D_EAF_ETL]
    GO
    /****** Object:  Table [dbo].[PCS_PROVIDERCITYSERVICE_TEMP]    Script Date: 04/08/2010 18:02:57 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[PCS_PROVIDERCITYSERVICE_TEMP](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[PVD_EXTERNAL_ID] [varchar](36) NOT NULL,
    	[SRV_EXTERNAL_ID] [varchar](36) NOT NULL,
    	[INSEE_CODE] [varchar](10) NOT NULL,
    	[PCT_STATUS] [smallint] NOT NULL,
    	[PSH_STATUS] [smallint] NOT NULL,
    	[CREATION_DATE] [datetime] NOT NULL CONSTRAINT [DF_PCS_PROVIDERCITYSERVICE_TEMP_CREATION_DATE]  DEFAULT (getdate()),
     CONSTRAINT [PK_PCS_PROVIDERCITYSERVICE_TEMP] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    SET ANSI_PADDING OFF

  8. #8
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    D'autres index sur la table [dbo].[PCS_PROVIDERCITYSERVICE] ?

    En faisant des insertions en masse de 57 millions de lignes cela ne me parait pas étonnant .. si vous avez en plus d'autres index, chaque ligne d'index est également journalisé ...

    A voir également si l'ensemble de votre code n'est pas encapsulé dans une transaction ... auquel cas viennent s'ajouter également les différents traitements dans le bloc try ...

    Je ne pense pas que vous ayez besoin de faire des CHECKPOINT surtout que ceux-ci ne pourront être effectifs qu'après la fin d'une transaction et vous êtes en mode de récupération SIMPLE qui plus est ..

    Vous pouvez utiliser l'instruction DBCC SQLPERF(LOGSPACE) pour voir l'évolution de remplissage du journal
    ++

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Si la table dbo.PCS_PROVIDERCITYSERVICE est recréée implicitement à chaque execution du traitement et que tu es en mode de récup SIMPLE ou BULK-LOGGED, je te conseillerais de créer cette table avec la commande SELECT INTO. L'avantage est que l'insertion se fait avec un minimum de journalisation. A la fin de l'insert, il suffit de créer les contraintes sur la table.

    C'est très efficace sur ce genre de volumes mais cela ne vaut que si PCS_PROVIDERCITYSERVICE est vide au départ bien entendu.

    http://msdn.microsoft.com/en-us/library/ms188029.aspx

Discussions similaires

  1. OLEDISP2.cpp qui explose
    Par tazamorte dans le forum Visual C++
    Réponses: 2
    Dernier message: 31/08/2006, 14h52
  2. [DEBUTANT]Supprimer et/ou vider les transaction Log
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/05/2006, 21h46
  3. Réponses: 2
    Dernier message: 19/05/2006, 11h11
  4. Transaction log files
    Par abelman dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/11/2005, 17h00
  5. HELP!!Base de Données tempdb qui explose!!
    Par mohamed dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 15/07/2005, 13h32

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