Académique Documents
Professionnel Documents
Culture Documents
commande est déjà de s’y connecter. Pour ça, une fois dans votre shell,
tapez, mysql -h hôte_mysql -u username -p . Dans l’exemple ci-dessous,
MySQL demande ensuite le mot de passe, vous n’avez plus qu’à entrer le mot
de passe avant de vous retrouver dans l’interpréteur de MySQL.
Encodage de la connexion
Nous allons le voir juste après, vous définissez un encodage pour les données
que vous stockez. Aussi, lors de la connexion, il est important de s’assurer que
vous communiquez dans la bonne langue avec la base de données.
Cependant, si votre shell est en UTF-8 et que vous utilisez une connexion en
Latin-1, il va y avoir une conversion du set de caractères aboutissant à une
corruption des données. Qu’il s’agisse donc de la connexion au client MySQL
en CLI ou depuis une application web (PHP, Python, etc) veillez à toujours
bien définir le jeux de caractère de la connexion.
C’est super, on est connecté, mais jusque là, ça ne sert pas à grand chose.
On va donc voir comment créer, modifier et supprimer des bases de
données.
Créer une base
En fait, il n’y a pas grand chose à modifier sur une base, à part le charset et la
collation. Voici donc la commande :
Supprimer une base
Il est possible d’avoir plusieurs bases de données avec MySQL, on doit donc
lui préciser dans laquelle on va travailler. Pour cela, il faut tout simplement
utiliser la commande USE nom_BDD . Cette commande, contrairement aux
autres, ne doit pas obligatoirement se terminer par un point-virgule.
On sait maintenant créer, modifier et supprimer une base, il est grand temps
de la peupler un peu !
Il faut aussi prendre en considération le fait que MyISAM utilise un verrou lors
de l’ajout ou la modification de données, ce qui pose problème lorsque la
table est très sollicitée en écriture puisque qu’il va se créer une file d’attente.
De ce fait, si votre application requiert de nombreuses modifications
parallèles sur la base de données – un blog avec des commentaires ou un
forum par exemple – vous devrez utiliser une base INNODB.
Bien entendu, il existe d’autres moteurs de tables. Pour plus d’info sur les deux
sus-cités ou sur les autres moteurs disponibles et leurs fonctionnalités, il y a
toute une partie de la doc qui traite du sujet.
Vous voilà avec une table toute neuve… et toute vide. Il est bien entendu
possible de créer une table vide et d’ajouter des colonnes ensuite,
cependant, on préférera généralement directement créer une table
complète. Syntaxe :
vous pouvez spécifier si vous autorisez les champs à avoir une valeur nulle
(être vide). AUTO_INCREMENT vous permet, dans le cas d’un INT (et de ses
dérivés), d’incrémenter pour chaque nouvel enregistremet la valeur de 1. Par
conséquent, les valeurs des champs sont automatiquement définies.
Enfin, vous pouvez précisez une valeur par défaut, c’est à dire que, si vous ne
précisez aucune valeur lors de l’ajout de données, la valeur du champs
prendra alors comme valeur la valeur par défaut.
Prenons pour exemple une table dans laquelle nous allons stocker les pseudos
des membres d’un site.
Modifier une table
Pour modifier une table, on utilisera la commande ALTER TABLE avec les
arguments ADD , DROP , CHANGE ou MODIFY .
Pour modifier une colonne, c’est un tout petit peu plus complexe. Vous vous
doutez bien qu’il faudra utiliser les commandes CHANGE et MODIFY pour
modifier une colonne. Quelle est la différence entre les deux ? Pas bien
grande à vrai dire. CHANGE permet de renommer la colonne tandis
que MODIFY ne le permet pas.
Renommer une table
La commande est à un mot près, la même que pour renommer une base, de
la même manière, on ne l’utilisera pas tous les jours – c’est d’ailleurs
préférable – mais il peut arriver qu’on soit amené à modifier un nom de table.
Comme pour supprimer une base, supprimer une table s’avère assez facile.
Finalement tellement facile que, comme pour une base, on a parfois trop vite
fait de la supprimer. Ces commandes sont sans appel, une fois supprimées,
vous ne pourrez plus récupérer vos données. Alors prenez gare !
Par défaut, lorsque l’on installe la base, il n’y qu’un seul utilisateur de créé :
root – où des utilisateurs spécifiquement dédiés aux tâches de fonds. Bien
qu’en développement on puisse connecter nos applications avec root, un
utilisateur qui a tous les droits sur toutes les tables représente toujours un
cetain danger… surtout s’il vient à être compromis !
Créer un utilisateur
Vous devinez bien entendu que “buzut” est à remplacer par le nom
d’utilisateur et que “XXXX” doit être remplacé par un mot de passe de votre
choix. Néanmoins, que signifie “localhost” ?
Chaque utilisateur est identifié par son nom et son mot de passe mais aussi
l’hôte depuis lequel il se connecte. Ainsi, si vous voulez que l’utilisateur
“buzut” puisse se connecter depuis une machine distante directement via le
client MySQL (donc sans se connecter en ssh d’abord), il faudra que vous
créiez un autre utilisateur avec l’ip adéquate après le “@”.
Juste avant de vous montrer comment on définit les droits, il serait peut-être
bon de savoir comment on affiche les droits relatifs à un utilisateur. C’est très
simple.
Droits d’administration
On descend encore ici d’un niveau. En effet, nous attribuons ici les droits au
niveau des tables. Par exemple, dans la base “buzut”, nous pourrions décider
que l’utilisateur “buzut_app” possède tous les droits sur users , mais
seulement INSERT et SELECT sur la table “payments”, afin qu’in ne puisse pas
supprimer des paiements passés.
Les droits sont dans l’ensemble les mêmes que ceux s’appliquant aux bases,
nous retrouvons ALTER , CREATE , DELETE , DROP , GRANT
OPTION , INDEX , INSERT , SELECT , UPDATE .
Le seul nouveau est TRIGGER , lequel permet de créer ou supprimer des
déclencheurs (ou triggers).
Nous arrivons à la plus faible granularité, il s’agit ici de donner les droits
seulement sur certaines colonnes. Nous retrouverons
seulement INSERT , SELECT et UPDATE . Les droits s’appliquent de la manière
suivante :
Donner c’est donner, reprendre c’est voler ! Mais c’est aussi plus sécurisé que
de faire preuve de trop de générosité…
On a une base de données, une ou plusieurs tables dans cette base, mais on
voudrait maintenant travailler dans ces tables : ajouter, modifier et supprimer
des données, c’est quand même le but d’une BDD !
Insertion de données
Enfin, MySQL propose une autre manière d’insérer les données. Cette
méthode est propre à MySQL et ne fait pas partie du standard SQL.
Cependant, elle a l’avantage d’avoir une syntaxe proche de celle utilisée
pour la modification d’enregistrements.
Modification de données
Prenons comme exemple une table qui représente notre collection de films.
Cette table contient quatre colonnes : une colonne id, titre, description,
format. Si on veut modifier le titre du film “avatar”, voici la requête qu’il faut :
Évidemment, on peut modifier plusieurs ligne à la fois. Mettons que l’on veuille
préciser dans la description le format des films en mp4 :
Automatiquement, toutes les descriptions des films ayant pour format mp4
seront changées. Vous comprenez donc surement l’utilité du WHERE , qui
ajoute une condition. Sans cette condition, toutes les lignes sont concernées !
Ordonner la sélection
Il est souvent bien pratique de classer notre sélection par ordre croissant,
décroissant ou alphabétique. On utilisera pour cela la commande ORDER
BY . Elle n’est pas bien compliquée à utiliser, on lui dit quelle colonne servira
au classement, et si on veut un ordre croissant ESC ou décroissant DESC . On
reprend la requête des films pour l’exemple :
Vous remarquez que je n’ai pas précisé ESC dans le premier exemple, la
valeur par défaut de ORDER BY étant l’ordonnancement alphabétique ou
croissant, il est facultatif de le préciser.
Eliminer les doublons
Mettons que l’on veuille savoir tous les âges représentés par les personnes
enregistrées sur notre site. Si on fait :
Alors on aura 10 entrées pour l’age 14 ans, 150 pour 20 ans… Pas très pratique
pour une vue d’ensemble. On peut donc utiliser DISTINCT qui, comme son
nom le laisse à penser, ne sélectionne une valeur que si elle est différente
d’une déjà sélectionnée.
On aura donc la liste de tous les âges représentés par les membres de notre
site, sans doublons, et ordonnée par ordre croissant ( ORDER BY ).
Ok normalement c’est l’inverse… Pour autant, en SQL, grouper les résultats est
d’une extraordinaire puissance car c’est moins d’informations inutiles à traiter.
COUNT() est une fonction native SQL dont nous ne parlons pas ici. MySQL
propose de nombreuses fonctions très puissante et il n’est pas possible de
toutes les lister. As usual, la doc est votre amie.
• _ représente 0 ou 1 caractère,
• % représente 0, 1 ou plus caractères.
Tous les titres contenant l’expression “james bond” seront sélectionnés car on
a placé un signe % avant et après l’expression. En revanche, si on ne l’avait
placé qu’après par exemple, la sélection aurait fonctionné pour un titre
comme “james bond – golden eye” mais pas pour “golden eye – james
bond”.
On peut aussi utiliser NOT LIKE . De plus, si on veut que la recherche soit
sensible à la casse, il faut rechercher en binaire :
Pour sélectionner une intervalle, par exemple une date. On pourrait dire qu’il
faut que ce soit plus grand que telle date, et moins que telle autre.
BETWEEN marche aussi pour les lettres, dans ce cas c’est évidemment l’ordre
alphabétique qui est pris en compte, en ne tenant pas compte de la casse,
sauf à utiliser BINARY . Bien entendu, on peut aussi utiliser NOT BETWEEN .
OR en chaine, c’est de l’or en barre
Il peut être très utiles de décrire les tables et les bases. Par exemple, on ne se
souvient plus de toutes les tables contenues dans une base, ou alors des
colonnes et de leur types dans une table, il y a une solution à ça !
Pour voir toutes les tables contenues dans une base, on se place dans celle-ci
(avec use database), puis :
Fonctions de base
On ne peut pas ici faire une liste exhaustive, mais voici quelques unes des
fonctions souvent utiles :
Logique VS physique
Il existe deux types de sauvegardes : les sauvegardes logiques et les
sauvegardes physiques. Voyons quels sont les avantages et inconvénients de
chacun d’eux pour comprendre quand utiliser l’un ou l’autre.
De leurs côtés, les sauvegardes physiques sont une copie des différents
répertoires et fichiers constituant le répertoire de données de la base de
données.
Les backups logiques sont plus flexibles. Ils respectent le standard SQL et
pourront facilement être restaurés sur un matériel différent, une version du
moteur de BDD différent, voire même un autre SGBDR (de MySQL à
PostgreSQL par ex.) s’il n’est pas fait usage de propriétés non standard dans
les bases.
Backup logique
Étant donnée que c’est de loin le plus utilisé, commençons par voir comment
procéder avec les sauvegardes logiques. L’outil est intégré d’office lors de
l’installation de MySQL ou ses forks. Il n’y a donc aucun prérequis avant
usage.
Il est aussi possible d’exporter plusieurs bases d’un coup. Dans ce cas, on ne
peut en revanche pas sélectionner les tables et on obtient un dump de
l’intégralité de la base. Il faut pour cela faire précéder le nom de la première
base de l’argument -B . Alternativement, l’argument -A permettra de faire
un dump de toutes les bases (avec toutes les tables).
Enfin, pour restaurer cette base sur un autre serveur par exemple, vous devrez
tout d’abord créer la base dans laquelle vous voulez stockez ces tables, puis
vous y importerez l’ensemble des données (cela fonctionne indifféremment
qu’il s’agisse d’une base complète ou d’une table).
Si vous souhaitez importer plusieurs bases et que vous voulez conserver les
mêmes noms de bases, vous pouvez omettre le nom de la base. Il n’est pas
non plus nécessaire de créer les bases avant l’import. Cependant, sachez
qu’avec cette méthodes, toutes les bases contenues dans le fichier sql seront
importées. Ainsi, la commande importera toutes les bases d’un coup. La
commande devient la suivante.
Si vous avez dumpé toutes les bases d’un coup mais que vous ne voulez en
restaurer qu’une en particulier, voici la commande qu’il vous faut :
Et voilà ! Vous veillerez en revanche à recréer les utilisateurs nécessaires à
votre application et à leur attribuer les bons droits. Les utilisateurs sont en effet
stockés dans la base mysql, ces derniers ne sont donc pas restaurés avec les
bases tierces !
Backup physique
Pour les tables MyISAM, il existe l’outil mysqlhotcopy qui permet de réaliser un
dump en choisissant de dumper toute la base ou seulement quelques tables.
Je ne m’attarderai pas sur cet outil car il ne permet pas de travailler avec
InnoDB, aujourd’hui plus répandu que MyISAM.
Il est normalement installé par défaut. Cela dit, sur d’anciennes distribution,
ce n’était pas forcement le cas. Pour l’installer, il suffit donc d’ajouter le
paquet mariadb-backup-10.1 .
Par ailleurs, comme on backup la plupart du temps pour s’assurer que les
données restent en sûreté en cas d’avarie, on voudra la plupart du temps
mettre ces données sur une autre machine.
Plutôt que de d’abord dumper en local puis de transférer l’ensemble sur une
autre machine, il est possible de directement streamer les données. Cela
peut se faire avec socat ou netcat par exemple. Il faut alors ouvrir un port sur
la machine cible et écouter également dessus, sans oublier de sécurisé la
connexion s’il s’agit d’un réseau public.
L’autre option – plus simple à mon sens – est d’effectuer le dump à l’initiative
de la machine de backup. Ainsi, tout peut passer par ssh.
CONSEIL : N’essayez pas de tout retenir d’un coup, les commandes viennent
avec la pratique.