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?
database
postgresql
backup
docker
Carl Levasseur
sumber
sumber
Jawaban:
Cadangkan basis data Anda
Kembalikan database Anda
sumber
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
dengan perintah unzip dan pipa yang bukancat
hasilnya ke docker exec.docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
Saya pikir Anda juga dapat menggunakan wadah cadangan potgres yang akan membuat cadangan basis data Anda dalam durasi waktu tertentu.
sumber
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.
sumber
Pendekatan lain (berdasarkan pada docker-postgresql-workflow )
Basis data lokal yang berjalan (bukan di buruh pelabuhan, tetapi pendekatan yang sama akan berhasil) untuk mengekspor:
Database kontainer untuk diimpor:
sumber
pg_dump mydb -U postgres > export.psql
di bash container dockerSaya 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!
sumber
Ini adalah perintah yang berfungsi untuk saya.
sebagai contoh
Referensi : Solusi yang diberikan oleh GMartinez-Sisti dalam diskusi ini. https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b
sumber
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_ID
dan nama db adalahDB_NAME
:sumber
dksnap
( https://github.com/kelda/dksnap ) mengotomatiskan proses menjalankanpg_dumpall
dan 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)
sumber
Perintah di bawah ini dapat digunakan untuk mengambil dump dari wadah poster dermaga
sumber