Cadangkan / Kembalikan basis data PostgreSQL yang sudah di-dock

155

Saya mencoba mem-backup / mengembalikan database PostgreSQL seperti yang dijelaskan di situs Docker, tetapi datanya tidak dipulihkan.

Volume yang digunakan oleh gambar database adalah:

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

dan CMD adalah:

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

Saya membuat wadah DB dengan perintah ini:

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

Lalu saya menghubungkan wadah lain untuk memasukkan beberapa data secara manual:

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>

Arsip tar kemudian dibuat:

$ 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

Sekarang saya menghapus wadah yang digunakan untuk db dan membuat yang lain, dengan nama yang sama, dan mencoba mengembalikan data yang dimasukkan sebelumnya:

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

Tapi tabelnya kosong, mengapa data tidak dipulihkan dengan benar?

Carl Levasseur
sumber

Jawaban:

457

Cadangkan basis data Anda

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

Kembalikan database Anda

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
Keempat
sumber
2
Ya, itulah cara postgres untuk melakukannya, tapi saya pikir cara buruh pelabuhan harus selalu lebih disukai ketika Anda menggunakannya
Carl Levasseur
42
Untuk menghemat ruang pada disk, Anda mungkin ingin mem-pipe dump ke gzip: 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
Tarion
1
Cukup unzip data sebelum Anda mengembalikannya. Untuk melakukannya sebagai satu liner Anda harus mengganti cat your_dump.sqldengan perintah unzip dan pipa yang bukan cathasilnya ke docker exec.
Tarion
2
Format tanggal kacau, jadi periksa kembali sebelum Anda menyalin dan menempel.
vidstige
1
Bagi yang tidak tahu bagaimana cara membuat format tanggal berfungsi: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
user1230795
18

Saya pikir Anda juga dapat menggunakan wadah cadangan potgres yang akan membuat cadangan basis data Anda dalam durasi waktu tertentu.

  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
Tharindu Pradeep
sumber
1
Bekerja dengan sempurna! Terima kasih
CaM2091
15

Oke, saya sudah menemukan ini. Postgresql tidak mendeteksi perubahan pada folder / var / lib / postgresql setelah diluncurkan, setidaknya bukan jenis perubahan yang saya inginkan terdeteksi.

Solusi pertama adalah memulai sebuah wadah dengan bash alih-alih memulai server postgres secara langsung, mengembalikan data, dan kemudian memulai server secara manual.

Solusi kedua adalah menggunakan wadah data. Saya tidak mengerti maksudnya sebelumnya, sekarang saya mengerti. Wadah data ini memungkinkan untuk mengembalikan data sebelum memulai wadah postgres. Jadi, ketika server postgres dimulai, data sudah ada di sana.

Carl Levasseur
sumber
1
flocker atau konvoi dapat membantu menangani data kontainer.
Keempat
24
Silakan isi lebih banyak detail. Ini terdengar lebih seperti sketsa solusi daripada solusi yang sebenarnya
nafg
5

Pendekatan lain (berdasarkan pada docker-postgresql-workflow )

Basis data lokal yang berjalan (bukan di buruh pelabuhan, tetapi pendekatan yang sama akan berhasil) untuk mengekspor:

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

Database kontainer untuk diimpor:

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'
sjakubowski
sumber
1
ini bekerja untuk saya: pg_dump mydb -U postgres > export.psqldi bash container docker
Sepultura
3

Saya mengalami masalah ini ketika mencoba menggunakan db_dump untuk mengembalikan db. Saya biasanya menggunakan dbeaver untuk mengembalikan - namun menerima dump psql, jadi harus mencari cara untuk memulihkan menggunakan wadah buruh pelabuhan.

Metodologi yang direkomendasikan oleh Forth dan diedit oleh Soviut bekerja untuk saya:

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

(Karena ini adalah dump db tunggal dan bukan multiple db, saya mencantumkan namanya)

Namun, untuk mendapatkan ini berfungsi, saya juga harus pergi ke virtualenv di mana buruh pelabuhan kontainer dan proyek berada di. Ini luput dari perhatian saya sebelum mencari tahu - karena saya menerima kesalahan buruh pelabuhan berikut.

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

Ini bisa disebabkan oleh file /var/lib/docker/network/files/local-kv.db. Saya tidak tahu keakuratan pernyataan ini: tapi saya yakin saya melihat ini karena saya tidak menggunakan buruh pelabuhan lokal, jadi karena itu tidak memiliki file ini, yang dicari, menggunakan jawaban Forth.

Saya kemudian menavigasi ke direktori yang benar (dengan proyek) mengaktifkan virtualenv dan kemudian menjalankan jawaban yang diterima. Boom, bekerja seperti gasing. Semoga ini bisa membantu orang lain di luar sana!

activereality
sumber
1

Ini adalah perintah yang berfungsi untuk saya.

cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

sebagai contoh

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

Referensi : Solusi yang diberikan oleh GMartinez-Sisti dalam diskusi ini. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b

Jacob Nelson
sumber
1

cat db.dump | docker exec ...cara tidak bekerja untuk dump saya (~ 2Gb). Butuh beberapa jam dan berakhir dengan kehabisan memori.

Sebagai gantinya, saya cp'ed membuang ke dalam wadah dan pg_restore'ed dari dalam

Dengan asumsi bahwa id wadah adalah CONTAINER_IDdan nama db adalah 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
Alex Fedoseev
sumber
0

dksnap( https://github.com/kelda/dksnap ) mengotomatiskan proses menjalankan pg_dumpalldan memuat dump melalui /docker-entrypoint-initdb.d.

Ini menunjukkan kepada Anda daftar kontainer yang sedang berjalan, dan Anda memilih yang mana yang ingin Anda cadangkan. Artefak yang dihasilkan adalah gambar Docker biasa, jadi Anda bisa lalu docker run, atau membagikannya dengan mendorongnya ke registri Docker.

(Penafian: Saya seorang pengelola proyek)

Kevin Lin
sumber
0

Perintah di bawah ini dapat digunakan untuk mengambil dump dari wadah poster dermaga

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
Shubham
sumber