Alterando o diretório de armazenamento de dados do MongoDB

184

Até o momento, eu não especificava um diretório de dados do MongoDB e tinha apenas uma partição primária de 30 GB.

Acabei o espaço e adicionei um novo disco rígido. Como posso transferir meus dados (aparentemente /var/lib/mongodb/) e configurar o MongoDB para que tudo saia do novo disco sem afetar minha instalação existente?

Mark Gill
fonte
Você também deve garantir que suas permissões no novo ponto de montagem tenham r + x: sudo chmod o+rx /mediapor exemplo, se o seu ponto de montagem for media. O r + x precisa estar disponível para os 'outros' grupos e usuários desde o primeiro ponto de montagem.
wordsforthewise

Respostas:

219

A resposta curta é que o --dbpathparâmetro no MongoDB permitirá que você controle de qual diretório o MongoDB lê e grava seus dados.

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

Inicia o mongodb e coloca os arquivos /usr/local/mongodb-data.

Dependendo da sua distribuição e instalação do MongoDB, você também pode configurar o mongod.confarquivo para fazer isso automaticamente:

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

Os pacotes oficiais do 10gen Linux ( Ubuntu / Debian ou CentOS / Fedora ) são fornecidos com um arquivo de configuração básico /etc/mongodb.conf, e o serviço MongoDB lê isso quando é iniciado. Você pode fazer sua alteração aqui.

Brendan W. McAdams
fonte
9
Na minha caixa de debian é mongodb.conf, não mongod.conf
UpTheCreek 7/12
12
Eu atualizei /etc/mongodb.confpor esta solução. Então, depois de começar mongod, vi que /data/dbera usado. Por que a atualização do mongodb.conf não afetou onde o mongod armazenou o banco de dados? (Observe que o uso do --dbpathargumento funcionou.
Kevin Meredith
Na minha caixa do Fedora, é /etc/mongodb.confe a atualização funciona bem para mim.
Tuxdna
4
O novo diretório de dados precisa estar chownno usuário mongod para os scripts de início do serviço.
Pete Garafano
como faço para chown?
Chovy
102

Resolvido em 2 minutos de inatividade :)
Basta mover sua pasta, adicionar link simbólico e ajustar as permissões.

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
fonte
3
Eu acho que essa deve ser a resposta. Eu sempre encontrar links simbólicos para ser uma solução muito boa e eu promover qualquer solução que usa-los sobre como alterar a configuração etc ..
cara Mograbi
Provavelmente não há necessidade de usermod. Está faltando a permissão executável + x para "outros" usuários na árvore do dbpath chmod -R o+x /<home>. Veja: stackoverflow.com/a/38193187/205049
oori
Sigo estas instruções (usando o dbpath em outro disco), ainda estou recebendo. Permission denied: "/var/lib/mongodb"É assim que /home/../mongodb/mongodb/ se parece com: 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
necessidade esclarecimentos para onde a pasta que você está em quando você executar o mvcomando, se você executar o comando mv de dentro lib, você já não tem mongodb para lna
Andy
1
Eu tentei sua solução, mas quando estou reiniciando o aplicativo, ele fornece o seguinte erro - 2019-11-18T18: 58: 45.215 + 1100 I ARMAZENAMENTO [initandlisten] exceção em initAndListen: 28596 Não é possível determinar o status do arquivo de bloqueio no diretório de dados / var / lib / mongo: boost :: filesystem :: status: Permissão negada: "/var/lib/mongo/mongod.lock", finalizando
Arun chauhan
33

O comando a seguir funcionará para você, se você desejar alterar o caminho padrão. Basta digitar isso no diretório bin do mongodb.

mongod --dbpath=yourdirectory\data\db

Caso você queira mover os dados existentes também, copie todas as pastas do diretório data \ db existente para o novo diretório antes de executar o comando.

E também interrompa os serviços mongodb existentes em execução.

Yogesh Sanchihar
fonte
1
Isso funciona no Linux também. Eu criei um diretório chamado "dados" ao lado de roteiro mondod e executá-lo como este: ./mongod --dbpath = dados
cagdasalagoz
29

Crie um arquivo chamado mongod.cfg na pasta MongoDB, se você não o tiver. No meu caso: C: \ Users \ ivanbtrujillo \ MongoDB

Em seguida, edite mongod.cfg com o bloco de notas e adicione uma linha com o seguinte (nosso dbpath personalizado):

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

Nesse arquivo, você também deve especificar o caminho de log. Meu arquivo mongod.cfg é:

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

Se você usar o mongoDB como um serviço do Windows, precisará alterar essa chave e especificar o arquivo mongod.cfg.

Para instalar o mongodb como um serviço do Windows, execute este comando:

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

Abra o regedit.exe e vá para a seguinte rota:

HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\services\MongoDB

O serviço MongoDB não funciona, precisamos editar a chave ImagePath, excluir seu conteúdo e colocar o seguinte:

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

Indicamos ao mongo seu arquivo de configuração e seu caminho de log.

Então, quando você inicia o serviço mongodb, ele funciona.

Aqui está um tutorial completo para instalar o mongoDB no Windows: http://ivanbtrujillo.herokuapp.com/2014/07/24/installing-mongodb-as-a-service-windows/

Espero que ajude,

ivanbtrujillo
fonte
1
O MongoDB 2.6 e mais recente usam arquivos de configuração YAML. O formato antigo ainda é suportado para compatibilidade com versões anteriores, mas você pode querer usar o novo. Detalhes aqui .
18715 gronostaj
A variável dbpath também existe para linux. Procure em /etc/mongod.conf.
xpros 28/08/2015
23

Copie o conteúdo de /var/lib/mongodbpara /data/db. Os arquivos que você deve procurar devem ter nomes como your_db_name.nse your_dbname.nonde né um número começando com 0. Se você não vir esses arquivos abaixo /var/lib/mongodb, procure-os no seu sistema de arquivos.

Uma vez copiado, use --dbpath=/data/dbao iniciar o MongoDB através do mongodcomando

lobster1234
fonte
existe uma maneira de fazer isso acontecer sempre que o servidor reiniciar?
usar o seguinte comando
1
@ JimThio, você pode adicionar essa opção ao script de shell que inicia o mongodb. Normalmente é /etc/init.d/mongod ou /etc/init.d/mongodb.
lobster1234
19

Aqui está o que eu fiz, espero que seja útil para mais alguém:

Passos:

  1. Interrompa seus serviços que estão usando o mongodb
  2. Pare o mongod - minha maneira de fazer isso foi com o meu arquivo rc /etc/rc.d/rc.mongod stop, se você usar outra coisa, como systemd, verifique sua documentação como fazer isso
  3. Crie um novo diretório no novo disco rígido -mkdir /mnt/database
  4. Certifique-se de que o mongodb tenha privilégios para ler / gravar nesse diretório (normalmente chown mongodb:mongodb -R /mnt/database/mongodb) - obrigado @DanailGabenski.
  5. Copie a pasta de dados do seu mongodb para o novo local -cp -R /var/lib/mongodb/ /mnt/database/
  6. Remova a pasta antiga do banco de dados -rm -rf /var/lib/mongodb/
  7. Crie um link simbólico para a nova pasta do banco de dados -ln -s /mnt/database/mongodb /var/lib/mongodb
  8. Iniciar mongod -/etc/rc.d/rc.mongod start
  9. Verifique o log do seu mongod e faça uma verificação de integridade (tente mongoconectar-se ao seu banco de dados para ver se está tudo bem)
  10. Inicie seus serviços que você parou no ponto 1

Não há necessidade de dizer que você deve ter cuidado ao fazer isso, especialmente com rm -rf mas acho que essa é a melhor maneira de fazer isso.

Você nunca deve tentar copiar o diretório do banco de dados enquanto o mongod estiver em execução, porque pode haver serviços que escrevem / leem dele, o que alterará o conteúdo do seu banco de dados.

drinchev
fonte
1
Embora seja uma resposta antiga, funcionou parcialmente para mim. Você também precisa garantir que o usuário mongodb seja o proprietário do novo diretório e do symlik para que ele funcione. chown mongodb:mongodb -R /mnt/database/mongodb
Danail Gabenski 22/03/19
3
No ponto 5, torne o comando parecido com cp -rp / var / lib / mongodb / / mnt / database / Isso manterá intacta a propriedade e a permissão da pasta.
Ketan Ghumatkar
Eu tentei sua solução, mas quando estou reiniciando o aplicativo, ele fornece o seguinte erro - 2019-11-18T18: 58: 45.215 + 1100 I ARMAZENAMENTO [initandlisten] exceção em initAndListen: 28596 Não é possível determinar o status do arquivo de bloqueio no diretório de dados / var / lib / mongo: boost :: filesystem :: status: permissão negada: "/var/lib/mongo/mongod.lock", terminando
Arun chauhan
10

Se instalado via apt-getUbuntu 12.04, não esqueça chown -R mongodb:nogroup /path/to/new/directory. Além disso, altere a configuração em /etc/mongodb.conf.

Como lembrete, o mongodb-10genpacote agora é iniciado via upstart, portanto, o script de configuração está em/etc/init/mongodb.conf

Acabei de passar por isso, espero que os googlers achem útil :)

Roberto
fonte
1

Para mim, o usuário estava em mongodvez demongodb

sudo chown mongod:mongod /newlocation

Você pode ver os logs de erros se o serviço falhar:

/var/log/mongodb/mongod.log

IP
fonte
0

No debian / ubuntu, você precisará editar o script /etc/init.d/mongodb. Realmente, esse arquivo deve extrair as configurações do /etc/mongodb.conf, mas não parece extrair o diretório padrão (provavelmente um bug)

Isso é um pouco complicado, mas adicioná-los ao script o fez iniciar corretamente:

adicionar:

DBDIR=/database/mongodb

mudança:

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

para:

DAEMON_OPTS=${DAEMON_OPTS:-"--unixSocketPrefix=$RUNDIR --dbpath $DBDIR --config $CONF run"}
FGiorlando
fonte
e se você quiser colocar o banco de dados no diretório inicial em vez de raiz?
JesseBoyd