Restauração de BD - PostgreSQL + Docker
Tags: docker, database, postgres
Published: 2020-08-30 18:00:17

Nesse artigo farei uma abordagem sobre uma forma que encontrei para restaurar uma base de dados PostgreSQL em um container Docker.

Atualmente estou estagiando e para facilitar a configuração do meu ambiente de desenvolvimento, padronizando com o do restante da equipe da empresa, além de desenvolver meu conhecimento com containers (comecei os estudos recentemente e quero praticar), resolvi trabalhar com a base de dados em um container Docker. 

### Preparando o ambiente

Primeiro, criei o arquivo docker-compose.yml para facilitar a definição e a execução dos contêineres.

```yaml 
version: '3'
services: 
  postgres:
    build: .
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports: 
      - "5432:5432"
    volumes:
      - ./pg-data:/var/lib/postgresql/data
      - ./backups:/var/lib/postgresql/backups
    networks:
      - postgres-network
 
  pgadmin:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: "seu_email@email.com"
      PGADMIN_DEFAULT_PASSWORD: "admin!"
    ports:
      - "16543:80"
    depends_on:
      - postgres
    networks:
      - postgres-network

networks: 
  postgres-network:
    driver: bridge
```

No meu caso, tive alguns problemas com a codificação do SGBD e para resolvê-lo, tive que especificar para o container PostgreSQL a linguagem e o encoding que seriam utilizados.

```Dockerfile
FROM postgres:12

RUN localedef -i pt_BR -c -f UTF-8 -A /usr/share/locale/locale.alias pt_BR.utf-8
ENV LANG pt_BR.UTF-8 

```

Esses arquivos entregam uma configuração bem simples para o banco de dados PostgreSQL e para o PG Admin, entretanto, o que precisa-se ser destacado são os dois volumes usados pelo PostgreSQL, sendo eles:

- **pg-data:** volume dedicado para a persistência dos dados geridos pelo BD, mesmo que os serviços sejam reiniciados.

- **backups:** volume dedicado para o armazenamento dos arquivos que serão usados durante a restauração.

Para iniciar os serviços necessários, dentro do diretório do arquivo `docker-compose.yml` execute o comando:

``` shell
docker-compose up -d 
```
### Executando a restauração

Com o ambiente criado e executando, para dar início à restauração é necessário deixar os arquivos de restauração disponíveis para o container do PostgreSQL, para isso, copie o arquivo que será usado na restauração de dados para a pasta /backup.


Agora podemos acessar o container de forma interativa, para executarmos os comandos para a restauração.

```shell
docker exec -it <nome_container> /bin/bash
```

Já dentro do container do PostgreSQL, acesse a pasta localizada em /var/lib/postgresql/, nesse diretório estarão disponíveis os backups.

```shell
cd /var/lib/postgresql/
```

A restauração do diretório acontecerá em duas etapas, agora dentro do diretório específico do PostgreSQL, podemos iniciar a restauração com o seguinte comando. 

##### Restaurando o schema

```shell
pg_restore 
  --no-owner -U postgres 
  --dbname= --create 
  --verbose -c 
  --schema-only backups/<nome_arquivo>.pgdump
```
Esse comando com várias flags, que são explicadas detalhadamente neste [link](https://www.postgresql.org/docs/9.2/app-pgrestore.html), basicamente criará um novo banco de dados e em seguida, fará a importação apenas do schema, deixando os dados para o próximo passo.

##### Restaurando os dados
Agora que já temos todo a estrutura do banco de dados, precisamos da parte principal, os dados. Usaremos o mesmo comando para importar os dados, entretanto com algumas opções diferentes.

```shell
pg_restore 
  --no-owner -U postgres 
  --dbname=<nome_bd> 
  --verbose --data-only 
  --superuser=postgres
  --disable-triggers backups/<nome_arquivo>.pgdump
```

Com esse comando apenas dados serão importados para dentro do bd que foi especificado no comando. Um ponto que vale ser destacado trata-se da opção --disable-triggers, que desabilitará a checagem de integridade dos registros, algo que não é muito importante na restauração de um banco de dados, já que esses dados são provindos de outra base, que provavelmente já verificou a integridade desses dados, o que nos livra de vários erros, pois durante o processo, pode-se haver a referência de dados que ainda não foram restaurados.

### Conclusão 

Pronto, seguindo esses passos você terá restaurado uma base de dados  no PostgreSQL rodando com em um container. Essa pode não ser a abordagem perfeita, levando em consideração minha inexperiência utilizando Docker, porém funcionou muito bem para o meu cenário e pode ajudar outras pessoas. Destaco também que esse ambiente é específico para o desenvolvimento. Caso seja preciso, você pode encontrar o repositório completo desse tutorial [aqui](https://github.com/AlexandreL0pes/restore-dockerized-pg-db).

P.S.: Esse é o meu primeiro artigo por aqui, gostei bastante de plataforma e estou aberto para sugestões e dicas, tanto na escrita quanto nas tecnologias presentes nesse artigo.