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
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
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
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
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/
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
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
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.
Top comments (0)