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

57

J'essaie de déplacer le répertoire de données de ma base de données MySQL vers un second ensemble de disques que je possède comme point de montage /array2/.

Le problème que je rencontre est que j'ai tout essayé et qu'après avoir modifié l'emplacement de datadir dans my.cnf, mysql ne redémarre plus.

Tout ce que je reçois c'est:

start: Job failed to start
Jonny Flowers
la source

Réponses:

62

Oublié à propos de l'armure de 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

Sauvegarder le my.cnffichier:

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

Editez le my.cnffichier:

nano /etc/mysql/my.cnf

Remplacez toutes les mentions de l'ancien datadir et socket par 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 au cas où:

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

Informez AppArmor du nouveau datadir:

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

Recharger les profils apparmor

sudo /etc/init.d/apparmor reload

Puis lancez mysql:

start mysql
Jonny Flowers
la source
C'est une bonne réponse, mais vous aurez peut-être besoin d'une étape supplémentaire pour permettre aux clients de se connecter à mysql. Ajoutez un nouveau groupe avec une ligne dessous ... [clients] socket = / array2 / mysql / mysql.sock où socket = portion pointe vers le nouvel emplacement de votre fichier mysql.sock.
Night Owl
1
Si vous ne voulez pas avoir la peine de fusionner /etc/apparmor.d/usr.sbin.mysqldchaque fois que mysql reçoit une mise à jour, vous pouvez ajouter /array2/mysql/** rwk,à la /etc/apparmor.d/local/usr.sbin.mysqldplace. Mysql aura toujours accès à l'ancien répertoire de données, mais ce n'est probablement pas un problème.
Drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Pourquoi seulement les dossiers de base de données?
int_ua
Pour ceux qui déplacent leur datadir vers ZFS (comme je l’ai fait), assurez-vous également d’ajouter: innodb_use_native_aio=0dans la [mysqld]section de votre my.cnffichier, car ZFS sur linux ne prend pas en charge AIO. dev.mysql.com/doc/refman/5.5/fr/…
Andrew Ensley
23

J'ai constaté qu'AppArmor était le coupable en examinant le sysloget j'ai pu modifier l' mysqlemplacement des données en suivant ce processus.

Veuillez noter que, dans les fichiers édités ci-dessous, les lignes commençant par +ont été ajoutées et les lignes commençant par -ont été supprimées. En fait, vous ne devez pas taper / coller les +signes lors de l’ajout de lignes à ces fichiers.

J'ai cloné le mysqlrépertoire dans le nouvel emplacement:

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

Puis j'ai édité la datadirligne dans /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Puis j'ai édité /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Puis j'ai redémarré mysql.

Brian Moore
la source
13

Savoir.

Si vous avez des tables InnoDB, vous DEVEZ copier sur les fichiers ibdata*et, sinon vous ib_logfile*ne pourrez pas utiliser les tables. Tu auras:

'Table' databaseName.tableName 'n'existe pas'

les erreurs.

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

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
dave
la source
cela devrait être un commentaire, ce n'est pas une réponse complète
Postadelmaga
4

Je viens d'essayer d'une autre manière, que certains pourraient trouver utile:

copie avec autorisations intactes:

rsync -avzh /var/lib/mysql /path/to/new/place

sauvegarder (en cas de problème):

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

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

mkdir /var/lib/mysql

lie le nouvel emplacement à l'ancien:

mount -B /path/to/new/place /var/lib/mysql

J'espère que cela aide quelqu'un, parce que les liens symboliques n'ont pas fonctionné pour moi et que c'était la façon la plus simple

snapfractalpop
la source
3

Si vous déplacez votre datadir, vous devez non seulement donner les nouvelles autorisations datadir, mais vous devez également vous assurer que tous les répertoires parents sont autorisés.

J'ai déplacé mon datadir sur un disque dur, monté dans Ubuntu en tant que:

/media/*user*/Data/

et mon datadir était des bases de données .

J'ai dû définir des autorisations sur 771 pour chacun des répertoires de supports, d' utilisateurs et de données:

sudo chmod 771 *DIR*

Si cela ne fonctionne pas, une autre façon de faire fonctionner mysql consiste à changer d’utilisateur dans /etc/mysql/my.cnf en root; bien que cela soit sans aucun doute problématique du point de vue de la sécurité.

Kohjah Breese
la source
2

Je préfère utiliser l'option mount avec bind afin d'éviter toute modification ultérieure de la configuration d'Apparmor et de Mysql.


Par exemple:

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

  1. Premièrement, nous devons arrêter mysql :

    sudo systemctl stop mysql.service
    
  2. Nous déplaçons des fichiers (en conservant la permission)

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

    Cela va générer 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 bindoption dans l'ancien.
    éditez /etc/fstabet ajoutez cette ligne:

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

    Cela montera le /var/www/mysqldans notre répertoire vide. /var/lib/mysql
    L' bindoption ici fait la magie, elle sera peuplée /var/lib/mysqlavec le contenu de /var/www/mysqldonc pour mysql et apparmor ce sera comme si rien n'avait changé.

  5. Maintenant nous faisons la monture:

    sudo mount -a
    

    et redémarrez mysql.

Postadelmaga
la source
0

Vous vous rendez compte que si vous suivez les commandes à la lettre de la réponse acceptée, cela échouera?

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

Copiera / var / lib / mysql dans / array2 / mysql / mysql.

Lorsque vous définissez votre fichier de configuration, vous feriez mieux de mettre / array2 / mysql / mysql en tant que répertoire, sinon votre mysqld ne pourra pas démarrer.

Les meilleures commandes de copie seraient:

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

Juste mes 2 centimes.

Ellison Chan
la source