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 :

Annuler l'écriture dans le journal de transaction


Sujet :

Administration SQL Server

  1. #1
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut Annuler l'écriture dans le journal de transaction
    Bonjour,
    est il possible d'annuler l'écriture dans le journal de transaction? si oui comment le faire?
    Merci d'avance pour vos aides.

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par AJemni Voir le message
    Bonjour,
    est il possible d'annuler l'écriture dans le journal de transaction? si oui comment le faire?
    Merci d'avance pour vos aides.
    La réponse est NON. SQL server comme tous les SGBD a besoin d'1 journal de transaction pour écrire toutes les transactions effectuées sur les bases. Quand on démarre SQL server, le moteur lit d'abord ce journal "intime" pour identifier ce qu'il doit commencer par faire, concernant l'état des objets... Sans ce journal, pas de base...

    A+

    Etienne ZINZINDOHOUE
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    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
    Bonsoir,

    Est il possible d'annuler l'écriture dans le journal de transaction? si oui comment le faire?
    Quelle drôle d'idée vous avez !!
    Quelle idée avez vous derrière cette question ? Que voulez vous faire exactement ?

    ++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Si vous préférez vous passer d'un journal de transactions, alors utilisez des fichiers COBOL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    mon besoin est le suivant :
    j'ai un très grand fichiers texte de l'ordre de 1.5 Go de taille, mon application C# utilise un objet SqlBulkCopy du frameWork 2.0, cet objet se base essentiellement sur Bulk Insert (c'est exactement comme bcp)
    le problème c'est que lors de l'exécution du prg les ressources occupées par Sql Server augmente constamment et il atteint 1.5Go de ram et puis le prg se crache en me signalant un dépassement de délais d'attente.
    alors j'ai eu l'idée de s'en passer de l'écriture dans le fichiers journal car jamais je ferais une restauration et si une erreur apparait dans l'insertion je refais tous.

    Si quelqu'un a une idée qui me permet d'insérer tous mes données dans la base sans que le serveur bouffe tous les ressources je serai ravis de la connaitre.
    Merci d'avance

  6. #6
    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 : 42
    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,

    Le fait que SQL Server consomme toute la mémoire disponible est tout à fait normal.
    En effet, il travaille exclusivement en RAM pour diminuer les temps de traitement.
    Pensez à ce que cela donnerait si tous les accès aux données se faisaient depuis ou vers le disque : une lenteur exceptionnelle

    En revanche pour éviter de faire gonfler le fichier du journal de transactions pour vos opérations d'import en masse, vous pouvez utiliser le mode de récupération BULK_LOGGED :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE maBD SET RECOVERY BULK_LOGGED
    @++

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Points : 1 069
    Points
    1 069
    Par défaut
    Il faudra en plus de BULK_LOGGED vérifier s'il n'y a pas de contrainte, de trigger sur la table et idéalement pas d'index, de clé primaire avant de charger, etc... BULK INSERT a une propriété TABLOCK pour verrouiller toute la table avant d'importer, il doit y avoir un équivalent dans SqlBulkCopy.

    * http://msdn.microsoft.com/en-us/library/ms190421.aspx
    David B.

  8. #8
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par AJemni Voir le message
    Bonjour,
    mon besoin est le suivant :
    j'ai un très grand fichiers texte de l'ordre de 1.5 Go de taille, mon application C# utilise un objet SqlBulkCopy du frameWork 2.0, cet objet se base essentiellement sur Bulk Insert (c'est exactement comme bcp)
    le problème c'est que lors de l'exécution du prg les ressources occupées par Sql Server augmente constamment et il atteint 1.5Go de ram et puis le prg se crache en me signalant un dépassement de délais d'attente.
    alors j'ai eu l'idée de s'en passer de l'écriture dans le fichiers journal car jamais je ferais une restauration et si une erreur apparait dans l'insertion je refais tous.
    Votre application C# est-elle hébergée sur la même machine que le serveur SQL ?
    Si oui, alors il faut envisager avoir un serveur SQL dédié, c'est à dire séparé ton appli de l'SGBD,
    pour enfin allouer suffisamment de mémoire à SQL (commutateur /3GB ou AWE selon la config du serveur),....
    A +

    Etienne ZINZINDOHOUE
    Etienne ZINZINDOHOUE
    Billets-Articles

  9. #9
    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
    il doit y avoir un équivalent dans SqlBulkCopy
    Tout à fait, par défaut sqlBulkCopy n'utilise pas l'option TABLOCK. (à OFF)

    L'option est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... SqlBulkCopyOptions.TableLock
    ... cependant attention aux locks qui pourront être éventuellement générés pendant la phase d'import ... A prendre en compte

  10. #10
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    Merci à vous tous, le problème est résolut (ou presque )
    en faite, j'ai, en quelque sorte, tout combiné :
    - En modifiant le Modèle de journalisation en "Journalisé en Bloc" (elsuket)
    - En supprimant ensuite l'index sur la table (clé primaire) avant l'insertion en bloc mais sans ajouté l'option TableLock(dbaffaleuf)
    - En plus, en modifiant l'espace alloué a chaque fichier .ldf et .mdf car la base "model" qui est le modèle de chaque nouvelle base créer contient comme config : 1Mo d'espace alloué pour chaque fichier et la croissance des fichier est définit à 10%, et mon nouveau config défini est : 2000Mo pour le fichier mdf, 1000Mo pour ldf et 1000Mo comme croissance des fichiers.
    - Coté C# j'ai modifié un peut le code : mon prg exécute la SqlBulkCopy.WriteToServer pour une DataTable qui contient 5000 lignes (a chaque 5000 ligne je lance la BulkInsert car si je rempli la DataTable par le fichier en entier qui est de taille 1.5Go le programme se crache dés le début avec une execption OutOfMemoryException ), c'est à dire que l'appel à BulkCopy est repétitif. Certe, le constructeur de SqlBulkCopy a 4 surcharges parmi eux 2 qui acceptent un seul paramètre : le premier string (une chaine de connexion) et le second SqlConnection, au début j'ai travaillé avec le premier (type de paramètre string) mais il parait que bulkcopy ouvre à chaque appel une connexion au serveur (appel en boucle de SqlBulkCopy) ce qui consomme un petit peux en plus les ressources, alors j'ai travaillé avec le deuxième constructeur avec une connexion ouverte au début de traitement.

    et après toutes ces modifications l'insertion se fait en 20min et l'ajout de l'index (primary key) coule 9min
    mais il reste un souci : au cours du traitement la mémoire occupé par sql Server ne cesse d'augmenter et se stabilise à 1.4Go et quand tout le traitement s'achève la mémoire occupé par le serveur SQL reste toujours 1.4Go ce qui m'oblige à redémarrer le serveur , un vrai problème : j'ai pas le droit de redémarrer le serveur sql !!!
    Comment faire pour actualiser le serveur?

  11. #11
    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
    Une fois que SQL Server a reservé sa mémoire pour son utilisation il ne la libérera pas à moins d'y être contraint par une demande du système d'exploitation.

    En fonction de la quantité de mémoire de votre serveur vous pouvez limiter la mémoire maximum que pourra prendre SQL Server.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC sp_configure 'max server memory (MB)'', <valeur>
    ++

  12. #12
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Merci mikedavem,
    je vais essayer de limiter la mémoire max de SQL Server et je verrai l'impact sur l'exécution du prg.

  13. #13
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Salut,
    J'ai modifié la taille mémoire de mon serveur local à 1000 MB (ancienne valeur 2048 MB) et le traitement d'insertion en bloc est achevé mais avec un temps plus grand (~60min) et l'espace mémoire occupé par le serveur SQL reste stable à 820MB. la modification est sur ma machine local car je ne peux rien modifier dans le serveur puisque je ne suis pas un admin sur le serveur et que plusieurs autres base sont attachées.
    Merci à vous et maintenant je sais que mon fichier contenait 9.487.191 lignes

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

Discussions similaires

  1. Intercepter l'écriture dans le journal d'événement windows
    Par lejert dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 18/04/2013, 11h51
  2. Réponses: 3
    Dernier message: 08/03/2011, 13h32
  3. Accorder les droits d'écriture dans le journal d'évènement
    Par Tristan Zwingelstein dans le forum Sécurité
    Réponses: 5
    Dernier message: 09/02/2010, 18h59
  4. Réponses: 9
    Dernier message: 14/08/2008, 15h12
  5. Réponses: 2
    Dernier message: 26/09/2007, 11h48

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