Modifica della directory dell'archivio dati MongoDB


184

Fino ad ora non ho specificato una directory di dati MongoDB e ho avuto solo una partizione primaria da 30 GB.

Ho appena esaurito lo spazio e ho aggiunto un nuovo disco rigido. Come posso trasferire i miei dati (apparentemente in /var/lib/mongodb/) e configurare MongoDB in modo che tutto finisca dal nuovo disco senza influire sulla mia installazione esistente?


Dovresti anche assicurarti che le tue autorizzazioni sul nuovo mount point abbiano r + x: sudo chmod o+rx /mediaad esempio se il tuo mount point è media. R + x deve essere disponibile per gli "altri" gruppi e utenti dal primo punto di montaggio.
parole per il

Risposte:


219

La risposta breve è che il --dbpathparametro in MongoDB ti permetterà di controllare da quale directory MongoDB legge e scrive i suoi dati.

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

Avvia mongodb e inserisce i file /usr/local/mongodb-data.

A seconda della distribuzione e dell'installazione di MongoDB, puoi anche configurare il mongod.conffile per farlo automaticamente:

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

I pacchetti ufficiali 10gen Linux ( Ubuntu / Debian o CentOS / Fedora ) vengono forniti con un file di configurazione di base che viene inserito /etc/mongodb.confe il servizio MongoDB lo legge all'avvio. Puoi apportare la modifica qui.


9
Nella mia scatola debian è mongodb.conf, non mongod.conf
UpTheCreek

12
Ho aggiornato /etc/mongodb.confper questa soluzione. Quindi, dopo aver iniziato mongod, ho visto che /data/dbera usato. Perché l'aggiornamento mongodb.conf non ha influenzato la posizione in cui mongod ha archiviato il db? (Nota che usare l' --dbpathargomento ha funzionato.
Kevin Meredith,

Sulla mia scatola Fedora è /etc/mongodb.confe l'aggiornamento che funziona bene per me.
tuxdna,

4
La nuova directory di dati deve essere chownrivolta all'utente mongod per gli script di avvio del servizio.
Pete Garafano,

come faccio chown?
Chovy

102

Risolto in 2 minuti di inattività :)
Basta spostare la cartella, aggiungere il collegamento simbolico, quindi ottimizzare le autorizzazioni.

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
Penso che questa dovrebbe essere la risposta. Trovo sempre i collegamenti simbolici come un'ottima soluzione e promuovo qualsiasi soluzione che li usi nel cambiare la configurazione, ecc.
guy mograbi,

Probabilmente non c'è bisogno di usermod. Manca l'autorizzazione + x per gli "altri" utenti sull'albero di dbpath chmod -R o+x /<home>. vedi: stackoverflow.com/a/38193187/205049
Oori

Seguo queste istruzioni (usando dbpath in un altro disco), sto ancora ottenendo Permission denied: "/var/lib/mongodb"Ecco come /home/../mongodb/mongodb/ assomiglia a: 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
hai bisogno di chiarimenti su dove in quale cartella ti trovi quando esegui il mvcomando, se esegui il comando mv da lib, non hai più mongodb lna
Andy,

1
Ho provato la tua soluzione ma quando riavvio l'applicazione con il seguente errore - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] eccezione in initAndListen: 28596 Impossibile determinare lo stato del file di blocco nella directory dei dati / var / lib / mongo: boost :: filesystem :: status: Autorizzazione negata: "/var/lib/mongo/mongod.lock", terminando
Arun chauhan,

33

Il seguente comando funzionerà per te, se vuoi cambiare il percorso predefinito. Basta digitare questo nella directory bin di mongodb.

mongod --dbpath=yourdirectory\data\db

Nel caso in cui si desideri spostare anche i dati esistenti, è sufficiente copiare tutte le cartelle dalla directory data \ db esistente alla nuova directory prima di eseguire il comando.

E anche interrompere i servizi mongodb esistenti che sono in esecuzione.


1
Funziona anche su Linux. Ho creato una directory chiamata "data" accanto allo script mondod ed eseguito in questo modo: ./mongod --dbpath = data
cagdasalagoz

29

Crea un file chiamato mongod.cfg nella cartella MongoDB se non lo hai. Nel mio caso: C: \ Users \ ivanbtrujillo \ MongoDB

Quindi, modifica mongod.cfg con il blocco note e aggiungi una riga con il seguente (il nostro dbpath personalizzato):

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

In questo file dovresti specificare anche il percorso di log. Il mio file mongod.cfg è:

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

Se si utilizza mongoDB come servizio di Windows, è necessario modificare questa chiave e specificare il file mongod.cfg.

Per installare mongodb come servizio Windows, eseguire questo comando:

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

Apri regedit.exe e vai al seguente percorso:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

Il servizio MongoDB non funziona, dobbiamo modificare la chiave ImagePath, eliminarne il contenuto e inserire quanto segue:

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

Indichiamo a mongo il suo file di configurazione e il suo percorso di log.

Quindi, quando si avvia il servizio mongodb, funziona.

Ecco un tutorial completo per installare mongoDB in Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

Spero che sia d'aiuto,


1
MongoDB 2.6 e versioni successive utilizzano i file di configurazione YAML. Il vecchio formato è ancora supportato per la compatibilità con le versioni precedenti, ma potresti voler utilizzare quello nuovo. Dettagli qui .
gronostaj,

La variabile dbpath esiste anche per Linux. Cerca in /etc/mongod.conf.
xpros,

23

Copia il contenuto di /var/lib/mongodba /data/db. I file che dovresti cercare dovrebbero avere nomi simili your_db_name.nse your_dbname.ndove nc'è un numero che inizia con 0. Se non vedi questi file sotto /var/lib/mongodb, cercali sul tuo filesystem.

Una volta copiato, utilizzare --dbpath=/data/dball'avvio di MongoDB tramite il mongodcomando.


c'è un modo per farlo accadere ogni volta che si riavvia il server?
user4951

1
@JimThio è possibile aggiungere questa opzione allo script della shell che avvia mongodb. In genere è /etc/init.d/mongod o /etc/init.d/mongodb.
lobster1234,

19

Ecco cosa ho fatto, spero che sia utile a chiunque altro:

passi:

  1. Interrompere i servizi che utilizzano mongodb
  2. Stop mongod - il mio modo di farlo era con il mio file rc /etc/rc.d/rc.mongod stop, se usi qualcos'altro, come systemd, dovresti controllare la tua documentazione su come farlo
  3. Crea una nuova directory sul nuovo hard disk -mkdir /mnt/database
  4. Assicurati che mongodb abbia i privilegi di leggere / scrivere da quella directory (di solito chown mongodb:mongodb -R /mnt/database/mongodb) - grazie @DanailGabenski.
  5. Copia la cartella dei dati del tuo mongodb nella nuova posizione -cp -R /var/lib/mongodb/ /mnt/database/
  6. Rimuovi la vecchia cartella del database -rm -rf /var/lib/mongodb/
  7. Crea collegamento simbolico alla nuova cartella del database -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Inizia mongod -/etc/rc.d/rc.mongod start
  9. Controlla il registro del tuo mongod e fai qualche controllo di integrità (prova mongoa connetterti al tuo database per vedere se tutto va bene)
  10. Avvia i tuoi servizi che hai interrotto al punto 1

Non c'è bisogno di dire che dovresti stare attento quando lo fai, specialmente con rm -rfma penso che questo sia il modo migliore per farlo.

Non dovresti mai provare a copiare la directory del database mentre mongod è in esecuzione, perché potrebbero esserci servizi che ne scrivono / leggono e che cambieranno il contenuto del tuo database.


1
Sebbene una vecchia risposta, ha funzionato parzialmente per me. È inoltre necessario assicurarsi che l'utente mongodb sia proprietario della nuova directory e del symlik affinché funzioni. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski,

3
Al punto 5, rendere il comando simile a cp -rp / var / lib / mongodb / / mnt / database / Ciò manterrà intatta la proprietà e l'autorizzazione della cartella.
Ketan Ghumatkar,

Ho provato la tua soluzione ma quando riavvio l'applicazione con il seguente errore - 2019-11-18T18: 58: 45.215 + 1100 I STORAGE [initandlisten] eccezione in initAndListen: 28596 Impossibile determinare lo stato del file di blocco nella directory dei dati / var / lib / mongo: boost :: filesystem :: status: Autorizzazione negata: "/var/lib/mongo/mongod.lock", terminando
Arun chauhan,

10

Se installato tramite apt-getUbuntu 12.04, non dimenticare di chown -R mongodb:nogroup /path/to/new/directory. Inoltre, modifica la configurazione in /etc/mongodb.conf.

Come promemoria, il mongodb-10genpacchetto è ora avviato tramite upstart, quindi lo script di configurazione è in/etc/init/mongodb.conf

L'ho appena passato, spero che i googler lo trovino utile :)


1

Per me, l'utente era mongodinvece dimongodb

sudo chown mongod:mongod /newlocation

È possibile visualizzare i log per gli errori se il servizio non riesce:

/var/log/mongodb/mongod.log


0

In debian / ubuntu, dovrai modificare lo script /etc/init.d/mongodb. In realtà, questo file dovrebbe estrarre le impostazioni da /etc/mongodb.conf ma non sembra estrarre la directory predefinita (probabilmente un bug)

Questo è un po 'un trucco, ma aggiungendo questi allo script è stato avviato correttamente:

Inserisci:

DBDIR=/database/mongodb

modificare:

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

per:

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

cosa succede se si desidera inserire il database nella directory home anziché in root?
JesseBoyd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.