62 votes

Comment déplacer le répertoire de données MySQL?

Je tente de déplacer le répertoire de données de ma base de données MySQL vers un deuxième ensemble de disques que j'ai monté en tant que point de montage /array2/.

Le problème que je rencontre est que j'ai tout tenté et après avoir modifié l'emplacement de datadir dans my.cnf, MySQL ne veut plus redémarrer.

Tout ce que j'obtiens est :

start: Job failed to start

66voto

Jonny Flowers Points 951

Oublié de sécuriser l'application.

Pour ceux qui sont intéressés, j'ai fait ce qui suit pour déplacer le dossier.

Arrêtez le serveur mysql :

stop mysql

Créez le nouveau répertoire :

mkdir /array2/mysql

Copiez UNIQUEMENT les dossiers de la base de données :

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Sauvegardez le fichier my.cnf :

cp /etc/mysql/my.cnf /root/my.cnf.backup

Modifiez le fichier my.cnf :

nano /etc/mysql/my.cnf

Changez toutes les mentions de l'ancien datadir et du socket vers votre nouvel emplacement

Le mien est devenu :

datadir=/array2/mysql

socket=/array2/mysql/mysql.sock

Mettez à jour les autorisations du répertoire :

chown -R mysql:mysql /array2/mysql

Renommez l'ancien répertoire :

mv /var/lib/mysql /var/lib/mysql-old

Créez un lien symbolique, juste au cas où :

ln -s /array2/mysql /var/lib/mysql 

Indiquez à AppArmor le nouveau datadir :

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Rechargez les profils apparmor

sudo /etc/init.d/apparmor reload

Ensuite, démarrez mysql :

start mysql

23voto

FireCat Points 3326

J'ai découvert qu'AppArmor était le coupable en examinant le syslog, et j'ai pu changer avec succès l'emplacement des données de mysql en suivant ce processus.

Veuillez noter que, dans les fichiers modifiés ci-dessous, les lignes commençant par + ont été ajoutées, et les lignes commençant par - ont été supprimées. Vous ne devez pas réellement taper/coller les signes + lors de l'ajout de lignes dans ces fichiers.

J'ai cloné le répertoire mysql vers le nouvel emplacement :

sudo rsync -av /var/lib/mysql /nouveau_dossier

Ensuite, j'ai modifié la ligne datadir dans /etc/mysql/my.cnf :

sudo vi /etc/mysql/my.cnf

-datadir     = /var/lib/mysql
+datadir     = /nouveau_dossier/mysql

Ensuite, j'ai modifié /etc/apparmor.d/usr.sbin.mysqld :

sudo vi /etc/apparmor.d/usr.sbin.mysqld

-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /nouveau_dossier/mysql/ r,
+  /nouveau_dossier/mysql/** rwk,

Ensuite, j'ai redémarré mysql.

13voto

dave Points 131

Soyez prudent.

Si vous avez des tables InnoDB, VOUS DEVEZ copier les fichiers ibdata* et ib_logfile* sinon vous ne pourrez pas utiliser les tables. Vous obtiendrez :

Table 'nomBaseDeDonnées.nomTable' n'existe pas

erreurs.

Exécutez cette commande de copie pour copier les fichiers ibdata* et ib_logfile*.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

8voto

Postadelmaga Points 5531

Je préfère utiliser le point de montage avec l'option bind afin d'éviter tout autre changement dans la configuration d'Apparmor et de Mysql.


Par exemple :

Supposons que je veuille déplacer tout dans /var/www. Disons que ce répertoire est mon environnement de développement et qu'il est monté dans une partition différente

  1. Tout d'abord, nous devons arrêter mysql :

    sudo systemctl stop mysql.service
  2. Nous déplaçons les fichiers (en préservant les permissions)

    sudo rsync -av /var/lib/mysql /var/www

    Cela générera un répertoire /var/www/mysql/ avec tout le contenu.

  3. Nous supprimons tout dans l'ancien répertoire :

    sudo rm -r /var/lib/mysql/*
  4. Nous montons le nouveau répertoire avec l'option bind dans l'ancien.
    modifier /etc/fstab et ajouter cette ligne :

    /var/www/mysql /var/lib/mysql  none  bind 0 0

    Cela montera le /var/www/mysql dans notre répertoire vide /var/lib/mysql
    L'option bind fait ici la magie, elle va peupler /var/lib/mysql avec le contenu de /var/www/mysql donc pour mysql et apparmor ce sera comme si rien n'avait changé.

  5. Maintenant nous faisons le montage :

    sudo mount -a

    et redémarrons mysql.

7voto

simon Points 694

Je viens d'essayer une autre méthode, que certains pourraient trouver utile :

copier avec les autorisations intactes :

rsync -avzh /var/lib/mysql /chemin/vers/nouvel/endroit

faire une sauvegarde (au cas où quelque chose se passe mal) :

mv /var/lib/mysql /var/lib/_mysql

créer un nouveau répertoire vide à la place de l'ancien :

mkdir /var/lib/mysql

monter en tant que point de montage lié le nouvel emplacement au précédent :

mount -B /chemin/vers/nouvel/endroit /var/lib/mysql

J'espère que cela aidera quelqu'un, car la création de liens symboliques n'a pas fonctionné pour moi et c'était la manière la plus simple.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X