Tracer les ordres SQL dans vos serveurs MySQL

L’avantage des frameworks de mapping Objet/Relationnel comme Java Persistence API (JPA) est que, sauf pour de rares opérations, il n’est pas utile d’écrire du SQL. Si vous avez besoin de sélectionner certains entity beans qui correspondent à des critères pour vos opérations, vous pouvez utiliser JPQL. Très inspiré de SQL, le langage de requêtes de JPA s’applique aux instances de classes. Seulement voilà, quand on est de l’autre côté de la barrière, on aimerait bien savoir comment JPQL, les appels aux getter ou setter et le cycle de vie des objets dans le framework de persistence sont transformés en SQL… Il faut donc pour ça tracer/journaliser l’activité SQL sur vos bases de données.

Introduction

Les bases de données Oracle offrent tout un tas d’outils pour capturer les ordres SQL directement depuis les vues systèmes ou à l’aide de certains packages comme DBMS_MONITOR. Dans le cas de MySQL, vous pouvez également capturer un ensemble d’ordres SQL dans un fichier log ou dans une table à l’aide de la variable general_log.

Les informations capturées par le SQL Profiler ne sont pas disponibles depuis d’autres sessions. Par conséquent, ça n’en fait pas un outil très utile pour capturer des ordres SQL

Vérifier la version MySQL

Vous apprendrez vite à vérifier vos versions MySQL; les capacités de journalisation des ordres MySQL sont disponibles avec la version 5.1.6 ; il y a tout un tas de variations quant aux options par défaut jusqu’à la version 5.1.29. La commande ci-dessous permet de vérifier la version que vous utilisez :

$ mysqladmin -u root -p version
Enter password:
mysqladmin Ver 8.42 Distrib 5.1.49, for debian-linux-gnu on i686
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version 5.1.49-1ubuntu8.1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 20 hours 55 min 38 sec

Threads: 9 Questions: 23551 Slow queries: 0 Opens: 121 Flush tables: 1
Open tables: 28 Queries per second avg: 0.312

Activer la journalisation

Pour activer la journalisation, reportez-vous à la section correspondante de la documentation; voici un exemple ci-dessous qui active la journalisation dans un fichier :

mysql> show global variables like 'general_log%';
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/red.log |
+------------------+------------------------+
2 rows in set (0.00 sec)

Positionnez la variable à ON :

SET GLOBAL general_log = 'ON';

Vous pourrez suivre les changements dans le fichier avec la commande tail par exemple :

sudo tail -f /var/lib/mysql/red.log

Pour désactiver la journalisation, changez la valeur de la variable :

mysql> SET GLOBAL general_log = 'OFF';
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'general_log%';
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/red.log |
+------------------+------------------------+
2 rows in set (0.00 sec)

Et pour journaliser les ordres dans une table, utilisez la variable globale log_output.

1 réflexion sur “Tracer les ordres SQL dans vos serveurs MySQL”

  1. Si tu es sur le serveur en question tu peux simplement utiliser la commande mysqld -V (sans avoir à saisir de mot de passe) ou mysql -V à condition que la version du client soit la même que celle du serveur

Les commentaires sont fermés.