Desde março de 2015 , o Compose oferece suporte ao MongoDB 3.0. Um dos recursos mais interessantes do Compose são seus backups automáticos. No entanto, quando precisei restaurar de um backup outro dia, demorou um pouco para a equipe de suporte do Compose resolver e houve algumas surpresas ao longo do caminho.
Minha esperança é que este artigo esteja desatualizado em breve, mas aqui está o que você precisa saber hoje.
A versĂŁo curta
Conforme recomendado pela equipe de suporte do Compose:
- Instale o MongoDB 2.6 em sua máquina local
- Baixe e extraia o backup
- Corre
mongodump --dbpath path/to/extracted/dir
- Execute
mongorestore
usando suas credenciais Heroku nodump
diretório recém-criado
O restante deste artigo entrará em mais detalhes. Mas, primeiro, algumas informações importantes:
Os backups não são amigáveis ​​ao 3.0
Cada um desses downloads está em um formato que não é fácil de importar para o MongoDB 3.0.
Por que MongoDB 2.6?
Fiquei surpreso quando a equipe de suporte do Compose perguntou se eu poderia instalar o MongoDB 2.6.
A versão resumida é que você precisa produzir um conjunto de arquivos BSON / JSON de seu backup para restaurá-lo. O suporte para isso foi removido em 2.8 :
Os 2,8 versões de ferramentas MongoDB,
mongodump
,mongorestore
,mongoexport
,mongoimport
,mongofiles
, emongooplog
, deve conectar-se executando instâncias MongoDB e não pode modificar os arquivos de dados MongoDB (ou seja, com--dbpath
), como nas versões anteriores.
1. Instale o MongoDB 2.6
Estou usando o Homebrew no OS X. Achei mais fácil desinstalar o mongodb e instalá-lo usando versões homebrew .
Importante: certifique-se de fazer backup antes de fazer isso.
Instale as versões do Homebrew, se ainda não as tiver:
brew tap homebrew/versions
Desinstale seu MongoDB local:
brew uninstall mongodb
Instale o MongoDB 2.6:
brew install homebrew/versions/mongodb26
(Quando terminar, vocĂŞ pode executar e executar novamente .)brew uninstall homebrew/versions/mongodb26
brew install mongodb
2. Baixe e extraia o backup
Extraia o tarball. No meu caso, acabei com um diretĂłrio parecido com este:
.
├── admin.0
├── admin.ns
├── app12345678.0
├── app12345678.1
├── app12345678.2
├── app12345678.3
├── app12345678.4
├── app12345678.ns
├── local.0
├── local.1
├── local.2
├── local.3
├── local.4
├── local.ns
├── mongod.lock
├── raw_parse.txt
└── storage.bson
3. Corra mongodump
Dentro do diretĂłrio acima, execute:
mongodump --dbpath .
Nota: a opção só é suportada no MongoDB 2.6, por isso tivemos que instalá-lo.--dbpath
Isso produzirá um dump
diretĂłrio contendo os dados:
dump
├── admin
│  ├── system.indexes.bson
│  ├── system.users.bson
│  ├── system.users.metadata.json
│  ├── system.version.bson
│  └── system.version.metadata.json
└── app12345678
├── my_collection_name.bson
├── my_collection_name.metadata.json
└── system.indexes.bson
4. Corra mongorestore
Você precisará da MONGOHQ_URL
variável de ambiente do aplicativo Heroku para as credenciais:
heroku config:get MONGOHQ_URL
VocĂŞ deve obter algo assim:
mongodb://heroku:averylongstring@candidate.2.mongolayer.com:5678,candidate.1.mongolayer.com:12345/app12345678
Observe que há dois hosts e portas listados. No meu caso, o correto era aquele listado em segundo lugar, mas você pode verificar novamente observando a seção Admin do painel Compose (procure por “Console Mongo”).
VocĂŞ mongorestore
deve ter esta aparĂŞncia:
mongorestore \
--host candidate.1.mongolayer.com \
--port 12345 \
--db app12345678 \
-u heroku \
-p averylongstring \
dump/app12345678/
Isso irá restaurar todos os arquivos no diretório criado por na etapa acima.dump/app12345678
mongodump
É isso aĂ!
Por que o rigamarole?
Da equipe de suporte:
O motivo dessa mudança Ă© a mudança do MongoDB para sistemas de armazenamento plugáveis. Ainda nĂŁo decidimos a melhor forma de empacotar backups para esses cenários: com qualquer backup baixado de nĂłs, vocĂŞ pode usar os arquivos extraĂdos diretamente para levantar uma instância mongo localmente, contra a qual vocĂŞ pode executar operações mongodump / mongorestore. Para o seu caso particular, Ă© mais fácil usar utils anteriores ao 2.8 para criar o tipo de arquivo com o qual o mongorestore pode trabalhar.
Por que não há um botão “restaurar” ao lado de cada backup?
Sugeri isso ao longo do caminho e obtive esta resposta:
Na verdade, temos um botĂŁo de restauração automática para todo e qualquer backup feito em uma implantação … mas apenas para implantações que sĂŁo provisionadas por meio de uma conta direta do Compose.io. O TL; DR sobre o motivo disso Ă© como funciona a integração do programa de parceria Heroku. Simplesmente nĂŁo havia uma maneira razoável e confiável de trazer a mesma funcionalidade de restauração de dados para bancos de dados provisionados pelo Heroku. Tristeza ao redor. Para bancos de dados heroku, usar ferramentas mongodump / mongorestore padrĂŁo Ă© a Ăşnica maneira de restaurar um backup.