6.3. Notions de base

MySQL est un SGBD particulièrement simple à mettre en œuvre, mais quelques notions sont nécessaires afin d'en saisir son fonctionnement.

6.3.1. Fichier de configuration

Le fichier de configuration de MySQL est traditionnellement my.cnf qui, sous Ubuntu, est situé dans /etc/mysql. Dans les versions récentes (> 5.0.4b), MySQL peut aussi include des fichiers de configuration depuis le fichier de configuration principal. A l'instar d'Apache, on trouve donc un sous-répertoire conf.d dans lequel on peut déposer des « bouts » de configuration complémentaires.

Le fichier de configuration contient des paramètres système, mais les différentes bases de données et les utilisateurs MySQL sont directement stockés dans une base de données spécifique appellée mysql.

6.3.2. Utilisateurs

MySQL possède ses propres utilisateurs, complètement distincts du système. Même si MySQL possède par défaut un utilisateur root, il n'a rien avoir avec le root du système. L'intéret est de pouvoir décorreler la responsabilité du système de celle de la base de données, qui est habituellement gérée par un DBA.

6.3.3. Bases de données

Lorsque des données doivent être stockées sur un SGBD, elles le sont dans des tables représentant des données d'un type particulier. Par exemple, une table pourra contenir une liste de communes, une autre une liste de personnes. Dans ce cas, une commune occupera une « ligne » (appellé aussi un enregistrement) dans la table des communes et un individu occupera un enregistrement dans la table des personnes.

Toutes les données qui ont un lien entre elles seront regroupées au sein d'une même base de données. Par exemple, les entrées de la table personnes peuvent être liées à une entrée de la table communes par leur adresse et seront donc logiquement dans la même base de données.

MySQL stocke ses bases de données sous /var/lib/mysql/. Si des optimisations du système de fichier (journalisation, noatime, utilisation du RAID, etc...) sont requises, il faudra donc cibler la branche /var/lib/mysql/. Il n'est en revanche pas recommandé de sauvegarder les bases telles qu'elles : on obtiendrait probablement des données sauvegardées corrompues car modifiées en cours de backup. On privilégiera la sauvegarde à froid (service MySQL arreté) ou la sauvegarde d'un dump (export SQL) de la base (voir Section 6.7, « Sauvegarde et restauration de bases »).

6.3.4. Outils

Par défaut, les outils mysql (mysql, mysqladmin, mysqldump, ...) vont tenter de se connecter à la base de données « en tant que » l'utilisateur unix courant. Par exemple, si l'utilisateur Unix root utilise la commande mysqladmin, cette dernière utilisera les droits de l'utilisateur MySQL root. [15]. On pourra spécifier un nom d'utilisateur à tous les outils MySQL en utilisant l'option -u.

Deux autres options sont à noter. Tout d'abord, -p permet de spécifier le mot de passe pour la connexion. C'est à éviter en ligne de commande, mais parfois obligatoire dans les scripts. On veillera alors à mettre des droits restreints afin que n'importe qui ne puisse pas lire le script et obtenir le mot de passe. Si -p n'est pas suivi par le mot de passe, l'outil le demandera de manière intéractive. On privilégiera cet usage afin de ne pas laisser de trace dans l'historique de commandes[16].

Enfin -h permet de spécifier le nom de l'hôte auquel l'on veut se connecter.

  • mysql : ligne de commande mysql qui permet d'exécuter des requètes SQL dans la base de données. S'utilise soit comme un shell (on l'invoke, puis on saisit des commandes), soit en lui envoyant des ordres SQL depuis l'entrée standard (via l'opérateur de redirection du shell « < » ou par le biais d'un pipe).

  • mysqladmin : utilitaire d'administration mysql, permettant de créér/supprimer des utilisateurs, changer des mots de passe, créer/supprimer des bases de données, démarrer/stopper le serveur, ...

  • mysqldump : permet de faire un export d'une base de données (et/ou de sa structure).

  • mysqlshow : permet d'afficher des informations sur une base, les tables d'une base, etc...

6.3.5. SQL par l'exemple en 3 minutes

Le langage SQL permet de lire, modifier et supprimer des données dans une base de données relationnelle. Quelques opérations de base sont données ici. On se reportera à la masse de tutoriaux disponibles en ligne pour approfondir le sujet. C'est un language relativement simple dans la mesure ou il est assez proche du langage naturel.

6.3.5.1. SELECTionner des données

La construction SELECT permet d'obtenir une liste de colonnes d'enregistrements issus d'une table. Prenons par exemple la table suivante :

Tableau 6.1. Exemple SQL : Table des Génies

NomPrenomAnneeNaissance
CoxAlan1968
KnuthDonald1938
TovaldsLinus1969
TuringAlan2912
GatesBill1955
EinsteinAlbert1879


Nous pourrions demander la liste de tous les enregistrements de la table avec la requète[17] :

SELECT * FROM Genies;

Si nous ne voulons que les prénoms, nous pourrions faire :

SELECT Prenom FROM Genies;

Si nous voulons nom et prénom, il suffit de faire :

SELECT Nom,Prenom FROM Genies;

Maitenant, nous ne voulons que les génies qui se prénomment Alan, nous utiliserions la clause WHERE, qui permet de filtrer les enregistrements sélectionnés :

SELECT * FROM Genies WHERE Prenom='Alan';

Nous pouvons chercher les génies nés avant le XXème siècle :

SELECT * FROM Genies WHERE AnneeNaissance <= 1900;

Nous pourions aussi combiner plusieurs « filtres » et demander la liste des 'Alan' nés après 2000 :

SELECT * FROM Genies WHERE Prenom='Alan' AND AnneeNaissance >= 2000;

Simple !

Le caractère « % » sert de wildcard (joker) en SQL : il permet de remplacer n'importe quoi. Mais si on l'utilise, on doit remplacer « = » par LIKE :

SELECT * FROM Genies WHERE Prenom LIKE 'A%';

permet de sélectionner tous les enregistrements dont la première lettre du champ « Prenom » est « A ».

6.3.5.2. Mettre à jour (UPDATE) les données

Le mot clef UPDATE permet de mettre à jour les enregistrements correspondant à la clause WHERE désirée (ou tous les enregistrements s'il n'y a pas de clause where).

Dans la table exemple, nous nous sommes visiblement trompés de siècle pour Alan Turing. Pas de problème :

UPDATE Genies SET AnneeNaissance=1912 WHERE Prenom='Alan' AND Nom='Turing';

ou encore plus simple, si c'est le seul enregistrement ayant 2142 comme année de naissance :

UPDATE Genies SET AnneeNaissance=1912 WHERE AnneeNaissance=2142;

Idem pour changer tous les 'Bill' en 'William' :

UPDATE Genies SET Prenom='William' WHERE Prenom='Bill';

6.3.5.3. Supprimer (DELETE) des enregistrements

Toujours sur le même schéma, on pourra supprimer des enregistrements correpondant à une clause WHERE avec le mot clef DELETE. Sans clause WHERE, comme d'habitude, tous les enregistrements seront affectés.

Nous pouvons très facilement supprimer les intrus de notre table :

DELETE FROM Genies WHERE Prenom='William' AND Nom='Gates'

6.3.5.4. Autres commandes

D'autres commandes sont utiles en ligne de commande mysql. Ces commandes sont généralement achevées par « ; », indiquant à MySQL que la commande est terminée et qu'il peut l'appliquer. On peut par exemple changer la base de données en cours avec USE :

USE mysql;

On peut aussi effacer complètement une table avec DROP TABLE :

DROP TABLE Genies;

voire une base de données complète avec DROP DATABASE :

DROP DATABASE test;

Pour voir les bases de données existantes, on utilisera SHOW DATABASES :

SHOW DATABASES;

et pour voir les tables déclarées dans la base de données actuellement sélectionnée on utilisera SHOW TABLES :

SHOW TABLES;

Enfin, FLUSH PRIVILEGES permet de demande à MySQL d'actualiser les droits des utilisateurs :

FLUSH PRIVILEGES;



[15] Voila probablement pourquoi les développeurs de MySQL ont choisi de nommer root l'utilisateur ayant par défaut le rôle de DBA mysql : cela simplifie les opérations de maintenance.

[16] On pourra dans tous les cas supprimer l'ajout des commandes exécutées dans le shell courant par history -r; dans certaines versions antérieures, les curieux pouvaient aussi voir le mot de passe au moment ou la commande etait exécutée par un ps bien placé.

[17] Par convention, les mots clefs SQL sont écrits en majuscules mais ce n'est pas une obligation.