Circum Blog

Circum Net – IT – Conseils pratiques

MySQL et le fichier journal

Bases de données, MySQL

Démarré avec le paramètre ‘–log-bin[=file_name]’, le serveur mysql enregistre dans un fichier de logs (fichier journal) toutes le commandes SQL ayant donné lieu à des modifications de données.

L’intérêt d’un tel fichier, dans le cadre d’une politique de backup du serveur, est de pouvoir plus facilement récupérer les dernières opérations sur les données en cas d’arrêt brutal du système (coupure d’alimentation, plantage du système, etc.). Il constituera la source pour la ré-exécution des requêtes qui ont eu lieu après la dernière sauvegarde.

Lancement via la ligne de commande :

> bin\mysqld-nt –log-bin standalone

L’activation du système de logging peut également être réalisée via le fichier de configuration du serveur (my.ini ou my.cnf) en y ajoutant –sous la rubrique [mysqld]- la clause suivante :

set-variable=log-bin=[dir_path]

exemple :

set-variable=log-bin=c:/mysql/data

Si aucun nom de fichier n’est précisé en argument alors le système utilise et stocke les informations dans un fichier portant le nom de la machine hôte suivi du suffixe ‘-bin’. Le répertoire par défaut pour l’écriture de ce fichier est le répertoire de données du serveur (‘data’ ou ‘var’).

Il est possible d’analyser le contenu du fichier de logs avec l’utilitaire ‘mysqlbinlog’ qui se trouve dans le répertoire ‘bin’ de votre installation.

> bin\mysqlbinlog E:\dbdata\mysql\GRD-Laptop-bin.001

Pour rafraîchir, sauvegarder et remettre à zéro les fichiers de logs, il faut utiliser l’exécutable ‘mysqladmin’.

> bin\mysqladmin flush-logs



Requête multi-bases de données

Bases de données, MySQL

En MySQL, il est tout-à-fait possible de mettre en relation (jointure) plusieurs bases de données afin de répondre à une requête d’information.

Pour réaliser cela, rappelons d’abord qu’une jointure se fait en imposant l’égalité des valeurs d’une colonne d’une table à une colonne d’une autre table. Dans notre cas, il suffira d’indiquer clairement au compilateur la provenance de chacune des colonnes concernées par la mise en relation. Ainsi, chaque colonne devra être précédée du nom de la base de données (suivi d’un point) et du nom de la table (suivi d’un point).

db_name.table.name.column_name

Exemple d’une requête multi-bases

SELECT db1.clients.nom, db1.clients.adresse, db2.membres.statut
FROM db1.clients, db2.membres
WHERE db2.membres.cotisation IS ‘OK’ AND db1.clients.id = db2.membres.id


Regrouper et compter les valeurs identiques

Bases de données, MySQL

Voici un exemple de code SQL supporté par MySQL permettant de repérer dans une table les enregistrements qui présentent des valeurs identiques pour certains champs.

Sélection sur base de champs à valeurs identiques:

SELECT name, count(name) as cnt
from students
group by name
having cnt > 1
order by cnt;

Cette requête met en évidence les noms (valeur du champ “name”) qui se retrouvent à plusieurs reprises dans la table des étudiants (“students”).

Réponse :

+-----------------------+-----+
| name                  | cnt |
+-----------------------+-----+
| Lewis                 |   2 | 
| Brown                 |   2 | 
| Scott                 |   2 | 
| Williams              |   2 | 
| Harper                |   3 | 
| Bartlet               |   4 | 
| Sanchez               |   6 | 
| Bush                  |   9 | 
+-----------------------+-----+


Sélection enregistrée dans un fichier

Bases de données, MySQL

La commande ‘SELECT’ accompagnée de l’option ‘INTO OUTFILE’ permet d’enregistrer les lignes de réponses obtenues pour la requête dans un fichier sur disque.

Syntaxe:

SELECT … INTO OUTFILE ‘nom_du_fichier’ [options_exportation];

Exemple d’utilisation :

mysql> SELECT * FROM users INTO OUTFILE ‘/temp/save1.csv’ FIELDS TERMINATED BY ‘|’ LINES TERMINATED BY “\r\n”;

Cette instruction a pour résultat la sélection de tous les attributs de la table ‘users’ et l’enregistrement des lignes de réponse dans le fichier ‘/temp/save1.csv’. Si le chemin d’accès du fichier de sauvegarde n’est pas absolu la sauvegarde s’effectue dans le répertoire de données de la DB (ex : /mysql/data/nom_de_la_db).

Contenu du fichier save1.csv :

1|Albert|Olivier|Olivier.Albert@sky.net|admin
2|Decy|Serge|Serge.Decy@sealife.be|admin
3|Callet|Anne||support
4|Licour|Luc|Luc.Licour@laposte.be|guest

Pour s’assurer de la consistance de l’enregistrement sur disque à partir d’un SELECT on peut également utiliser les commandes LOCK et UNLOCK TABLES :

mysql> LOCK TABLES users READ;
mysql> SELECT * FROM users INTO OUTFILE ‘/Temp/save1.csv’;
mysql> UNLOCK TABLES;