Dockerized PostgreSQL veritabanını yedekleme / geri yükleme


156

Docker web sitesinde açıklandığı gibi PostgreSQL veritabanını yedeklemeye / geri yüklemeye çalışıyorum, ancak veriler geri yüklenmiyor.

Veritabanı görüntüsü tarafından kullanılan birimler şunlardır:

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

ve 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"]

Bu kapsayıcı ile DB kapsayıcısı oluşturmak:

docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"

Sonra bazı verileri manuel olarak eklemek için başka bir kap bağlarım:

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>

Daha sonra katran arşivi oluşturulur:

$ 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

Şimdi db için kullanılan kapsayıcıyı kaldırıyorum ve aynı adla başka bir tane oluşturuyorum ve daha önce eklenen verileri geri yüklemeye çalışıyorum:

$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar 

Ancak tablolar boş, neden veriler düzgün bir şekilde geri yüklenmiyor?


Yanıtlar:


457

Veritabanlarınızı yedekleyin

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

Veritabanlarınızı geri yükleme

cat your_dump.sql | docker exec -i your-db-container psql -U postgres

2
Evet, bu postgres bunu yapmanın yolu, ama bence docker yolu her zaman tercih ettiğinizde tercih edilmelidir
Carl Levasseur

42
Diskte biraz yer kazanmak için, çöplüğü gzip'e bağlamak isteyebilirsiniz: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_tarih +% d-% m-% Y "_"% H_% M_% S.gz
Tarion

1
Geri yüklemeden önce verileri açın. Bunu bir astar olarak yapmak için cat your_dump.sql, unzip komutuyla değiştirmeniz ve catsonuç yerine docker exec'e geçmeniz gerekir.
Tarion

2
Tarih formatı bozuldu, bu yüzden kopyalayıp yapıştırmadan önce iki kez kontrol edin.
vidstige

1
Bunun için tarih biçimlendirmesini nasıl çalıştıracağınızı docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
anlayamazsınız

18

Ayrıca veritabanlarınızı belirli bir süre içinde yedekleyecek bir potgres yedekleme konteyneri de kullanabileceğinizi düşünüyorum.

  pgbackups:
    container_name: Backup
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - ./backup:/backups
    links:
      - db:db
    depends_on:
      - db
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_DB=${DB_NAME} 
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
      - SCHEDULE=@every 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81

1
Mükemmel çalışıyor ! Teşekkürler
CaM2091

15

Tamam, bunu anladım. Postgresql başlatıldıktan sonra / var / lib / postgresql klasöründeki değişiklikleri algılamaz, en azından algılamasını istediğim türden değişiklikleri değil.

İlk çözüm postgres sunucusunu doğrudan başlatmak yerine bash ile bir kapsayıcı başlatmak, verileri geri yüklemek ve sonra sunucuyu el ile başlatmaktır.

İkinci çözüm bir veri kabı kullanmaktır. Daha önce anlayamadım, şimdi anladım. Bu veri kabı postgres kabına başlamadan önce verilerin geri yüklenmesini sağlar. Böylece, postgres sunucusu başladığında, veriler zaten oradadır.


1
Flocker veya konvoy veri konteyneri alımında yardımcı olabilir.
İleri

24
Lütfen daha fazla bilgi girin. Bu, gerçek bir çözümden ziyade bir çözümün taslağına benziyor
nafg

5

Başka bir yaklaşım ( docker-postgresql-iş akışına dayalı )

Dışa aktarmak için yerel çalışan veritabanı (docker'da değil, aynı yaklaşım işe yarar):

pg_dump -F c -h localhost mydb -U postgres export.dmp

İçe aktarılacak kapsayıcı veritabanı:

docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps`
docker run -it --link CONTAINERNAME:postgres  --volume $PWD/:/tmp/  postgres  bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'

1
Bu benim için çalıştı: pg_dump mydb -U postgres > export.psqlDocker konteyner bash içinde
Sepultura

3

Bir db geri yüklemek için bir db_dump kullanmaya çalışırken bu sorunu vardı. Ben normalde geri yüklemek için dbeaver kullanın - ancak bir psql dökümü aldı, bu yüzden docker konteyner kullanarak geri yüklemek için bir yöntem bulmak zorunda kaldı.

Forth tarafından önerilen ve Soviut tarafından düzenlenen metodoloji benim için çalıştı:

cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname

(çünkü bu tek bir db dökümü ve birden fazla db's ben adı dahil)

Bununla birlikte, bunun işe yaraması için, docker konteyneri ve projesinin içinde bulunduğu virtualenv'e de gitmek zorunda kaldım.

read unix @->/var/run/docker.sock: read: connection reset by peer

Bu dosya /var/lib/docker/network/files/local-kv.db dosyasından kaynaklanabilir. dolayısıyla Forth'ın cevabını kullanarak aradığı bu dosya yoktu.

Sonra doğru dizine (proje ile) gitti sanalenv etkinleştirdi ve sonra kabul edilen cevap koştu. Boom, üstte çalıştı. Umarım bu başka birine yardımcı olur!



1

cat db.dump | docker exec ...benim dökümü (~ 2Gb) için yol işe yaramadı. Birkaç saat sürdü ve bellek yetersiz hatası ile sonuçlandı.

Bunun yerine, konteynere döktüm ve içeriden pg_restore'ed.

Kapsayıcı kimliğinin CONTAINER_IDve db adının DB_NAME:

# copy dump into container
docker cp local/path/to/db.dump CONTAINER_ID:/db.dump

# shell into container
docker exec -it CONTAINER_ID bash

# restore it from within
pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump

0

dksnap( https://github.com/kelda/dksnap ) pg_dumpalldökümü çalıştırma ve yükleme işlemini otomatik olarak gerçekleştirir/docker-entrypoint-initdb.d .

Çalışan konteynerlerin bir listesini gösterir ve hangisini yedeklemek istediğinizi seçersiniz. Ortaya çıkan artefakt normal bir Docker görüntüsüdür, böylece daha sonra docker runveya Docker kayıt defterine iterek paylaşabilirsiniz.

(sorumluluk reddi: Ben projenin koruyucusuyum)


0

Docker postgress konteynerinden dökümü almak için aşağıdaki komut kullanılabilir

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.