Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL > Administration
Administration Forum d'entraide sur l'administration de MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/09/2012, 12h03   #1
WinNew
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 51
Points : 11
Points : 11
Par défaut Afficher les verrous posés sur une base.

Bonjour à tous,

Récemment, un problème d'interblocage (deadlock) a affecté un de nos serveurs MySql.

Afin de détecter ce genre de problème rapidement, on m'a demandé de développer un outil.

Périodiquement, toutes les 5 minutes en l'occurrence, cet outil doit inspecter les bases de données à la recherche de verrous qui seraient posés depuis "trop longtemps" (nous allons définir des durées maximales d'existence des verrous pour chaque application).

J'ai effectué des recherches sur la façon d'obtenir une liste des verrous associés à une base.

J'ai trouvé deux pistes :
  • SHOW ENGINE INNODB STATUS
  • SHOW FULL PROCESSLIST

Mais, en effectuant des tests, j'ai l'impression que ces commandes ne permettent pas de "voir" les verrous.

Mon test est simple : sur un client MySql, je verrouille une table. Sur un autre client, je lance la commande, et j'observe le résultat.

Connaissez-vous un moyen de lister les verrous posés sur une base?

Il faut aussi avoir l'information suivante : pour chaque verrou, il faut savoir depuis combien de temps ce dernier est posé.

Note :

Citation:
mysql Ver 14.14 Distrib 5.1.49, for debian-linux-gnu (i486) using readline 6.1
Merci,

Denis
WinNew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2012, 14h22   #2
WinNew
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 51
Points : 11
Points : 11
Bonjour,

J'ai avancé sur la résolution du problème posé. Je suis capable de détecter des verrous, mais je ne suis pas capable d'obtenir la durée depuis laquelle le verrou est posé.

Pour obtenir la liste des tables verrouillées :

Exemple :

Code :
1
2
3
4
5
6
7
8
mysql> SHOW OPEN TABLES;
+-----------------+---------------------------------------+--------+-------------+
| DATABASE        | TABLE                                 | In_use | Name_locked |
+-----------------+---------------------------------------+--------+-------------+
| configuration   | cf_conf_type_node                     |      0 |           0 |
| configuration   | cf_node                               |      1 |           0 |
| echelon         | ech_dim_server                        |      0 |           0 |
...
Dans l'exemple ci-dessus, je peux voir que la table "cf_conf" est verrouillée.

C'est un premier pas. Mais je ne vois pas comment faire pour connaître "l'âge du verrou".

Avez-vous une idée?

Merci
WinNew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2012, 14h34   #3
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 690
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 690
Points : 2 812
Points : 2 812
Regarde du côté de InnoDB INFORMATION_SCHEMA tables
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2012, 15h28   #4
WinNew
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 51
Points : 11
Points : 11
Bonjour,

Je te remercie pour cette piste.

Cela dit, après réflexion, nous estimons qu'il existe une approche plus simple à mettre en oeuvre pour atteindre l'objectif.

Plutôt que d'examiner les verrous, nous examinons les requêtes.

Plus précisément : nous examinons la durée depuis laquelle une requête est en train de s'exécuter.

Cette information est fournie par la table suivante :

Code :
information_schema.PROCESSLIST
Nous allons détecter les requêtes qui mettent "trop de temps" à s'exécuter, en travaillant sur le contenu de cette table.

Le test est différent car la lenteur d'exécution d'une requête n'est pas forcément causée par un interblocage. Cela dit, nous sommes également intéressés pour connaître les requêtes "trop lentes" (pour cause d'interblocage ou autre).

Cordialement,

Denis
WinNew est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h44.


 
 
 
 
Partenaires

Hébergement Web