Dump não é backup! Mas pode ser?
Tags: mongodb, nosql, backup, administration
Published: 2019-05-10 14:45:40

---
title: Dump não é backup! Mas pode ser?
published: true
description: Uma visão sobre o mongodump para backups de ambientes pequenos
tags: mongodb, nosql, backup, administration
---

Fala pessoALL, neste post vou mostrar algumas dicas para utilizar o mongodump como parte da estratégia de backup de bases de dados MongoDB.

# Estratégias de backup

Antes de mergulharmos no mongodump, vamos repassar algumas estratégias de backup disponíveis no MongoDB.

#### Backup com MongoDB Cloud Manager ou Ops Manager

##### MongoDB Cloud Manager

Com o [MongoDB Cloud Manager](https://www.mongodb.com/cloud/cloud-manager/?jmp=docs) você pode manter backups contínuos de ambientes replicaset ou sharded clusters através da leitura do oplog, como o próprio nome diz: na Nuvem. O MongoDB Cloud Manager cria snapshots dos seus dados em intervalos previamente configurados e também pode oferecer um point-in-time recovery de maneira mais simples.

##### Ops Manager

Essa é a opção on-premisses e funciona da mesma maneira que o MongoDB Cloud Manager, porém, é instalado dentro do seu ambiente. O [Ops Manager](https://docs.opsmanager.mongodb.com/current/) está disponível somente para a versão Enterprise do MongoDB.

#### Backup por cópia dos arquivos de dados

Essa também é uma opção muito utilizada para ambientes que utilizam a versão MongoDB Community, isso auxilia tanto para backups propriamente ditos, quanto para um initial sync ou resync de membros de replicasets ou sharded clusters.

A opção que eu mais uso e recomendo é o rsync, mas não vou me aprofundar agora e prometo um artigo mostrando como fazer isso de maneira simples e segura.

#### Agora sim o mongodump

O mongodump faz parte do pacote de ferramentas que são instaladas juntamente com o MongoDB e contém várias opções que ajudam muito para backup de ambientes pequenos (leia-se com pouco volume de dados).

O funcionamento é bem simples, mas alguns pontos devem ser observados:

1. quando conectado a uma instância mongod vai afetar a performance
    * se você estiver num ambiente standalone isso pode ser um problema dependendo do volume de dados
2. em ambientes replicaset o ponto 1 deixa de ser um problema
    * como parte da estratégia, retiramos um nó do cluster e utilizamos esse nó para executar o dump
3. o mongodump cria uma cópia fiel dos dados no formato BSON, ou seja, uma cópia binária dos dados da maneira que o MongoDB usa para persistência dos dados em disco, assim, esses dados não são "humanamente legíveis", ou seja, podem ser lidos somente através de um restore para uma instância MongoDB ou pelo bsondump

Dito isso, vamos explorar algumas opções que acho muito interessantes!

##### Uma instância completa

Para executar o backup de uma instância completa de MongoDB, utilizamos seguinte comando:

```bash
mongodump --out meu_diretorio_de_backup
```
Notem que passei um único parâmetro para o mongodump, mas o que isso significa? Bem, o parâmetro informado foi o *--out*, ele recebe o caminho onde os arquivos serão gravados. Nesse caso o mongodump se conectará na instância que está rodando localmente, **na porta padrão: 27017** e fará o backup de todas as bases de dados dessa instância (menos da base dados *local*, isso por default).

Mas e se quisermos o backup de uma outra porta ou de outro servidor? Basta adicionarmos os parâmetros *--host* e *--port*, assim:

```bash
mongodump --host nome_do_meu_servidor --port 19000 --out meu_diretorio_de_backup
```

##### Um banco de dados específico

Nesse caso adicionaremos mais um parâmetro:

```bash
mongodump --host nome_do_meu_servidor --port 19000 --db meu_banco_de_dados --out meu_diretorio_de_backup
```

##### Uma coleção específica

Essa é opção interessante também:

```bash
mongodump --host nome_do_meu_servidor --port 19000 --db meu_banco_de_dados --collection minha_colecao --out meu_diretorio_de_backup
```

##### Um conjunto de dados específico

Podemos querer apenas alguns dados por algum motivo, talvez um "backup" diferencial utilizando um campo data por exemplo:

```bash
mongodump --host nome_do_meu_servidor --port 19000 --db meu_banco_de_dados --collection minha_colecao --query "{data:{$gte:ISODate('2019-05-10T00:00:00.000Z')}}"
```

No exemplo acima temos o parâmetro *--query* e passamos um JSON, nesse caso foi uma query simples, mas podemos querer passar mais parâmetros de filtro nesse JSON, então podemos utilizar o parâmetro *--queryFile* passando o caminho de um arquivo JSON com a nossa query:

```json
{
    "data": {
        "$gte": ISODate("2019-05-10T00:00:00.000Z")
    },
    "clienteID": {
        "$in": [1000,1001,1005,1010,1100]
    }
}
```

```bash
mongodump --host nome_do_meu_servidor --port 19000 --db meu_banco_de_dados --collection minha_colecao --queryFile meu_arquivo_json
```

##### Compactando os arquivos

Como saída podemos compactar os arquivos nativamente através da opção *--gzip*:

```bash
mongodump --host nome_do_meu_servidor --port 19000 --gzip --out meu_diretorio_de_backup
```
Arquivos gerados com a opção *--gzip* deverão ser restaurados com essa mesma opção utilizando o **mongorestore** ou se quisermos apenas a visualização do JSON, **bsondump**

#### Conclusão

Bom, mostrei alguns exemplos de utilização do mongodump como parte da estratégia de backup e o título foi mesmo para polemizar! ;)

Vimos que podemos utilizar o mongodump de diversas maneiras, e notem: os parâmetros não precisam seguir uma ordem (eu tenho TOC! :p). Podemos combinar os parâmetros e utilizá-los de acordo com nossas necessidades.

Em ambientes que tem autenticação implementada (altamente recomendável) utilizamos os mesmos parâmetros para entrar numa instância: *--user*, *--password* e *--authenticationDatabase*.

Ambientes replicados (replicasets) temos uma cópia idêntica dos dados em cada um dos nós de nosso cluster, por isso backup para o caso de alta disponibilidade pode não ser um problema nesses casos. Inclusive podemos ter nós que chamamos de delayded (ou nós atrasados), esses nós são muito úteis para evitarmos os famosos *fatfingers*, aqueles chamados que você pode receber: "cara, me ajuda... apaguei uma collection". Mas esse é um assunto bom para um próximo post!

Lembre-se **dump PODE não ser backup** mas vai ajudar na cópia dos arquivos de dados para um local diferente, podendo ser um outro servidor, um storage, ou até mesmo um local físico.

Veja também todas as [opções do mongodump aqui](https://docs.mongodb.com/manual/reference/program/mongodump/#bin.mongodump)

Quer se aprofundar mais nesse e em outros conceitos do banco de dados não relacional mais utilizado do mundo? Conheça o meu [treinamento on-line e ao vivo](https://www.sympla.com.br/mongodb-deep-dive-com-leandro-domingues---online__510110), se preferir presencial corre porque as vagas estão se esgotando aqui em São Paulo, [veja aqui](https://www.sympla.com.br/mongodb-deep-dive-com-leandro-domingues---sao-paulo__474826)

É isso, espero que gostem e fiquem à vontade para compartilharem e comentar!

Abs e até a próxima! ;)