Restauração de BD - PostgreSQL + Docker

alexandrel0pes

Alexandre Lopes

Posted on August 30, 2020

Restauração de BD - PostgreSQL + Docker

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.

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
Enter fullscreen mode Exit fullscreen mode

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.

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 

Enter fullscreen mode Exit fullscreen mode

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:

docker-compose up -d 
Enter fullscreen mode Exit fullscreen mode

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.

docker exec -it <nome_container> /bin/bash
Enter fullscreen mode Exit fullscreen mode

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

cd /var/lib/postgresql/
Enter fullscreen mode Exit fullscreen mode

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
pg_restore 
  --no-owner -U postgres 
  --dbname= --create 
  --verbose -c 
  --schema-only backups/<nome_arquivo>.pgdump
Enter fullscreen mode Exit fullscreen mode

Esse comando com várias flags, que são explicadas detalhadamente neste link, 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.

pg_restore 
  --no-owner -U postgres 
  --dbname=<nome_bd> 
  --verbose --data-only 
  --superuser=postgres
  --disable-triggers backups/<nome_arquivo>.pgdump
Enter fullscreen mode Exit fullscreen mode

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.

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.

💖 💪 🙅 🚩
alexandrel0pes
Alexandre Lopes

Posted on August 30, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related