Estou tentando fazer backup / restaurar um banco de dados PostgreSQL, conforme explicado no site do Docker, mas os dados não são restaurados.
Os volumes usados pela imagem do banco de dados são:
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
e o CMD é:
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
Eu crio o contêiner DB com este comando:
docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
Em seguida, conecto outro contêiner para inserir alguns dados manualmente:
docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>
O arquivo tar é então criado:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql
Agora, removo o contêiner usado para o banco de dados e crio outro, com o mesmo nome, e tento restaurar os dados inseridos antes:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
Mas as tabelas estão vazias, por que os dados não são restaurados corretamente?
database
postgresql
backup
docker
Carl Levasseur
fonte
fonte
Respostas:
Faça backup de seus bancos de dados
Restaure seus bancos de dados
fonte
docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_
date +% d-% m-% Y "_"% H_% M_% S.gz
cat your_dump.sql
comando unzip e canalizar isso, em vez docat
resultado para o docker exec.docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
Eu acho que você também pode usar um contêiner de backup potgres que faria backup de seus bancos de dados dentro de um determinado período de tempo.
fonte
Ok, eu descobri isso. O Postgresql não detecta alterações na pasta / var / lib / postgresql após o lançamento, pelo menos não o tipo de alteração que eu quero que ele detecte.
A primeira solução é iniciar um contêiner com bash, em vez de iniciar o servidor postgres diretamente, restaurar os dados e iniciar o servidor manualmente.
A segunda solução é usar um contêiner de dados. Eu não entendi direito antes, agora entendo. Este contêiner de dados permite restaurar os dados antes de iniciar o contêiner do postgres. Assim, quando o servidor postgres é iniciado, os dados já estão lá.
fonte
Outra abordagem (baseada no docker-postgresql-workflow )
Banco de dados em execução local (não na janela de encaixe, mas a mesma abordagem funcionaria) para exportar:
Banco de dados de contêiner a ser importado:
fonte
pg_dump mydb -U postgres > export.psql
em bash recipiente janela de encaixeEu tive esse problema ao tentar usar um db_dump para restaurar um db. Eu normalmente uso o dbeaver para restaurar - no entanto, recebi um despejo psql, então tive que descobrir um método para restaurar usando o contêiner do docker.
A metodologia recomendada por Forth e editada por Soviut funcionou para mim:
cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname
(uma vez que este era um único db dump e não vários db's, incluí o nome)
No entanto, para fazer com que isso funcionasse, eu também precisei entrar no ambiente virtual em que estavam o contêiner e o projeto do docker. Isso me escapou um pouco antes de descobrir, pois estava recebendo o seguinte erro do docker.
read unix @->/var/run/docker.sock: read: connection reset by peer
Isso pode ser causado pelo arquivo /var/lib/docker/network/files/local-kv.db .Não sei a precisão dessa declaração: mas acredito que estava vendo isso porque não utilizo a janela de encaixe localmente, portanto, não possuía esse arquivo, que estava procurando, usando a resposta de Forth.
Naveguei para o diretório correto (com o projeto), ativei o virtualenv e executei a resposta aceita. Boom, funcionou como um top. Espero que isso ajude alguém lá fora!
fonte
Este é o comando que funcionou para mim.
por exemplo
Referência : solução dada por GMartinez-Sisti nesta discussão. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b
fonte
cat db.dump | docker exec ...
O caminho não funcionou para o meu despejo (~ 2 GB). Demorou algumas horas e acabou com um erro de falta de memória.Em vez disso, copiei o despejo no contêiner e o pg_restorei de dentro.
Supondo que o ID do contêiner seja
CONTAINER_ID
e o nome do banco de dados sejaDB_NAME
:fonte
dksnap
( https://github.com/kelda/dksnap ) automatiza o processo de execuçãopg_dumpall
e carregamento do dump via/docker-entrypoint-initdb.d
.Ele mostra uma lista de contêineres em execução e você escolhe qual deles deseja fazer backup. O artefato resultante é uma imagem regular do Docker, para que você possa
docker run
compartilhá-lo ou enviá-lo para um registro do Docker.(aviso: sou mantenedor do projeto)
fonte
O comando abaixo pode ser usado para fazer o despejo do contêiner do docker postgress
fonte