Modification du répertoire du magasin de données MongoDB


187

Jusqu'à présent, je n'ai pas spécifié de répertoire de données MongoDB et je n'ai eu qu'une seule partition primaire de 30 Go.

Je viens de manquer d'espace et j'ai ajouté un nouveau disque dur. Comment puis-je transférer mes données (qui sont apparemment dans /var/lib/mongodb/) et configurer MongoDB pour que tout s'exécute du nouveau disque sans affecter mon installation existante?


Vous devez également vous assurer que vos autorisations sur le nouveau point de montage ont r + x: sudo chmod o+rx /mediapar exemple, si votre point de montage est media. Le r + x doit être disponible pour les «autres» groupes et utilisateurs à partir du premier point de montage.
wordsforthewise

Réponses:


221

La réponse courte est que le --dbpathparamètre de MongoDB vous permettra de contrôler le répertoire dans lequel MongoDB lit et écrit ses données.

mongod --dbpath / usr / local / mongodb-data

Lancerait mongodb et mettre les fichiers /usr/local/mongodb-data.

En fonction de votre distribution et de l'installation de MongoDB, vous pouvez également configurer le mongod.conffichier pour le faire automatiquement:

# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /usr/local/var/mongodb

Les paquets Linux officiels de 10gen ( Ubuntu / Debian ou CentOS / Fedora ) sont livrés avec un fichier de configuration de base qui est placé dans /etc/mongodb.conf, et le service MongoDB le lit au démarrage. Vous pouvez faire votre changement ici.


9
Sur ma boîte Debian, c'est mongodb.conf, pas mongod.conf
UpTheCreek

13
J'ai mis /etc/mongodb.confà jour par cette solution. Puis, après avoir commencé mongod, j'ai vu que /data/dbc'était utilisé. Pourquoi la mise à jour de mongodb.conf n'a-t-elle pas affecté l'emplacement de stockage de la base de données par mongod? (Notez que l'utilisation de l' --dbpathargument a fonctionné.
Kevin Meredith

Sur ma boîte Fedora, c'est une /etc/mongodb.confmise à jour qui fonctionne bien pour moi.
tuxdna

4
Le nouveau répertoire de données doit être chown'd à l'utilisateur mongod pour les scripts de démarrage du service.
Pete Garafano

comment puis-je chown?
chovy

104

Résolu en 2 minutes d'arrêt :) Déplacez
simplement votre dossier, ajoutez un lien symbolique, puis réglez les autorisations.

sudo service mongod stop
sudo mv mongodb /new/disk/mongodb/
sudo ln -s /new/disk/mongodb/ /var/lib/mongodb
sudo chown mongodb:mongodb /new/disk/mongodb/
sudo service mongod start

# test if mongodb user can access new location:
sudo -u mongodb -s cd /new/disk/mongodb/
# resolve other permissions issues if necessary
sudo usermod -a -G <newdisk_grp> mongodb

3
Je pense que cela devrait être la réponse. Je trouve toujours que les liens symboliques sont une très bonne solution et je fais la promotion de toute solution qui les utilise en changeant de configuration, etc.
guy mograbi

Probablement pas besoin d'usermod. Il vous manque l'autorisation + x exécutable pour les "autres" utilisateurs sur l'arborescence de dbpath chmod -R o+x /<home>. voir: stackoverflow.com/a/38193187/205049
oori

Je suis ces instructions (en utilisant dbpath dans un autre disque), je reçois toujours Permission denied: "/var/lib/mongodb"Voici à quoi ressemble /home/../mongodb/mongodb/: drwxrwxr-x 3 mongodb mongodb 4096 oct 13 09:32 ../ drwxr-xr-x 2 mongodb nogroup 4096 oct 13 09:29 journal/ -rw------x 1 mongodb nogroup 67108864 sep 23 14:44 local.0* -rw------x 1 mongodb nogroup 16777216 sep 23 14:44 local.ns* -rwxr-xr-x 1 mongodb mongodb 0 oct 13 09:29 mongod.lock*
Machinerium

1
besoin de clarification pour savoir où dans quel dossier vous vous trouvez lorsque vous exécutez la mvcommande, si vous exécutez la commande mv à partir de lib, vous n'avez plus mongodb to lnto
Andy

1
J'ai essayé votre solution, mais lorsque je redémarre l'application, elle donne l'erreur suivante - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] exception dans initAndListen: 28596 Impossible de déterminer l'état du fichier de verrouillage dans le répertoire de données / var / lib / mongo: boost :: filesystem :: status: Autorisation refusée: "/var/lib/mongo/mongod.lock", se terminant
Arun chauhan

34

La commande suivante fonctionnera pour vous, si vous souhaitez modifier le chemin par défaut. Tapez simplement ceci dans le répertoire bin de mongodb.

mongod --dbpath=yourdirectory\data\db

Si vous souhaitez également déplacer des données existantes, copiez simplement tous les dossiers du répertoire data \ db existant dans un nouveau répertoire avant d'exécuter la commande.

Et arrêtez également les services mongodb existants en cours d'exécution.


1
Cela fonctionne aussi sous Linux. J'ai créé un répertoire appelé "data" à côté du script mondod et je l'ai exécuté comme ceci: ./mongod --dbpath = data
cagdasalagoz

29

Créez un fichier appelé mongod.cfg dans le dossier MongoDB si vous ne l'avez pas. Dans mon cas: C: \ Users \ ivanbtrujillo \ MongoDB

Ensuite, éditez mongod.cfg avec le bloc-notes et ajoutez une ligne avec ce qui suit (notre dbpath personnalisé):

dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

Dans ce fichier, vous devez également spécifier le chemin d'accès au journal. Mon fichier mongod.cfg est:

logpath=C:\Users\ivanbtrujillo\MongoDB\log\mongo.log
dbpath=C:\Users\ivanbtrujillo\MongoDB\data\db

Si vous utilisez mongoDB comme service Windows, vous devez modifier cette clé et spécifier le fichier mongod.cfg.

Pour installer mongodb en tant que service Windows, exécutez cette commande:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" –install**

Ouvrez regedit.exe et accédez à l'itinéraire suivant:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

Le service MongoDB ne fonctionne pas, nous devons éditer la clé ImagePath, supprimer son contenu et mettre ce qui suit:

**"C:\Users\ivanbtrujillo\MongoDB\bin\mongod.exe" --config "C:\Users\ivanbtrujillo\MongoDB\mongod.cfg" 
--logpath="C:\Users\ivanbtrujillo\MongoDB\log\mongo.log" –service**

Nous indiquons à mongo son fichier de configuration et son chemin d'accès.

Ensuite, lorsque vous lancez le service mongodb, cela fonctionne.

Voici un tutoriel complet pour installer mongoDB sous Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

J'espère que cela aide,


1
MongoDB 2.6 et plus récent utilisent des fichiers de configuration YAML. L'ancien format est toujours pris en charge pour la compatibilité ascendante, mais vous souhaiterez peut-être utiliser le nouveau. Détails ici .
gronostaj

La variable dbpath existe également pour Linux. Regardez dans /etc/mongod.conf.
xpros

23

Copiez le contenu de /var/lib/mongodbvers /data/db. Les fichiers que vous devriez rechercher doivent avoir des noms comme your_db_name.nset your_dbname.nnest un nombre commençant par 0. Si vous ne voyez pas de tels fichiers sous /var/lib/mongodb, recherchez-les sur votre système de fichiers.

Une fois copié, utilisez --dbpath=/data/dblors du démarrage de MongoDB via la mongodcommande.


existe-t-il un moyen pour que cela se produise à chaque redémarrage du serveur?
user4951

1
@JimThio vous pouvez ajouter ce commutateur au script shell qui démarre mongodb. Il s'agit généralement de /etc/init.d/mongod ou /etc/init.d/mongodb.
lobster1234

19

Voici ce que j'ai fait, j'espère que cela sera utile à quiconque:

Pas:

  1. Arrêtez vos services qui utilisent mongodb
  2. Arrêtez mongod - ma façon de faire était avec mon fichier rc /etc/rc.d/rc.mongod stop, si vous utilisez autre chose, comme systemd, vous devriez vérifier votre documentation comment faire cela
  3. Créez un nouveau répertoire sur le nouveau disque dur -mkdir /mnt/database
  4. Assurez-vous que mongodb dispose des privilèges de lecture / écriture à partir de ce répertoire (généralement chown mongodb:mongodb -R /mnt/database/mongodb) - merci @DanailGabenski.
  5. Copiez le dossier de données de votre mongodb vers le nouvel emplacement -cp -R /var/lib/mongodb/ /mnt/database/
  6. Supprimer l'ancien dossier de base de données -rm -rf /var/lib/mongodb/
  7. Créer un lien symbolique vers le nouveau dossier de base de données -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Démarrer Mongod -/etc/rc.d/rc.mongod start
  9. Vérifiez le journal de votre mongod et effectuez une vérification de cohérence (essayez mongode vous connecter à votre base de données pour voir si tout va bien)
  10. Démarrez vos services que vous avez arrêtés au point 1

Il n'est pas nécessaire de dire que vous devez être prudent lorsque vous faites cela, en particulier avec, rm -rfmais je pense que c'est la meilleure façon de le faire.

Vous ne devriez jamais essayer de copier le répertoire de la base de données pendant que mongod est en cours d'exécution, car il peut y avoir des services qui en écrivent / lisent et modifient le contenu de votre base de données.


1
Bien que ce soit une vieille réponse, cela a fonctionné en partie pour moi. Vous devez également vous assurer que l'utilisateur mongodb possède le nouveau répertoire et le symlik pour que cela fonctionne. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski

3
Au point 5, faites en sorte que la commande ressemble à cp -rp / var / lib / mongodb / / mnt / database / Cela gardera la propriété et l'autorisation du dossier intactes.
Ketan Ghumatkar

J'ai essayé votre solution, mais lorsque je redémarre l'application, cela donne l'erreur suivante - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] exception dans initAndListen: 28596 Impossible de déterminer l'état du fichier de verrouillage dans le répertoire de données / var / lib / mongo: boost :: filesystem :: status: Autorisation refusée: "/var/lib/mongo/mongod.lock", se terminant
Arun chauhan

10

S'il est installé via apt-getUbuntu 12.04, n'oubliez pas de le faire chown -R mongodb:nogroup /path/to/new/directory. Modifiez également la configuration dans /etc/mongodb.conf.

Pour rappel, le mongodb-10genpackage est maintenant lancé via upstart, donc le script de configuration est en/etc/init/mongodb.conf

Je viens de passer par là, j'espère que les googleurs le trouveront utile :)


1

Pour moi, l'utilisateur était mongodau lieu demongodb

sudo chown mongod:mongod /newlocation

Vous pouvez voir les journaux d'erreurs si le service échoue:

/var/log/mongodb/mongod.log


0

Dans debian / ubuntu, vous devrez éditer le script /etc/init.d/mongodb. Vraiment, ce fichier devrait extraire les paramètres de /etc/mongodb.conf mais il ne semble pas extraire le répertoire par défaut (probablement un bogue)

C'est un peu un hack, mais les ajouter au script l'a fait démarrer correctement:

ajouter:

DBDIR=/database/mongodb

changement:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --config $CONF run"}

à:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}

et si vous voulez mettre la base de données dans votre répertoire personnel au lieu de root?
JesseBoyd

0

J'ai trouvé un cas particulier qui fait apparaître l'échec des liens symboliques:

J'ai fait une installation d'entreprise standard de mongodb mais j'ai changé le / var / lib / mongodb en lien symbolique car je voulais utiliser un système de fichiers XFS pour mon dossier de base de données et un troisième système de fichiers pour le dossier de journal.

$ sudo systemctl start mongod (échoue avec un message aucune permission d'écrire dans mongodb.log) .. mais il a réussi si j'ai commencé avec le même fichier de configuration:

.. en tant que propriétaire des disques externes (ziggy), j'ai pu démarrer $ mongod --config /etc/mongodb.conf --fork

J'ai finalement découvert que .. les liens symboliques pointaient vers un système de fichiers différent et le mongodb (utilisateur) n'avait pas l'autorisation de parcourir le dossier auquel le lien symbolique faisait référence. Les liens symboliques et les dossiers auxquels les liens symboliques faisaient référence avaient des droits étendus sur l'utilisateur mongod, donc cela n'avait aucun sens?

/ var / log / mongodb a été changé (de l'installation std ent) en un lien symbolique ET j'avais vérifié avant:

$ ll / var / log / mongodb lrwxrwxrwx 1 mongodb mongodb 38 octobre 28 21:58 / var / log / mongodb -> / media / ziggy / XFS_DB / mongodb / log /

$ ll -d / media / ziggy / Ext4DataBase / mongodb / log drwxrwxrwx 2 mongodb mongodb 4096 1 novembre 12:05 / media / ashley / XFS_DB / mongodb / log /

.. Mais cela semblait n'avoir aucun sens .. bien sûr l'utilisateur mongodb avait un accès rwx au lien, au dossier et au fichier mongodb.log .. mais il ne pouvait pas le trouver via le lien symbolique car le dossier BASE du média ne pouvait pas être recherché par mongodb.

DONC .. J'AI ÉVENTUELLEMENT FAIT CELA: $ ll / media / ziggy /. . drwx ------ 5 ziggy ziggy 4096 28 octobre 21:49 XFS_DB /

et a trouvé les autorisations x manquantes incriminées.

$ chmod a + x / media / ziggy / XFS_DB a résolu le problème

Cela semble stupide avec le recul, mais aucune recherche n'a révélé quoi que ce soit d'utile.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.