Próbuję wykonać kopię zapasową / przywrócić bazę danych PostgreSQL, jak wyjaśniono w witrynie Docker, ale dane nie są przywracane.
Woluminy używane przez obraz bazy danych to:
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
a CMD to:
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"]
Tworzę kontener DB za pomocą tego polecenia:
docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
Następnie podłączam kolejny kontener aby ręcznie wstawić jakieś dane:
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>
Następnie tworzone jest archiwum tar:
$ 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
Teraz usuwam kontener używany dla bazy danych i tworzę kolejny, o tej samej nazwie i próbuję przywrócić dane wstawione wcześniej:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
Ale tabele są puste, dlaczego dane nie są prawidłowo przywracane?
database
postgresql
backup
docker
Carl Levasseur
źródło
źródło
Odpowiedzi:
Wykonaj kopię zapasową baz danych
Przywróć swoje bazy danych
źródło
docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_
.gz
cat your_dump.sql
polecenie unzip i potokować to zamiastcat
wyniku do docker exec.docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
Myślę, że możesz również użyć kontenera kopii zapasowych potgres, który utworzyłby kopię zapasową twoich baz danych w określonym czasie.
źródło
Okej, wymyśliłem to. Postgresql nie wykrywa zmian w folderze / var / lib / postgresql po uruchomieniu, a przynajmniej nie takich zmian, które chcę, aby wykrywał.
Pierwszym rozwiązaniem jest uruchomienie kontenera za pomocą bash zamiast bezpośredniego uruchamiania serwera postgres, przywrócenie danych, a następnie ręczne uruchomienie serwera.
Drugim rozwiązaniem jest użycie kontenera danych. Wcześniej nie rozumiałem, o co mi chodzi, teraz rozumiem. Ten kontener danych umożliwia przywrócenie danych przed uruchomieniem kontenera postgres. W związku z tym, gdy uruchamia się serwer postgres, dane już tam są.
źródło
Inne podejście (oparte na docker-postgresql-workflow )
Lokalnie działająca baza danych (nie w dockerze, ale to samo podejście zadziała) do eksportu:
Baza danych kontenerów do zaimportowania:
źródło
pg_dump mydb -U postgres > export.psql
w docker container bashMiałem ten problem podczas próby użycia db_dump do przywrócenia bazy danych. Zwykle używam programu dbeaver do przywracania - jednak otrzymałem zrzut psql, więc musiałem wymyślić metodę przywracania przy użyciu kontenera docker.
Pracowała dla mnie metodologia rekomendowana przez Forth i redagowana przez Soviut:
cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname
(ponieważ był to pojedynczy zrzut bazy danych, a nie wiele baz danych, zawarłem nazwę)
Jednak aby to zadziałało, musiałem również wejść do virtualenv, w którym znajdował się kontener docker i projekt. To wymknęło mi się na chwilę, zanim to rozgryzłem - ponieważ otrzymywałem następujący błąd dockera.
read unix @->/var/run/docker.sock: read: connection reset by peer
Może to być spowodowane plikiem /var/lib/docker/network/files/local-kv.db. Nie znam dokładności tego stwierdzenia: ale wydaje mi się, że widziałem to, ponieważ nie używam lokalnego dockera, więc nie miał tego pliku, którego szukał, korzystając z odpowiedzi Fortha.
Następnie przeszedłem do odpowiedniego katalogu (z projektem), aktywowałem virtualenv i uruchomiłem zaakceptowaną odpowiedź. Boom, działał jak top. Mam nadzieję, że to pomoże komuś innemu!
źródło
To polecenie zadziałało dla mnie.
na przykład
Odniesienie : Rozwiązanie podane przez GMartinez-Sisti w tej dyskusji. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b
źródło
cat db.dump | docker exec ...
sposób nie działał dla mojego zrzutu (~ 2Gb). Zajęło to kilka godzin i zakończyło się błędem braku pamięci.Zamiast tego zrzuciłem zrzut do kontenera i pg_restore'ed go od wewnątrz.
Zakładając, że identyfikator kontenera to,
CONTAINER_ID
a nazwa bazy danych toDB_NAME
:źródło
dksnap
( https://github.com/kelda/dksnap ) automatyzuje proces uruchamianiapg_dumpall
i ładowania zrzutu przez/docker-entrypoint-initdb.d
.Pokazuje listę uruchomionych kontenerów i wybierasz, który chcesz zarchiwizować. Wynikowy artefakt jest zwykłym obrazem platformy Docker, więc możesz go następnie
docker run
udostępnić lub udostępnić, wypychając go do rejestru platformy Docker.(zastrzeżenie: jestem opiekunem projektu)
źródło
Poniższe polecenie może służyć do pobrania zrzutu z kontenera postgress dockera
źródło