Comment changer le répertoire de données MySQL?

158

Est-il possible de changer mon répertoire de données MySQL par défaut vers un autre chemin? Pourrai-je accéder aux bases de données à partir de l'ancien emplacement?

MySQL DBA
la source
3
Y a-t-il des réponses disponibles pour cette question si le système sous Win8?
Jonathan M
1
Pour Windows - regardez ici: dba.stackexchange.com/questions/24403/…
Dr. Aaron Dishno
Pour les utilisateurs de mac, tout ce dont vous avez besoin est ceci et l'étape 1-4 de la réponse de @ user1341296.
shellbye

Réponses:

270
  1. Arrêtez MySQL à l'aide de la commande suivante:

    sudo /etc/init.d/mysql stop
  2. Copiez le répertoire de données existant (situé par défaut dans /var/lib/mysql) à l'aide de la commande suivante:

    sudo cp -R -p /var/lib/mysql /newpath
  3. éditez le fichier de configuration MySQL avec la commande suivante:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Recherchez l'entrée datadiret modifiez le chemin d'accès (qui devrait être /var/lib/mysql) vers le nouveau répertoire de données.

  5. Dans le terminal, entrez la commande:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Recherchez les lignes commençant par /var/lib/mysql. Changez /var/lib/mysqlles lignes avec le nouveau chemin.

  7. Enregistrez et fermez le fichier.

  8. Redémarrez les profils AppArmor avec la commande:

    sudo /etc/init.d/apparmor reload
  9. Redémarrez MySQL avec la commande:

    sudo /etc/init.d/mysql restart
  10. Connectez-vous maintenant à MySQL et vous pourrez accéder aux mêmes bases de données que vous aviez auparavant.

user1341296
la source
33
Ce qui précède n'a pas réussi à résoudre le problème pour moi sur Ubuntu 12.04 (précis). J'ai découvert qu'il fallait éditer le fichier /etc/apparmor.d/tunables/alias pour inclure une ligne "alias / var / lib / mysql / -> / newpath /", avec ceci en place, je n'avais pas besoin de modifications dans l'un des autres fichiers AppArmor. Cela a fonctionné immédiatement après le redémarrage d'AppArmor avec "/etc/init.d/apparmor restart" et MySQL avec "restart mysql".
mak
2
Apparmor n'est pas pertinent sur CentOS. Il y a SELinux à la place. Peut lire sur comment désactiver ou gérer ici blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam
12
sur l'édition de mak (ce qui est nécessaire) n'oubliez pas la virgule à la fin de la lignealias /var/lib/mysql/ -> /newpath/,
Michael
4
Je ne saurais trop insister sur l'importance du commentaire de Michel ci-dessus: AJOUTER UN COMMA DE TRAILING et sauver quelques neurones. Désolé pour les casquettes.
alx
2
Ça ne marche pas pour moi. J'obtiens Job pour mysql.service a échoué. Voir 'systemctl status mysql.service' et 'journalctl -xn' pour plus de détails lorsque vous essayez de redémarrer mysqld, et l'erreur est que le disque est plein. Il a 500 Go d'espace libre ...
Frank H.
17

Rapide et facile à faire:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

Modifiez le /etc/my.cnffichier, et sous [mysqld]ajoutez cette ligne:

datadir=/new/dir/for/mysql/

Si vous utilisez CageFS (avec ou sans CloudLinux) et souhaitez changer le répertoire MySQL, vous DEVEZ ajouter le nouveau répertoire à ce fichier:

/etc/cagefs/cagefs.mp

Et puis exécutez cette commande:

cagefsctl --remount-all
sMyles
la source
1
Heureux d'entendre: P
sMyles
Un grand merci, et pour ajouter si vous voulez écrire complètement ceci comme je l'ai fait, vous pouvez utiliser ceci: sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / etc / my.cnf
berimbolo
Cela n'a pas fonctionné pour moi. J'ai essayé ceci et beaucoup d'autres alternatives différentes. J'arrive à la même conclusion que user3338098 quand il dit que c'est la seule façon qui fonctionne: serverfault.com/questions/503887/…
Volksman
@Volksman tout ce que le lien dit, c'est qu'il a dû supprimer et réinstaller ... il y a de fortes chances que vous ayez tous les deux un autre problème spécifique au serveur, car MySQL et MariaDB prennent tous deux en charge la configuration de datadir, et je l'ai récemment fait (il y a 6 mois) sur un autre serveur sans problèmes
sMyles
@sMyles oui, il a été supprimé et installé mais après avoir monté / var / lib / mysql ailleurs, c'est à dire une méga partition contrairement à celle sur laquelle / var était précédemment montée. S'il y a un problème spécifique avec nos systèmes, ce serait formidable de comprendre que c'est le cas. Il s'agissait d'une nouvelle installation standard du système d'exploitation Centos 7 avec RAID 10 avec disque dur 8x, mais généralement ces détails de la matrice de disques sont transparents pour le logiciel.
Volksman
15

vous devrez copier les données actuelles dans le nouveau répertoire et changer my.cnfvotre MySQL.

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

Vous devez copier la base de données lorsque le serveur n'est pas en cours d'exécution .

RageZ
la source
Eh bien, c'est ce que je ne peux pas faire. Je veux changer de répertoire mais je veux créer de nouvelles bases de données dans un nouveau répertoire. Et vous voulez accéder à la fois à l'ancien répertoire et aux nouvelles bases de données de répertoire.
MySQL DBA
1
@MySQL DBA: si vous utilisez du ln -slynx symbolique statique, cela ne le fera-t-il pas?
RageZ
Eh bien, je suis un peu confus avec l'utilisation de cette commande. Comme je l'ai expliqué précédemment, je souhaite créer de nouvelles bases de données dans un nouveau répertoire. Est-ce possible avec un lien symbolique.
MySQL DBA
1
vous pouvez créer un nouveau répertoire, utiliser un lien symbolique pour faire apparaître le fichier dans le nouveau my.cnf
répertoire
2
vers le bas voté parce que cela ne fonctionne pas comme détaillé sur serverfault.com/a/733998/279553
user3338098
14

Vous devez d'abord arrêter le serveur mysql. par exemple

# /etc/init.d/mysql stop

Après cela, vous devez copier l'ancien répertoire de données (par exemple / var / lib / mysql) incl. privilèges sur votre nouveau répertoire via

# cp -R -p /var/lib/mysql /new/data/dir

maintenant vous pouvez modifier /etc/mysql/my.cnfles nouvelles données et redémarrer le serveur

# /etc/init.d/mysql restart
H6.
la source
5
vers le bas voté parce que cela ne fonctionne pas comme détaillé sur serverfault.com/a/733998/279553
user3338098
7

Si comme moi vous êtes sur debian et que vous souhaitez déplacer le répertoire mysql vers votre domicile ou un chemin sur / home / ..., la solution est:

  • Arrêtez mysql par "sudo service mysql stop"
  • remplacez la variable "datadir" par le nouveau chemin dans "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Faites une sauvegarde de / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • supprimer ce répertoire: "sudo rm -R / var / lib / mysql"
  • Déplacer les données vers le nouveau répertoire: "cp -R -p / path_to_my_backup / path_new_dir
  • Modifier l'accès par "sudo chown -R mysql: mysql / path_new_dir"
  • Remplacez la variable "ProtectHome" par "false" sur "/etc/systemd/system/mysqld.service"
  • Recharger systemd par "sudo systemctl daemon-reload"
  • Redémarrez mysql par "service mysql restart"

Un jour pour trouver la solution pour moi sur la documentation mariadb. J'espère que cela aidera certains gars!

Sirac
la source
Le fichier /etc/systemd/system/mysqld.service n'est pas ici. Une idée de l'endroit où je dois regarder?
Ron Piggott
1
Pour ceux qui utilisent MariaDB, le fichier de service se trouve à /lib/systemd/system/[email protected]
Ron Piggott
5

Je voulais garder une base de données sur ma machine, mais aussi avoir une donnée sur mon disque dur externe, et basculer entre l'utilisation des deux.

Si vous êtes sur un Mac et que vous avez installé MySQL à l'aide de Homebrew, cela devrait fonctionner pour vous. Sinon, il vous suffira de remplacer les emplacements appropriés pour MySQL datadirsur votre machine.

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

Ensuite, pour revenir en arrière, faites simplement:

mv mysql mysql.remote

mv mysql.local mysql

et vous utilisez à nouveau votre base de données locale. J'espère que cela pourra aider.

wfbarksdale
la source
1
cela ne répond pas exactement à la question comme indiqué - cependant c'était exactement ce que je recherchais - et c'est une manière élégante de gérer un cas / bogue limite que my.cnf ne gère pas bien les espaces: bugs.mysql.com /bug.php?id=26033 . Je vais lier cette solution de contournement à ce rapport de bogue.
gabe
vers le bas voté parce que cela ne fonctionne pas comme détaillé sur serverfault.com/a/733998/279553
user3338098
5

Premier arrêt mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

Puis changez datadir dans votre /etc/mysql/my.cnf
démarrage mysqld

Remarques:
# 1: vous devez probablement ajuster vos paramètres SELinux (essayez avec SELinux désactivé en cas de problèmes), Apparmor (Ubuntu) peut également être un problème.

# 2: voir MySQL Install DB Reference

Murlo
la source
4

Arrêtez d'abord votre mysql

sudo service mysql stop

copiez les données mysql vers le nouvel emplacement.

sudo cp -rp /var/lib/mysql /yourdirectory/

si vous utilisez apparmor, modifiez le fichier suivant et procédez comme suit

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

Remplacez where / var / lib / par / yourdirectory / puis ajoutez le suivant s'il n'y en a pas au fichier

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

Enregistrez le fichier avec la commande

:wq

Editez le fichier my.cnf

sudo vim /etc/mysql/my.cnf

Remplacez where / var / lib / par / yourdirectory / puis enregistrez avec la commande

:wq

enfin démarrer mysql

sudo service mysql start

@ en savoir plus sur raid0, optimisation ici

naddame
la source
vers le bas voté parce que cela ne fonctionne pas comme détaillé sur serverfault.com/a/733998/279553
user3338098
peut-être que cela ne fonctionne pas pour une autre distribution, mais si vous utilisez ubuntu, cela fonctionne très bien pour moi et je change de chemin pour chaque nouveau serveur ubuntu installé pour activer raid0.
naddame
2
Je sais que les gens votent contre cela, mais je tiens à vous dire que cela m'a sauvé la journée. Merci!
Daniel Loureiro
3

Cette solution fonctionne sous Windows 7 à l'aide de Workbench. Vous aurez besoin des privilèges d'administrateur pour ce faire. Il crée une jonction (comme un raccourci) vers l'endroit où vous voulez vraiment stocker vos données

Ouvrez Workbench et sélectionnez INSTANCE - Startup / Shutdown Arrêtez le serveur

Installez Junction Master depuis https://bitsum.com/junctionmaster.php

Accédez à C: \ ProgramData \ MySQL \ MySQL Server 5.6

Cliquez avec le bouton droit de la souris sur Données et sélectionnez «DÉPLACER, puis LIER le dossier vers ...» Acceptez l'avertissement Pointez la destination vers «Votre nouveau répertoire de données ici sans les guillemets» Cliquez sur DÉPLACER ET LIER

Allez maintenant dans "Votre nouveau répertoire de données ici sans les guillemets"

Cliquez avec le bouton droit sur Données Allez dans l'onglet de sécurité Cliquez sur Modifier Cliquez sur Ajouter un type de SERVICE RÉSEAU puis sur Vérifier les noms Cliquez sur OK Cliquez sur la case à cocher Autoriser le contrôle total, puis sur OK

Revenez à Workbench et démarrez le serveur

Cette méthode a fonctionné pour moi en utilisant MySQL Workbench 6.2 sur Windows 7 Entreprise.

Rob
la source
2

Tout comme @ user1341296 l'a dit, plus ...

Vous feriez mieux de ne pas changer /etc/mysql/my.cnf Au lieu de cela, vous voulez créer un nouveau fichier /etc/mysql/conf.d/ext.cnf(n'importe quel nom, mais l'extension devrait être cnf)

Et mettez-y votre monnaie:

[mysqld]
datadir=/vagrant/mq/mysql

De cette façon

  • Vous n'avez pas besoin de modifier le fichier existant (plus facile pour les scripts d'automatisation)
  • Aucun problème avec la mise à jour de la version MySQL (et c'est configs!).
Pavel
la source
2

Si vous êtes un utilisateur Windows et que vous atterrissez ici pour découvrir que toutes les réponses sont destinées aux utilisateurs Linux, ne soyez pas déçu! Je ne vous laisserai pas perdre votre temps comme je l'ai fait.

Un peu de conneries avant la solution:

MySQL utilise un répertoire de données pour stocker les données des différentes bases de données que vous créez. Eh bien, à la fin, il doit les stocker sous la forme de fichiers avec un peu de jonglerie supplémentaire dans l'application et le format de fichier pour s'assurer que les promesses de base de données que vous avez apprises dans les classes de bases de données sont intactes.

Maintenant, vous voulez vous assurer qu'il y a suffisamment d'espace pour stocker de grandes bases de données que vous pourriez créer à l'avenir, et vous vous êtes donc dit, Hey! Je veux le mettre dans un autre lecteur qui a plus d'espace.

Alors vous faites ce qui suit.

Étape - 1 : Arrêt du service MySQL.

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Étape - 2 : recherche du répertoire de données actuel

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

Par défaut, il devrait y avoir un dossier nommé ici Data , c'est celui qui est utilisé par MySQL dans les paramètres par défaut (à condition qu'ils n'aient pas trouvé un autre meilleur emplacement), mais vérifions cela.

Trouver le my.inifichier, devrait être là.

Ouvrez-le dans un éditeur (Notepad ++ peut-être).

Faites un CTRL + F pour le découvrir datadirdans le fichier.

Tout ce qui est mentionné ici est l'emplacement réel actuellement utilisé par MySQL pour le répertoire de données. C'est ce que vous voulez changer.

Étape - 3 : Remplacement par un nouveau répertoire de données.

Supposons que vous souhaitiez que votre nouveau répertoire de données soit W: __ MySQL_Data. Modifions la datadirvaleur du my.inifichier en cette valeur. Gardez la valeur précédente commentée afin que vous n'ayez pas à vous en souvenir.

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

Maintenant, utilisez xcopypour copier la valeur par défaut datadirdans W:\. Lancez l'invite de commande (Fenêtre + R, cmd, Entrée)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

Et renommez le dossier copié avec la nouvelle datadirvaleur que vous avez modifiée. Ici:W:/__MySQL_Data

Pourquoi ne pas simplement copier? Eh bien, parce que ce n'est pas COOL !, cela vous aide à ne pas perdre les autorisations sur le dossier copié, de sorte que lorsque vous redémarrez MySQL80, cela ne donnera pas une erreur stupide: "Le service MySQL80 sur l'ordinateur local a démarré puis arrêté. Certains services s'arrêtent automatiquement si ils ne sont pas utilisés par d'autres services ou programmes. " - Gracieuseté: Microsoft

Étape - 4 : Redémarrage du service

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

Étape - 5 : Terminé! Maintenant remets-toi au travail !!

Prem KTiw
la source
1
Merci qui a été utile mais avertissement: my.ini n'est pas accessible en écriture par un utilisateur normal à moins que vous ne modifiiez ses autorisations. Oh et ProgramData est un dossier caché, vous devez donc modifier les paramètres du dossier Explorer pour le voir.
JonP
1

J'ai souvent besoin de le faire lors de la mise à niveau des machines, en passant d'une boîte à l'autre. En plus de déplacer / var / lib / mysql vers un meilleur emplacement, j'ai souvent besoin de restaurer d'anciennes tables de base de données à partir d'une ancienne installation MySQL. Pour ce faire ...

  1. Arrêtez mysql. Suivez les instructions ci-dessus, si nécessaire.
  2. Copiez les répertoires de la base de données - il y en aura un pour chacune des bases de données de votre ancienne installation - vers le nouvel emplacement DATADIR. Mais omettez les répertoires "mysql" et "performance_schema".
  3. Corrigez les autorisations parmi les répertoires de base de données copiés. La propriété doit être mysql: mysql, les répertoires doivent être 700 et les fichiers 660.
  4. Redémarrez mysql. En fonction de votre installation, les anciens fichiers de base de données doivent être mis à jour.
K Markey
la source
désolé pour le vote négatif, cette solution est peut-être correcte, je ne l'ai pas essayée.
user3338098
1

Nous avons dû déplacer MySQL dans le /homerépertoire car il était mappé à partir d'un autre disque physique. Afin de simplifier le live, au lieu de changer de répertoire dans my.cnf, nous avons mappé le nouveau répertoire /home/mysqlà la place du répertoire d'origine/var/lib/mysql . Cela fonctionne pour nous comme un charme (testé sur CentOS 7.1).

Créez le nouveau répertoire et définissez les autorisations appropriées.

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

Arrêtez MySQL s'il est en cours d'exécution.

systemctl stop mysql

Déplacez le répertoire de données.

mv -f /var/lib/mysql/* /home/mysql

Créez une monture permanente et exécutez-la.

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

Redémarrez le serveur.

systemctl start mysql
TomS
la source
1

Si vous souhaitez le faire par programme (pas de saisie de texte manuelle avec gedit), voici une version pour un Dockerfile basée sur la réponse de user1341296 ci-dessus:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

Disponible sur Docker hub ici: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/

Richard
la source
0

Tout d'abord, vous devez savoir où se trouve votre fichier de configuration? où est votre fichier de configuration?

SI vous avez installé avec apt-get ou yum install。

le fichier de configuration peut apparaître dans

/etc/mysql/my.cnf

le fichier de données peut apparaître dans

/ var / lib / mysql

et ce que tu devrais faire c'est

  1. arrête mysql
  2. changer les données mysql dans un nouveau répertoire
  3. changer le fichier de configuration
  4. recharger le fichier de configuration
  5. redémarrer mysql

puis les travaux sont terminés.

Mais si vous ne l'avez pas installé avec apt ou yum, le répertoire peut ne pas l'aimer, et vous pouvez trouver les fichiers mysql avec

où est mysql

42 loup
la source
vers le bas voté parce que cela ne fonctionne pas comme détaillé sur serverfault.com/a/733998/279553
user3338098
0

Sous SuSE 13.1, cela fonctionne très bien pour déplacer le répertoire de données mysql ailleurs, par exemple vers / home / example_user /, et pour lui donner un nom plus informatif:

Dans / var / lib /:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

J'ai redémarré mysql:

# systemctl restart mysql.service

mais soupçonnez que même cela n'était pas nécessaire.

user3346151
la source
0

Pour l'un des environnements, j'ai changé le répertoire de données mysql vers un nouvel emplacement mais lors du redémarrage du serveur mysql, cela prenait du temps. J'ai donc vérifié le port et j'ai trouvé qu'un autre processus écoutait sur le port mysql. J'ai donc tué le processus et redémarré le serveur mysql et cela a bien fonctionné.

J'ai suivi les étapes ci-dessous pour changer le répertoire de données qui a parfaitement fonctionné. changer le répertoire de données mysql sous Linux

tiwary santosh
la source
Bienvenue dans Stack Overflow! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien pour référence.
Tim Diekmann
0

Les étapes ci-dessus sont fondamentales et élémentaires. Je les ai suivis et j'ai toujours l'erreur de "mysql n'a pas réussi à démarrer".

Pour que le nouveau dossier stocke les données mysql, vous devez vous assurer que le dossier dispose des autorisations et de la propriété mysql: mysql.

En plus de cela, il doit vérifier les autorisations et la propriété du répertoire parent de mysql s'il a, par exemple, / data / mysql /. Ici, le répertoire / data / doit être root: root. J'ai corrigé l'erreur "mysql n'a pas réussi à démarrer" après avoir changé la propriété du répertoire parent de / mysql. Le système d'exploitation de ma machine virtuelle est RHEL 7.6.

user3325137William
la source
J'ai essayé selinux dans RHEL7.6 en changeant SELINUX = enforcing en SELINUX = permissive, cela n'a pas fonctionné pour moi.
user3325137William
0

Il est également possible de créer un lien symbolique sur le datadir. Au moins dans macOS, environnement de développement.

(homebrew) par exemple

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

Redémarrez mysql.

Maciek Rek
la source
-1

Si vous utilisez SE Linux, réglez-le en mode permissif en éditant / etc / selinux / config et en changeant SELINUX = enforcing en SELINUX = permissive

Tanxiuguang
la source
comme détaillé ici serverfault.com/questions/503887/… selinux n'est pas en faute il y a un autre problème empêchant le changement de datadirpropriété
user3338098