Criando e restaurando backup no MongoDB
Tags: ptbr, braziliandevs, mongodb, database
Published: 2021-04-25 19:59:40

- [Criando backup](#criando-backup)
- [Restaurando backup](#restaurando-backup)
- [Script para criar o backup e salvar no AWS S3](#script-para-criar-o-backup-e-salvar-no-aws-s3)
- [Conclusão](#conclusão)

## Criando backup

Para criar o backup precisamos estar em uma maquina com o Mongo instalado para ter acesso ao comando **mongodump** em nosso terminal. Com ele será possível fazer backup do próprio banco local ou de um banco remoto.

Criando o backup de todos os bancos existentes naquele servidor:  

```sh
mongodump --uri "mongodb://mongodb0.example.com:27017" --gzip
# --uri  = string de conexão com o mongo  
# --gzip = indica que deseja gerar um backup compactado
```

Criando o backup de um banco de dados especifico:

```sh
mongodump --uri "mongodb://mongodb0.example.com:27017" --gzip -d nomedobanco
# --uri  = string de conexão com o mongo  
# --gzip = indica que deseja gerar um backup compactado
# -d     = nome de um determinado banco, qual deseja-se fazer o backup  
```

O resultado do comando mongo **mongodump** criará uma pasta chamada **dump** dentro do diretório qual foi executado o comando (exceto caso seja especificado um outro caminho).

Existem mais opções que podem ser adicionadas ao comando **mongodump** na [documentação oficial](https://docs.mongodb.com/v4.2/reference/program/mongodump/#syntax).

## Restaurando backup

Para restaurar o backup criado na etapa anterior vamos utilizar o comando **mongorestore** passando a string de conexão seguida da pasta qual contem o conteúdo gerado pelo **mongodump** anteriormente.


Restaurando um backup com vários bancos 
```sh
mongorestore --uri "mongodb://mongodb0.example.com:27017" --gzip ./dump/
# --uri  = string de conexão com o mongo
# --gzip = indica que deseja gerar um backup compactado
```

Restaurando um backup de um banco especifico

```sh
mongorestore --uri "mongodb://mongodb0.example.com:27017" --gzip ./dump/nomedobanco -d nomedobanco
# --uri  = string de conexão com o mongo
# --gzip = indica que deseja gerar um backup compactado
# -d     = nome de um determinado banco, qual deseja-se fazer o backup  
```

Existem mais opções que podem ser adicionadas ao comando **mongorestore** na [documentação oficial](https://docs.mongodb.com/v4.2/reference/program/mongorestore/#syntax).

## Script para criar o backup e salvar no AWS S3

Caso queira criar uma rotina de backup automatizado para executar o comando de backup periodicamente podemos criar um script para realizar essa tarefa.

Criar um arquivo shell script com o seguinte conteúdo: 
```sh
mongodump --uri "mongodb://mongodb0.example.com:27017" --gzip
D=$(date '+%Y-%m-%d-%H')
zip -r $D.zip ./dump/
aws s3 cp $D.zip s3://<s3-bucket-name>/$D --profile michels
rm -rf ./dump/
rm -f $D.zip
```

No exemplo acima estamos realizando as seguintes instruções em cada linha: 
1. Criar o backup do mongodb com **mongodump**.
2. Declarar variável chamada "D" que vai armazenar a data atual no padrão "ANO-MES-DIA-HORA".
3. Criar um .zip da pasta **dump** que foi criada no passo 1.
4. Copiar pra um bucket do S3 o .zip criado no passo 3.
   1. Estou considerando que o **aws cli** já esteja instalado e configurado.
   2. Fique a vontade para utilizar outro serviço para essa etapa.
5. Remover a pasta **dump** para não ficar lixo na pasta.
6. Remover o arquivo .zip criado para não ficar lixo na pasta.

Agora, caso esteja utilizando linux, basta adicionar uma chamada para esse script dentro do **crontab** da maquina. 

Leia mais sobre crontab [aqui](https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-ubuntu-1804-pt), com ele é possível executar tarefas no seu terminal periodicamente de forma bem dinâmica e flexível.  

Um exemplo seria executar o nosso script de backup todos os dias as 2hrs e as 14hrs. Para isso basta executar o comando `crontab -e` em seu terminal e editar o arquivo aberto adicionando uma nova linha com o conteúdo abaixo: 

```
0 2,14 * * * cd /path/to/script/ && sh backup-mongo-to-s3.sh
```

Agora basta salvar o arquivo e quando chegar na hora configurada o arquivo `backup-mongo-to-s3.sh` será executado.

## Conclusão

Neste post aprendemos criar e restaurar um backup do MongoDB, assim como agendar uma tarefa para executar esse backup periodicamente e salva-lo no S3 da AWS.