MySQL est un SGBD particulièrement simple à mettre en œuvre, mais quelques notions sont nécessaires afin d'en saisir son fonctionnement.
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.
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.
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 »).
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...
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.
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
Nom | Prenom | AnneeNaissance |
---|---|---|
Cox | Alan | 1968 |
Knuth | Donald | 1938 |
Tovalds | Linus | 1969 |
Turing | Alan | 2912 |
Gates | Bill | 1955 |
Einstein | Albert | 1879 |
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 ».
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';
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'
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.