बैकअप / डॉक्युमेंटेड पोस्टग्रैसक्यूएल डेटाबेस को पुनर्स्थापित करें


156

मैं Docker वेबसाइट पर बताए अनुसार PostgreSQL डेटाबेस को बैकअप / रिस्टोर करने का प्रयास कर रहा हूं, लेकिन डेटा को पुनर्स्थापित नहीं किया गया है।

डेटाबेस छवि द्वारा उपयोग किए गए वॉल्यूम हैं:

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

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

मैं इस आदेश के साथ DB कंटेनर बनाता हूं:

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

फिर मैं मैन्युअल रूप से कुछ डेटा डालने के लिए एक और कंटेनर कनेक्ट करता हूं:

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>

टार संग्रह तब बनाया गया है:

$ 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

अब मैं db के लिए उपयोग किए गए कंटेनर को हटाता हूं और उसी नाम के साथ एक और एक बनाता हूं, और पहले डाले गए डेटा को पुनर्स्थापित करने का प्रयास करता हूं:

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

लेकिन टेबल खाली हैं, डेटा को ठीक से बहाल क्यों नहीं किया गया है?


जवाबों:


457

अपने डेटाबेस का बैकअप लें

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

अपने डेटाबेस को पुनर्स्थापित करें

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

2
हां, यह पोस्टग्रेज करने का तरीका है, लेकिन मुझे लगता है कि जब आप इसे इस्तेमाल करते हैं तो डॉक करने के तरीके को हमेशा पसंद किया जाना चाहिए
कार्ल लेवाससेयुर

42
डिस्क पर कुछ स्थान बचाने के लिए आप डंप को gzip पर पाइप करना चाहते हैं: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_दिनांक +% d-% m-% Y "_"% H_% M_% S.gz
टैरियन

1
डेटा को पुनर्स्थापित करने से पहले उसे अनज़िप करें। इसे एक लाइनर के रूप में करने के लिए आपको cat your_dump.sqlअनज़िप कमांड और पाइप के साथ बदलना होगा जो catपरिणाम के बजाय डॉकर्स एग्ज़िक्यूट करता है।
तरियन

2
तारीख प्रारूप गड़बड़ है, इसलिए दोहराएं कि इससे पहले कि आप कॉपी और पेस्ट करें।
vidstige

1
उन लोगों के लिए यह पता लगाना नहीं था कि काम करने की तारीख कैसे प्राप्त की जाए: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
user1230795

18

मुझे लगता है कि आप एक पॉटग्रेफ़ बैकअप कंटेनर का भी उपयोग कर सकते हैं जो एक निश्चित समय अवधि के भीतर आपके डेटाबेस का बैकअप लेगा।

  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
अच्छी तरह से काम ! धन्यवाद
CaM2091

15

ठीक है, मैंने यह पता लगा लिया है। Postgresql एक बार लॉन्च होने के बाद फ़ोल्डर / var / lib / postgresql में बदलावों का पता नहीं लगाता है, कम से कम उस तरह के बदलावों के बारे में नहीं जो मैं चाहता हूं कि यह पता लगाया जाए।

पहला उपाय यह है कि सर्वर को सीधे पोस्टग्रेज सर्वर से शुरू करने के बजाय बैश के साथ एक कंटेनर शुरू करें, डेटा को पुनर्स्थापित करें, और फिर सर्वर को मैन्युअल रूप से शुरू करें।

दूसरा उपाय डेटा कंटेनर का उपयोग करना है। मुझे पहले इसकी बात नहीं आती थी, अब मैं करता हूं। यह डेटा कंटेनर पोस्टग्रेज कंटेनर शुरू करने से पहले डेटा को पुनर्स्थापित करने की अनुमति देता है। इस प्रकार, जब पोस्टग्रैज सर्वर शुरू होता है, तो डेटा पहले से ही होता है।


1
फ्लोकर या काफिला डेटा कंटेनर डीलिंग में मदद कर सकता है।
फोर्थ

24
कृपया अधिक जानकारी भरें। यह वास्तविक समाधान की तुलना में एक समाधान के एक स्केच की तरह लगता है
nafg

5

एक और दृष्टिकोण ( docker-postgresql-कार्यप्रवाह पर आधारित )

स्थानीय रनिंग डेटाबेस (निर्यात में नहीं, लेकिन समान दृष्टिकोण काम करेगा) निर्यात करने के लिए:

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

आयात करने के लिए कंटेनर डेटाबेस:

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
इसने मेरे लिए काम किया: pg_dump mydb -U postgres > export.psqlडॉकटर कंटेनर बैश में
सेपुल्टुरा

3

एक db को पुनर्स्थापित करने के लिए db_dump का उपयोग करने का प्रयास करते समय मेरे पास यह समस्या थी। मैं सामान्य रूप से पुनर्स्थापित करने के लिए dbeaver का उपयोग करता हूं- हालांकि एक psql डंप प्राप्त किया है, इसलिए डॉकर कंटेनर का उपयोग करके पुनर्स्थापित करने के लिए एक विधि का पता लगाना था।

फोर्थ द्वारा अनुशंसित और सोविट द्वारा संपादित कार्यप्रणाली ने मेरे लिए काम किया:

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

(चूँकि यह एक एकल db डंप था और एकाधिक db का नाम शामिल नहीं था)

हालाँकि, इसे काम पर लाने के लिए, मुझे virtualenv में भी जाना था कि docker कंटेनर और प्रोजेक्ट अंदर थे। इसने मुझे यह पता लगाने से पहले थोड़ा सा हटा दिया- जैसा कि मुझे निम्नलिखित docker त्रुटि प्राप्त हो रही थी।

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

यह फ़ाइल /var/lib/docker/network/files/local-kv.db के कारण हो सकता है। मुझे इस कथन की सटीकता का पता नहीं है: लेकिन मेरा मानना ​​है कि मैं इसे देख रहा था क्योंकि मैं स्थानीय रूप से उपयोगकर्ता डॉक नहीं करता हूं। इसलिए फोर्थ के उत्तर का उपयोग करते हुए, यह फ़ाइल नहीं थी, जिसे वह ढूंढ रहा था।

मैंने तब निर्देशिका को सही करने के लिए नेविगेट किया (परियोजना के साथ) virtualenv को सक्रिय किया और फिर स्वीकृत उत्तर को चलाया। बूम, एक शीर्ष की तरह काम किया। उम्मीद है कि यह किसी और को वहाँ से बाहर निकलने में मदद करता है!


1

यह मेरे लिए काम करने वाली आज्ञा है।

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

उदाहरण के लिए

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

संदर्भ : इस चर्चा में GMartinez-Sisti द्वारा दिया गया समाधान । https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b


1

cat db.dump | docker exec ...रास्ता मेरे डंप (~ 2 जीबी) के लिए काम नहीं किया। इसमें कुछ घंटों का समय लगा और मेमोरी की त्रुटि समाप्त हो गई।

इसके बजाय, मैंने कंटेनर में डंप किया और इसे भीतर से pg_restore'ed किया।

मान लें कि कंटेनर आईडी है CONTAINER_IDऔर db नाम है 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_dumpallमाध्यम से डंप को चलाने और लोड करने की प्रक्रिया को स्वचालित करता है/docker-entrypoint-initdb.d

यह आपको चलने वाले कंटेनरों की एक सूची दिखाता है, और आप उसे चुनते हैं जिसे आप बैकअप करना चाहते हैं। परिणामस्वरूप विरूपण साक्ष्य एक नियमित डॉकर छवि है, इसलिए आप इसे तब कर सकते docker runहैं, या इसे डॉकर रजिस्ट्री पर धकेल कर साझा कर सकते हैं ।

(अस्वीकरण: मैं परियोजना पर एक अनुचर हूँ)


0

नीचे दिए गए कमांड का उपयोग डॉक पोस्टग्रेजुएट कंटेनर से डंप लेने के लिए किया जा सकता है

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.