Comment déplacer un répertoire de données MySQL vers un nouvel emplacement sur Ubuntu 18.04

introduction

Les bases de données s'agrandissent avec le temps, dépassant parfois l'espace sur le système de fichiers. Vous pouvez également rencontrer des conflits d’entrées / sorties s’ils se trouvent sur la même partition que le reste du système d’exploitation. Le RAID, le stockage de bloc réseau et d'autres périphériques peuvent offrir une redondance et d'autres fonctionnalités souhaitables. Que vous ajoutiez plus d’espace, recherchiez des moyens d’optimiser les performances ou cherchant à tirer parti d’autres fonctionnalités de stockage, ce didacticiel vous guidera tout au long du processus de déplacement du répertoire de données de MySQL.

Conditions préalables

Pour compléter ce guide, vous aurez besoin de:

Dans cet exemple, nous déplaçons les données vers un périphérique de stockage par blocs monté à/mnt/volume-nyc1-01. Vous pouvez apprendre comment en configurer un dans le guideHow To Use Block Storage on DigitalOcean.

Quel que soit le stockage sous-jacent que vous utilisez, ce guide peut vous aider à déplacer le répertoire de données vers un nouvel emplacement.

[[step-1 -—- moving-the-mysql-data-directory]] == Étape 1 - Déplacement du répertoire de données MySQL

Pour préparer le déplacement du répertoire de données de MySQL, vérifions l’emplacement actuel en lançant une session interactive MySQL à l’aide des informations d’administration.

mysql -u root -p

Lorsque vous y êtes invité, indiquez le mot de passe root MySQL. Ensuite, à partir de l'invite MySQL, sélectionnez le répertoire de données:

select @@datadir;
Output+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Cette sortie confirme que MySQL est configuré pour utiliser le répertoire de données par défaut,/var/lib/mysql/,, donc c'est le répertoire que nous devons déplacer. Une fois que vous avez confirmé cela, tapezexit pour quitter le moniteur.

Pour assurer l’intégrité des données, nous allons arrêter MySQL avant d’apporter des modifications au répertoire de données:

sudo systemctl stop mysql

systemctl n'affiche pas le résultat de toutes les commandes de gestion des services, donc si vous voulez être sûr que vous avez réussi, utilisez la commande suivante:

sudo systemctl status mysql

Vous pouvez être sûr qu'il est arrêté si la dernière ligne de la sortie vous indique que le serveur est arrêté:

Output. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

Maintenant que le serveur est arrêté, nous allons copier le répertoire de base de données existant vers le nouvel emplacement avecrsync. L'utilisation de l'indicateur-a préserve les autorisations et les autres propriétés du répertoire, tandis que`-v` fournit une sortie détaillée afin que vous puissiez suivre la progression.

[.note] #Note: Assurez-vous qu'il n'y a pas de barre oblique à la fin du répertoire, qui peut être ajoutée si vous utilisez l'achèvement par tabulation. Lorsqu'il y a une barre oblique à la fin,rsync videra le contenu du répertoire dans le point de montage au lieu de le transférer dans un répertoire contenantmysql:
#

sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

Une fois lesrsync terminés, renommez le dossier actuel avec une extension .bak et conservez-le jusqu'à ce que nous ayons confirmé que le déplacement a réussi. En le renommant, nous éviterons la confusion qui pourrait résulter de fichiers situés à la fois dans le nouvel et dans l'ancien emplacement:

sudo mv /var/lib/mysql /var/lib/mysql.bak

Nous sommes maintenant prêts à porter notre attention sur la configuration.

[[step-2 -—- pointer-vers-le-nouvel-emplacement-de-données]] == Étape 2 - Pointage vers le nouvel emplacement de données

MySQL dispose de plusieurs moyens pour remplacer les valeurs de configuration. Par défaut, ledatadir est défini sur/var/lib/mysql dans le fichier/etc/mysql/mysql.conf.d/mysqld.cnf. Editez ce fichier pour refléter le nouveau répertoire de données:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Trouvez la ligne qui commence pardatadir= et changez le chemin qui suit pour refléter le nouvel emplacement.

Dans notre cas, le fichier mis à jour ressemble à la sortie ci-dessous:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

Cela semble être le bon moment pour faire apparaître MySQL à nouveau, mais il reste encore une chose à configurer avant de pouvoir le faire avec succès.

[[step-3 -—- configuring-apparmor-access-control-rules]] == Étape 3 - Configuration des règles de contrôle d'accès AppArmor

Nous devrons dire à AppArmor de laisser MySQL écrire dans le nouveau répertoire en créant un alias entre le répertoire par défaut et le nouvel emplacement. Pour ce faire, modifiez le fichier AppArmoralias:

sudo nano /etc/apparmor.d/tunables/alias

Au bas du fichier, ajoutez la règle d'alias suivante:

/etc/apparmor.d/tunables/alias

. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

Pour que les modifications prennent effet, redémarrez AppArmor:

sudo systemctl restart apparmor

[.Remarque]##

Note: Si vous avez ignoré l'étape de configuration AppArmor, vous rencontrerez le message d'erreur suivant:

OutputJob for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.

La sortie desystemctl etjournalctl se termine par:

OutputJul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE

Étant donné que les messages n'établissent pas de connexion explicite entre AppArmor et le répertoire de données, cette erreur peut prendre un certain temps à être résolue.

[[step-4 -—- restarting-mysql]] == Étape 4 - Redémarrage de MySQL

La prochaine étape consiste à démarrer MySQL, mais si vous le faites, vous rencontrerez une autre erreur. Cette fois, au lieu d'un problème AppArmor, l'erreur se produit car le scriptmysql-systemd-start vérifie l'existence d'un répertoire,-d, ou d'un lien symbolique,-L, qui correspond à deux chemins. Il échoue s’ils ne sont pas trouvés:

/usr/share/mysql/mysql-systemd-start

. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

Comme nous en avons besoin pour démarrer le serveur, nous allons créer la structure de répertoires minimale pour la vérification de l’environnement du script.

sudo mkdir /var/lib/mysql/mysql -p

Now nous sommes prêts à démarrer MySQL.

sudo systemctl start mysql
sudo systemctl status mysql

Pour vous assurer que le nouveau répertoire de données est bien utilisé, démarrez le moniteur MySQL.

mysql -u root -p

Regardez à nouveau la valeur du répertoire de données:

Output+----------------------------+
| @@datadir                  |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

Maintenant que vous avez redémarré MySQL et confirmé qu’il utilise le nouvel emplacement, saisissez cette opportunité pour vous assurer que votre base de données est entièrement fonctionnelle. Une fois que vous avez vérifié l’intégrité des données existantes, vous pouvez supprimer le répertoire de données de sauvegarde:

sudo rm -Rf /var/lib/mysql.bak

Redémarrez MySQL une dernière fois pour vous assurer qu'il fonctionne comme prévu:

sudo systemctl restart mysql
sudo systemctl status mysql

Conclusion

Dans ce didacticiel, nous avons déplacé le répertoire de données de MySQL vers un nouvel emplacement et mis à jour les listes de contrôle d'accès AppArmor d’Ubuntu pour permettre les ajustements nécessaires. Bien que nous utilisions un périphérique de stockage en bloc, les instructions fournies ici devraient permettre de redéfinir l'emplacement du répertoire de données, quelle que soit la technologie sous-jacente.

Pour plus d’informations sur la gestion des répertoires de données MySQL, consultez les sections suivantes de la documentation officielle de MySQL: