|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Bonjour, j'ai actuellement un gros problème avec une base sql express 2005 : plusieurs pc de supervision écrivent des logs dans une même table. Cependant, j'ai souvent ce message d'erreur : "The ODBC Database destination failed to send message to the database. Reason: La transaction (ID de processus X) a été bloquée sur les ressources verrou par un autre processus et a été choisie comme victime. Réexécutez la transaction."
X correspondant à un pc. Comment faire pour éviter ce deadlock ? Merci et bonne journée. |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
En général les deadlock sont du à un mauvais développement des applications :
1) transactions inutiles 2) verrouillage explicite 3) pilotage incorrecte du niveau d'isolation des transactions. Et surtout lorsque les applications sont écrites à l'aide de d'ORM ou de Framework catastrophiques comme Hibernate par exemple. A lire : http://img1.lemondeinformatique.fr/f...s-epaisses.pdf Pour les détecter, utilisez le profiler SQL et tracez les événements de deadlock. Voir : http://sqlpro.developpez.com/sqlserv...ge=tsql#LIII-M Ensuite il vous faudra remonter cela aux développeurs et surtout commencer par les former !!!!!!!! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
20
|
|
|
#3 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Merci pour ta réponse rapide SQLpro.
Comment accéder aux traces et à SQL profiler ? |
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Depuis SQL Server Management Studio, dans le menu Outils choisissez SQL Server Profiler : une nouvelle GUI s'ouvre Une fois connecté à votre instance, dans l'onglet "Général", cochez la case "Enregistrer dans le fichier" et spécifiez où vous souhaitez stocker le fichier de trace. En général, si la trace est bien filtrée, le fichier n'occupe que quelques Mo. Une fois cela fait, passez dans l'onglet "Sélection des événements". Décochez toutes les cases à gauche : vous n'en avez pas besoin (dans votre cas), puis réduisez tous les nœuds. Une fois cela fait, cochez "Afficher tous les événements" et "Afficher toutes les colonnes". Dans la catégorie "Locks", cochez la case "Deadlock graph". C'est cet événement qui va vous permettre : - de capturer les requêtes participant à un verrou mortel - de connaître les ressources qui participent aux requêtes et au verrou mortel - de connaître le verrouillage utilisé - de visualiser le tout sous la forme d'un graphe. Au moment où vous allez cocher cette case, vous verrez apparaître un onglet nommé "Paramètres d'extraction des événements". Si vous le souhaitez, vous pouvez "Sauvegarder les événements Deadlock XML séparément" dans un dossier de votre choix, ce qui vous permettra de les distribuer à vos collègues facilement. Ce n'est pas obligatoire pour capturer les deadlocks. Une fois cela fait, il ne vous reste plus qu'à cliquer sur le bouton "Exécuter" ... et à attendre qu'un deadlock se produise. A ce moment là vous aurez une nouvelle ligne dans la partie supérieure de la nouvelle fenêtre. Il vous suffira de cliquer dessus pour voir apparaître le graphe du deadlock. En passant le curseur sur les divers éléments du graphe, vous en apprendrez un peu plus Une fois cela terminé, n'oubliez pas de sauvegarder la trace (CTRL+S) puis de l'arrêter avec le bouton stop dans la barre d'outils (sinon elle continuera de tourner). Si vous souhaitez voir une telle trace s'exécuter en tâche de fond côté serveur, vous pouvez regarder le tutoriel que j'ai publié à ce sujet. Bonne chance @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
20
|
|
|
#5 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Merci beaucoup mais dans outils je n'ai que "external tools, customize, options". Cela est peut être dut à la version express de sql server ?
|
|
|
00
|
|
|
#6 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
Avec SQLExpress le profiler n'est pas disponible.
Cependant il existe des outils tiers qui permettent de faire cela (avoir si les événements deadlock sont disponibles, je n'ai pas testé). Une autre solution de contournement si vous avez une autre edition d'installée en local ou en réseau est d'utiliser le profiler disponible de l'édition en question. Enfin une dernière solution serait d'activer le trace flag 1222 au démarrage du serveur SQL qui permet de tracer les deadlocks depuis le moteur de bases de données. A essayer avec l'édition Express mais je ne pense pas que cela pose problème. ++ |
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Pour créer une trace c'est bien ce code ?
"sp_trace_create [ @traceid = ] trace_id OUTPUT , [ @options = ] option_value , [ @tracefile = ] 'trace_file' [ , [ @maxfilesize = ] max_file_size ] [ , [ @stoptime = ] 'stop_time' ] [ , [ @filecount = ] 'max_rollover_files' ] " Désolé je me suis mis à SQL depuis peu alors les traces j'en ai pas trop entendu parler. En tout cas merci tout le monde pour votre aide parce que ici c'est vraiment l'impasse. |
|
|
00
|
|
|
#8 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Effectivement votre code doit marcher. Le problème, ce sera pour ouvrir le fichier ensuite ... Vous pouvez toujours utiliser fn_trace_gettable, mais vous n'aurez pas les graphes. Je me rappelle avoir succinctement utilisé le logiciel que SQLPro vous recommande, mais je n'avais pas cherché à l'utiliser pour les deadlocks. De toute façon, cela ne vous coûte rien de le tester @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#9 | ||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Pas besoin du profiler....
1) créer une trace lancez ce script en modifiant préalablement le répertoire de stockage des fichiers de trace ou bien en créant le répertoire C:\MesTraceProfilerSQL\ Code :
Retenez le n° qui est affiché et qui va servir à arrêter ultérieurement la trace. Laissez tourner autant de temps que nécessaire (plusieurs jours si vous voulez). Pour arrêter la trace, modifiez le script ci dessous en remplaçant les ??? par le n° affiché précédemment et lancez le code suivant : Code :
3) intégration des données en table Pour intégrer les fichiers de trace dans une table, faites : Code :
Pour voir un rapport de deadlock il suffit de cliquer double sur le XML du deadlock graphe ce qui ouvrira une fenêtre de visualisation. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||||
|
20
|
|
|
#10 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
J'ai réussi à créer la trace et à l'extraire dans une table. Comment effectue t'on un deadlock graph dans sql server express ? Car j'ai extrait les données dans un tableur excel mais je doute que cela puisse nous aider.
Merci pour vos réponses |
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
La colonne TextData doit contenir un document XML.
Essayez de le coller dans un fichier texte dont vous changez l'extension par xdl, et voyez si vous pouvez l'ouvrir avec SQL Server Management Studio. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#12 | ||
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Je pense peut être connaître la cause du problème : étant donné que j'ai beaucoup d'informations inutiles qui arrivent sur ma base, pour en limiter le poids j'ai créée des triggers de suppression par exemple :
Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() ![]() |
il y'a même un tuto dans notre section sur les tutos.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#14 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Il faut reconnaître que c'est assez dommage d'insérer un tuple pour le supprimer juste ensuite :
- cela ne sert à rien - cela rallonge la durée de la transaction inutilement - cela augmente la quantité de maintenance des index de la table ... Pour éviter cela : - soit vous faites un contrôle avant l'INSERT, en filtrant la donnée - soit vous ajoutez une contrainte de domaine (CHECK) - soit vous écrivez un trigger INSTEAD qui se substituera à l'INSERT, et dans lequel vous pourrez filtrer les données. Cela dit, je pense que ce type de "filtrage" peut tout à fait être réalisé en amont. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
10
|
|
|
#15 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Le problème est bien due au trigger de suppression, puisque je les ai supprimés et là plus de DeadLock, en regardant dans le moniteur d’activités, j'ai vu que les opérations DELETE étaient interminables.
Cependant, je dois réellement filtrer ces données mais en amont je n'ai pas l'impression de pouvoir le faire, je peux juste créer le lien ODBC et configurer la fréquence des insertions. Est-il possible de déclencher mon Trigger de suppression avant chaque instruction d'insert et non pas à chaque insertion d'enregistrement ? Et juste un petit problème de syntaxe, comment effectuer une requête SQL sur plusieurs ligne ? Merci beaucoup pour vos réponses, on y est presque. |
|
|
00
|
|
|
#16 | ||||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Cela dit le traitement est de toute façon à changer. Citation:
Donc le "filtrage" des données devrait être implémenté dans cette application. Citation:
On peut aisément les "remplacer" par un trigger INSTEAD OF comme celui qui suit, et qui va se substituer à l'INSERT : Code :
Citation:
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||||
|
20
|
|
|
#17 |
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
En fait, les instructions DELETE sont interminables étant donné qu'elles vérifient à chaque enregistrement si aucun autre enregistrement dans la table contient les mots clés (environ une bonne 20aine). Sachant que j'ai plusieurs enregistrements inutiles qui arrivent par seconde, à chaque on ré effectue le trigger. Voilà pourquoi j'aurai voulu savoir si avant chaque requête, il était possible de lancer le trigger et non sur chaque enregistrement.
Le logiciel en amont est RSVIEW, je peux filtrer certaines données : ![]() Cependant c'est un filtrage très vague et même si pas mal de données sont éliminées, il m'en reste 90% à supprimer. EDIT : j'ai essayé d'insérer une image mais ça n'a pas fonctionné voici le lien : http://img855.imageshack.us/i/temp1n.jpg/ Concernant la syntaxe de saut de ligne pour une requête, j'ai oublié de préciser que ma requête en question était sous VBA et le simple saut à la ligne ne marche malheureusement pas. Merci pour ton aide. Bonne journée |
|
|
00
|
|
|
#18 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Si la colonne n'est pas indexée, (le faire dans votre cas ne présente aucun avantage), alors le balayage de la table est obligatoire, et plus vous avez de lignes, plus la requête est lente. Citation:
Citation:
Citation:
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
20
|
|
|
#19 | |||
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
Citation:
++ |
|||
|
20
|
|
|
#20 | ||||
|
Invité régulier
![]() Inscription : janvier 2011 Messages : 34 ![]() |
Citation:
Citation:
Merci pour votre aide, bonne journée EDIT : ElSuket, j'ai essayé votre code et malheureusement cela ne fonctionne pas. Code :
|
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com