
L’installation par défaut d’un serveur MySQL est suffisante pour être opérationnel dans la minute qui suit. Elle ne facilite en revanche pas la maintenance en laissant le répertoire contenant vos bases de données et tables hors de portée.
L’intérêt de choisir soi-même l’emplacement de ce répertoire, le datadir, est double :
- regrouper les données en un endroit connu (facilite les sauvegardes)
- utiliser le partitionnement du disque pour ne pas avoir à craindre une perte de données en cas de réinstallation du système (facilite la maintenance)
Nous allons voir comment procéder à ce changement tout en adaptant les sécurités des systèmes tels que SELinux et AppArmor. Ces derniers empêcheront en effet le serveur de démarrer.
Quelques généralités avant de commencer
Quitte à changer l’emplacement du datadir, autant le déplacer sur une partition qui ne sera pas effacé lors de la réinstallation de votre système d’exploitation, que ça soit du Linux, MacOS ou Windows.
Personnellement, sous Ubuntu/Debian, je crée un répertoire dans /home qui s’appelle mysql. Mon répertoire /home est bien entendu monté sur une partition différente. Si ce n’est pas le cas chez vous, pensez à déplacer votre /home.
sudo mkdir /home/mysql
sudo chown mysql:mysql /home/mysql
Enfin, dernier détail à connaître : l’emplacement de vos données MySQL :
- sous Linux, généralement :
/var/lib/mysql - sous Windows, avec WAMP :
C:\Program Files\Wamp\mysql\data
Méthode 1 : modifier la configuration MySQL
C’est probablement la méthode la plus simple mais elle a l’inconvénient d’avoir à modifier un fichier de configuration. Il faut donc modifier la propriété datadir de votre fichier de configuration MySQL :
- sous Linux, généralement :
/etc/mysql/my.cnf - sous Windows, avec WAMP :
C:\Program Files\Wamp\mysql\conf\my.ini
Dans ce fichier se trouve une section consacrée à la configuration générale du serveur mysql (mysqld pour mysql daemon) :
[mysqld]
user = mysql
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
J’ai mis en gras la ligne qui nous intéresse, à savoir le datadir.
Quelle valeur mettre ? Celle de l’emplacement souhaité pour vos données. Dans mon cas ça aurait été /home/mysql :
datadir = /home/mysql
Vous vous assurerez d’avoir bien stoppé le service MySQL, d’avoir copié/collé vos données de l’ancien emplacement vers le nouveau et enfin de redémarrer MySQL. C’est seulement en cas de réussite que vous pourrez supprimer l’ancien répertoire
sudo -s
/etc/init.d/mysqld stop
cp -pr /var/lib/mysql/* /home/mysql
/etc/init.d/mysql start
Méthode 2 : utilisation d’un lien symbolique
La documentation de MySQL explique l’utilisation des liens symboliques pour tout, une base de données précises voire même les tables. Ceci dit nous allons voir l’exemple global : on déplace tout.
Concrètement cette méthode consiste à :
- stopper le service MySQL
- déplacer le répertoire de données (au cas où)
- créer le lien symbolique
- copier les données dans le nouvel emplacement
- relancer le service MySQL
Concrètement, ça se traduit comme ceci :
sudo -s
mv /var/lib/mysql /var/lib/mysql-old
ln -s /home/mysql /var/lib/mysql
cp -pr /var/lib/mysql-old/* /home/mysql
/etc/init.d/mysqld start
Là encore, supprimez la copie de vos données (répertoire mysql-old) seulement en cas de succès. Ça facilite les retours en arrière en cas de pépin.
Cas particulier : systèmes employant AppArmor ou SELinux
Il y a cependant un hic possible si vous utilisez une distribution Fedora ou Ubuntu, surtout depuis sa version Hardy Heron (8.04). Celle-ci intègre une sécurité pour éviter à certains services critiques d’être altérés par une manipulation extérieure … comme la notre.
Il faut savoir que les 2 méthodes du haut échoueront si vous rentrez dans ce cas de figure : le service MySQL ne démarre pas.
Pas de panique, il y a juste un fichier à modifier : /etc/apparmor.d/usr.sbin.mysqld. Il y a un passage ressemblant à ceci, dans le cas d’AppArmor et Ubuntu :
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
Vous voyez le loup venir. Il suffit de remplacer les occurences de /var/lib/mysql par le chemin de votre nouvel emplacement, /home/mysql dans notre cas :
/home/mysql/ r,
/home/mysql/** rwk,
La raison de cette modification est presque simple : AppArmor ne suit pas les liens symboliques. Il considère que /var/lib/mysql est différent de /home/mysql et que ce dernier ne concerne pas le service mysqld.
Notre modification évite ce blocage et permet du même coup au serveur MySQL de démarrer ; les échecs étant dus au fait que le serveur ne trouvait pas de base à charger (dont la sienne, mysql).
Pour terminer, on peut relancer les 2 services, apparmor et mysqld :
sudo /etc/init.d/apparmor restart
sudo /etc/init.d/mysqld restart
Conclusion
Nous avons vu 2 méthodes pour rendre sa gestion des bases de données plus souple et plus sure. En cas de défaillance système - ça arrive même aux meilleurs - il faut pouvoir le réinstaller sans craindre de perdre des données vitales. Et les bases de données le sont.
On peut aussi constater que les nouveaux services de protection peuvent compliquer la vie si on ne les sait pas actifs et si on ne comprend pas leur fonctionnement. J’ai passé plusieurs heures à comprendre pourquoi le serveur MySQL ne se relançait pas alors qu’il me semblait avoir effectué la même manipulation sur les précédentes versions d’Ubuntu.
N’hésitez pas à partager votre méthode ou apporter vos suggestions sur votre gestion des datadir.











Sprank a dit le Jeudi 8 mai 2008 :
Je crois bien qu’il manque un “ne” entre “MySQL” et “démarre” dans la phrase : “Il faut savoir que les 2 méthodes du haut échoueront si vous rentrez dans ce cas de figure : le service MySQL démarre pas.”
Oncle Tom a dit le Samedi 10 mai 2008 :
Merci Sprank c’est corrigé
Daniel a dit le Dimanche 11 mai 2008 :
Merci bcp, j’ai été confronté au pb et j’avais abandonné. (merci aussi à Simon Gaudillet de la ml ubuntu-fr qui m’a donné le lien vers ce billet, car mes recherche à partir du message d’erreur de mysql ne menaient que vers des pbs de droits)
Oncle Tom a dit le Dimanche 11 mai 2008 :
Tant mieux si ça sert
j’avais posté le lien sur le forum Ubuntu-fr justement. À en voir l’affluence que ça provoque, on ne devait pas être les seuls concernés !
Daniel a dit le Dimanche 11 mai 2008 :
A la décharge des mainteneurs du paquet (et de la MOTU en général), le fichier my.cnf comporte bien l’avertissement suivant :
# * IMPORTANT
# If you make changes to these settings and your system uses apparmor, you
may
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
comme me l’a gentiment rappellé Bruno Patri (ml ubuntu-fr aussi)…
Bref, quand on a un pb après modif d’un fichier de conf, même si on le connait bien, toujours lire les COMMENTAIRES et les README !
Matt a dit le Mardi 13 mai 2008 :
Un gros merci aussi pour ce tuto qui m’a sauvé la vie
Il mérite largememt sa page dans la doc ubuntu-fr.
Bonne continuation
Jay a dit le Mardi 13 mai 2008 :
Bonjour, bien ce tuto. Connais-tu la syntaxe pour rediriger uniquement la base de données mysql sur un autre serveur dédié bdd ?
Oncle Tom a dit le Mardi 13 mai 2008 :
Hm, pas sûr de comprendre pourquoi tu veux la mettre ailleurs : elle contient toutes les informations utilisées par MySQL pour fonctionner. Si tu la mets ailleurs, le serveur est ailleurs.
Regarde soit du côté du clustering, soit du montage réseau. À moins que quelqu’un d’autre n’ait en tête une meilleure solution ?
Daniel a dit le Mardi 13 mai 2008 :
@Jay Je comprends que tu souhaite installer ta Base de données mysql sur un serveur B (et t’y connecter depuis ton poste A). C’est une conf classique que tu trouveras un peu partout. En gros, dire à B qu’il doit écouter sur une autre IP que 127.0.0.1 (bind-adress dans my.cnf) et à A qu’il doit interroger B pour ses requêtes (dans tes scripts de connexion, mettre B au lieu de localhost).
Si tu parles de mettres les fichiers de bdd mysql sur un lecteur réseau, c’est TRÈS déconseillé (et n’a pas grand intérêt car tu ne peux pas les partager entre plusieurs serveurs mysql), c’est un bon moyen de se retrouver avec des bases corrompues (en dehors de la question des perfs).
Si ce n’est pas ça que tu veux faire, dsl, j’ai mal compris…
sparfait a dit le Mercredi 14 mai 2008 :
Bonjour,
J’ai modifié mes fichiers comme spécifié mais mon serveur mysql refuse de démarer j’ai le message suivant :
“sudo /etc/init.d/mysql start
* Starting MySQL database server mysqld [fail]
”
Et là je n’ai plus le choix je n’ai plus de place sur ma partition contenant mon /var/lib/mysql … Est ce que quelqu’un pourrait m’aider ?
Oncle Tom a dit le Mercredi 14 mai 2008 :
Où se trouvent tes données mysql (vu que tu sembles l’avoir déplacé de /var/lib/mysql) ? Il faut dans ce cas :
Jay a dit le Jeudi 15 mai 2008 :
Oui tu as vu juste Daniel, c bien cela…
Site web en utilisant 2 serveurs sous DEBIAN :
A en “front” MySQL client, B en “BDD” MySQL server…
Sais-tu précisement quels scripts de connexion dois-je modifier en A ?
Oncle Tom a dit le Jeudi 15 mai 2008 :
Dans ce cas c’est de la réplication MySQL que tu veux faire
y’a 1 fichier à modifier et éventuellement les données à synchroniser.
Jay a dit le Jeudi 15 mai 2008 :
Merci Oncle TOM pour cette suggestion mais le but n’est pas de faire une réplication ou backup… La configuration est différente sur chaque serveur… Par ex., j’installe APACHE2 et MySQL client sur le 1er et sur le second, j’installe MySQL server sans APACHE2… Mais j’ai du mal à trouver des infos précises sur ce type de configuration apparament très utilisée en entreprise. Si tu as des sources, elles sont les bienvenues
Oncle Tom a dit le Vendredi 16 mai 2008 :
Ah ben écoute de ce que tu en dis tu veux faire une réplication … ou alors tu veux te connecter à B depuis A.
Si c’est ce dernier cas, il faut
Si c’est pas ça j’ai rien compris
Daniel a dit le Vendredi 16 mai 2008 :
@Jay, les scripts que tu dois modifier sont tous ceux (php, ruby, perl, python, java, etc.) qui se connectent à mysql via “localhost” ou “127.0.0.1″ (ou le nom du host sur lequel ils sont). Tu dois mettre à la place le nom ou l’IP de B.
En général, pour chaque appli web, tu as un fichier de param où tu indique host, login, pass, tu dois donc changer le host pour chaque appli.
sparfait a dit le Vendredi 16 mai 2008 :
Bonjour,
Suite de mon message de mercredi 14 mai :
J’ai copié le répertoire /var/lib/mysql
dans un répertoire qui se trouve sur un disque monter sur /media/MYSQL (FAT 32) sur lequel j’ai créé un répertoire “LINUX”. Mes data se retrouvent donc dans le chemin suivant /media/MYSQL/LINUX/mysql
J’ai donc modifié mon fychier my.cnf ainsi :
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir=/media/MYSQL/LINUX/mysql
tmpdir = /tmp
language = /usr/share/mysql/french
et mon fichier usr.sbin.mysqld ainsi :
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include
/usr/sbin/mysqld {
#include
#include
#include
#include
capability dac_override,
capability setgid,
capability setuid,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/group m,
/etc/passwd m,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/media/MYSQL/LINUX/mysql/ r,
/media/MYSQL/LINUX/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
}
je redemarre apparmor par sudo /etc/init.d/apparmor restart ==> OK
Je démarre MySQL par sudo /etc/init.d/mysql start ==> Starting MySQL database server mysqld [fail]
J’ai fait la meme manip en placant le répertoire /var/lib/mysql dans mon répertoire home ==> même problème …
Merci pour tout aide !!
stadrum a dit le Dimanche 18 mai 2008 :
Bonjour et merci pour ce tuto qui m’a beaucoup aidé.
J’avais commencé la manip’ de bouger mon dossier mysql en suivant le tuto de LAMP de doc.ubuntu-fr.org et ça m’a tout mis en l’air.
Du coup, ce serait chouette d’intégrer cette page au site d’Ubuntu, voir même en lieu et place du tuto qui m’a fait “plus de peur que de mal”…
Oncle Tom a dit le Dimanche 18 mai 2008 :
@stadrum : la documentation a été mise à jour visiblement avec un lien vers le sujet que j’avais créé
ce n’était qu’une question de temps !
Jay a dit le Lundi 19 mai 2008 :
Ok çà fonctionne, merci de votre aide
sparfait a dit le Lundi 19 mai 2008 :
Ok ca fonctionne aussi pour moi : Je n’avais pas mis les bonnes options pour monter mon disque où je voulais mettre mon répertoire avec les données.
Merci.
michelw a dit le Dimanche 15 juin 2008 :
Je vous sollicite car je viens d’essayer de faire cette manipulation par deux fios en réinstallant le système entre les deux, mais cela ne fonctionne pas. Ci-joint la copie de mon éditeur:
Je vous joints également la copie de mon fichier modifié: usr.sbin.mysqld
Pourriez vous m’aider? En vous remerciant
Michel