Cambiar el directorio del almacén de datos MongoDB

184

Hasta ahora no he estado especificando un directorio de datos MongoDB y solo he tenido una partición primaria de 30 GB.

Me quedé sin espacio y agregué un nuevo disco duro. ¿Cómo puedo transferir mis datos (que aparentemente están en /var/lib/mongodb/) y configurar MongoDB para que todo salga del nuevo disco sin afectar mi instalación existente?

Mark Gill
fuente
También debe asegurarse de que sus permisos en el nuevo punto de montaje tengan r + x: sudo chmod o+rx /mediapor ejemplo, si su punto de montaje es media. R + x debe estar disponible para los 'otros' grupos y usuarios desde el primer punto de montaje.
wordsforthewise

Respuestas:

219

La respuesta corta es que el --dbpathparámetro en MongoDB le permitirá controlar desde qué directorio MongoDB lee y escribe sus datos.

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

Comenzaría mongodb y pondría los archivos /usr/local/mongodb-data.

Dependiendo de su distribución y la instalación de MongoDB, también puede configurar el mongod.confarchivo para hacer esto automáticamente:

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

Los paquetes oficiales de Linux 10gen ( Ubuntu / Debian o CentOS / Fedora ) se entregan con un archivo de configuración básica que se coloca /etc/mongodb.conf, y el servicio MongoDB lo lee cuando se inicia. Podrías hacer tu cambio aquí.

Brendan W. McAdams
fuente
9
En mi caja de debian es mongodb.conf, no mongod.conf
UpTheCreek
12
Actualicé /etc/mongodb.confpor esta solución. Luego, después de comenzar mongod, vi que /data/dbse usaba. ¿Por qué la actualización de mongodb.conf no afectó dónde mongod almacenó el db? (Tenga en cuenta que usar el --dbpathargumento funcionó.
Kevin Meredith
En mi caja de Fedora es /etc/mongodb.confy la actualización que funciona bien para mí.
tuxdna
44
El nuevo directorio de datos debe estar chowndirigido al usuario mongod para los scripts de inicio del servicio.
Pete Garafano
¿Cómo hago chown?
chovy
102

Lo resolvió en 2 minutos de tiempo de inactividad :)
Simplemente mueva su carpeta, agregue enlace simbólico y luego ajuste los permisos.

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
DmitrySandalov
fuente
3
Creo que esta debería ser la respuesta. Siempre encuentro enlaces simbólicos a ser una muy buena solución y que promuevan cualquier solución que los usa más de cambiar la configuración, etc ..
chico Mograbi
Probablemente no sea necesario usermod. Le falta el permiso ejecutable + x para "otros" usuarios en el árbol de dbpath chmod -R o+x /<home>. ver: stackoverflow.com/a/38193187/205049
oori el
Sigo estas instrucciones (usando dbpath en otro disco), sigo obteniendo Permission denied: "/var/lib/mongodb"Así es como /home/../mongodb/mongodb/ se ve así: 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
necesita una aclaración sobre dónde está la carpeta en la que se encuentra cuando ejecuta el mvcomando, si ejecuta el comando mv desde lib, ya no tiene mongodb lnpara
Andy
1
He intentado su solución, pero cuando reinicio la aplicación, aparece el siguiente error: 2019-11-18T18: 58: 45.215 + 1100 ALMACENAJE [initandlisten] excepción en initAndListen: 28596 No se puede determinar el estado del archivo de bloqueo en el directorio de datos / var / lib / mongo: boost :: filesystem :: status: Permiso denegado: "/var/lib/mongo/mongod.lock", finalizando
Arun chauhan
33

El siguiente comando funcionará para usted, si desea cambiar la ruta predeterminada. Simplemente escriba esto en el directorio bin de mongodb.

mongod --dbpath=yourdirectory\data\db

En caso de que también desee mover datos existentes, simplemente copie todas las carpetas del directorio data \ db existente al nuevo directorio antes de ejecutar el comando.

Y también detenga los servicios existentes de mongodb que se están ejecutando.

Yogesh Sanchihar
fuente
1
Esto también funciona en Linux. He creado un directorio llamado "datos" junto al script mondod y lo ejecuto así: ./mongod --dbpath = data
cagdasalagoz
29

Cree un archivo llamado mongod.cfg en la carpeta MongoDB si no lo tiene. En mi caso: C: \ Users \ ivanbtrujillo \ MongoDB

Luego, edite mongod.cfg con el bloc de notas y agregue una línea con lo siguiente (nuestro dbpath personalizado):

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

En este archivo también debe especificar la ruta de acceso. Mi archivo mongod.cfg es:

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

Si utiliza mongoDB como servicio de Windows, debe cambiar esta clave y especificar el archivo mongod.cfg.

Para instalar mongodb como un servicio de Windows, ejecute este comando:

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

Abra regedit.exe y vaya a la siguiente ruta:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

El servicio MongoDB no funciona, tenemos que editar la clave ImagePath, eliminar su contenido y poner lo siguiente:

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

Le indicamos a mongo su archivo de configuración y su ruta de acceso.

Luego, cuando inicia el servicio mongodb, funciona.

Aquí hay un tutorial completo para instalar mongoDB en Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

Espero eso ayude,

ivanbtrujillo
fuente
1
MongoDB 2.6 y versiones posteriores usan archivos de configuración YAML. El formato antiguo todavía es compatible con la compatibilidad con versiones anteriores, pero es posible que desee utilizar el nuevo. Detalles aquí .
gronostaj
La variable dbpath también existe para Linux. Busque en /etc/mongod.conf.
xpros
23

Copie el contenido de /var/lib/mongodba /data/db. Los archivos que debe buscar deben tener nombres como your_db_name.nsy your_dbname.ndónde nhay un número que comienza con 0. Si no ve esos archivos debajo /var/lib/mongodb, búsquelos en su sistema de archivos.

Una vez copiado, úselo --dbpath=/data/dbal iniciar MongoDB mediante el mongodcomando.

langosta1234
fuente
¿Hay alguna manera de hacer que esto suceda cada vez que se reinicia el servidor?
user4951
1
@ JimThio puede agregar este modificador al script de shell que inicia mongodb. Normalmente es /etc/init.d/mongod o /etc/init.d/mongodb.
lobster1234
19

Esto es lo que hice, espero que sea útil para cualquier otra persona:

Pasos:

  1. Detenga sus servicios que usan mongodb
  2. Detener mongod : mi forma de hacerlo fue con mi archivo rc /etc/rc.d/rc.mongod stop, si usa algo más, como systemd, debe verificar su documentación sobre cómo hacerlo
  3. Cree un nuevo directorio en el disco duro nuevo:mkdir /mnt/database
  4. Asegúrese de que mongodb tenga privilegios para leer / escribir desde ese directorio (generalmente chown mongodb:mongodb -R /mnt/database/mongodb) - gracias @DanailGabenski.
  5. Copie la carpeta de datos de su mongodb a la nueva ubicación :cp -R /var/lib/mongodb/ /mnt/database/
  6. Eliminar la antigua carpeta de la base de datos -rm -rf /var/lib/mongodb/
  7. Crear un enlace simbólico a la nueva carpeta de la base de datos :ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Comience mongod -/etc/rc.d/rc.mongod start
  9. Verifique el registro de su mongod y realice algunas comprobaciones de cordura (intente mongoconectarse a su base de datos para ver si todo está bien)
  10. Comience sus servicios que detuvo en el punto 1

No es necesario decir que debe tener cuidado al hacer esto, especialmente con, rm -rfpero creo que esta es la mejor manera de hacerlo.

Nunca debe intentar copiar el directorio de la base de datos mientras mongod se está ejecutando, porque puede haber servicios que escriben / leen desde él que cambiarán el contenido de su base de datos.

drinchev
fuente
1
Aunque era una vieja respuesta, funcionó parcialmente para mí. También debe asegurarse de que el usuario mongodb posee el nuevo directorio y el symlik para que funcione. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski
3
En el punto 5, haga que el comando se vea como cp -rp / var / lib / mongodb / / mnt / database / Esto mantendrá intacta la propiedad y el permiso de la carpeta.
Ketan Ghumatkar
He intentado su solución, pero cuando reinicio la aplicación, aparece el siguiente error: 2019-11-18T18: 58: 45.215 + 1100 ALMACENAJE [initandlisten] excepción en initAndListen: 28596 No se puede determinar el estado del archivo de bloqueo en el directorio de datos / var / lib / mongo: boost :: filesystem :: status: Permiso denegado: "/var/lib/mongo/mongod.lock", finalizando
Arun chauhan
10

Si se instala a través apt-getde Ubuntu 12.04, no se olvide chown -R mongodb:nogroup /path/to/new/directory. Además, cambie la configuración en /etc/mongodb.conf.

Como recordatorio, el mongodb-10genpaquete ahora se inicia a través del arranque, por lo que el script de configuración está en/etc/init/mongodb.conf

Acabo de pasar por esto, espero que los googlers lo encuentren útil :)

Roberto
fuente
1

Para mí, el usuario era en mongodlugar demongodb

sudo chown mongod:mongod /newlocation

Puede ver los registros de errores si el servicio falla:

/var/log/mongodb/mongod.log

IP
fuente
0

En debian / ubuntu, deberá editar el script /etc/init.d/mongodb. Realmente, este archivo debería extraer la configuración de /etc/mongodb.conf pero no parece extraer el directorio predeterminado (probablemente un error)

Esto es un truco, pero al agregarlos al script, comenzó correctamente:

añadir:

DBDIR=/database/mongodb

cambio:

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

a:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}
FGiorlando
fuente
¿Qué pasa si desea poner la base de datos en su directorio de inicio en lugar de root?
JesseBoyd