একটি ডকারাইজড পোস্টগ্রাইএসকিউএল ডাটাবেসটিকে ব্যাকআপ / পুনরুদ্ধার করুন


156

আমি ডকারের ওয়েবসাইটে বর্ণিত একটি পোস্টগ্রিজ এসকিউএল ডাটাবেস ব্যাকআপ / পুনরুদ্ধার করার চেষ্টা করছি, তবে ডেটা পুনরুদ্ধার করা হয়নি।

ডাটাবেস ইমেজ দ্বারা ব্যবহৃত ভলিউম হয়:

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

এবং সিএমডি হ'ল:

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

আমি এই কমান্ডটি দিয়ে ডিবি ধারক তৈরি করেছি:

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

তারপরে ম্যানুয়ালি কিছু ডেটা toোকাতে আমি অন্য ধারককে সংযুক্ত করেছি:

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
ডিস্কে কিছু স্থান বাঁচাতে আপনি জিপ-তে ডাম্পটি পাইপ করতে চাইতে পারেন: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_তারিখ +% d-% m-% Y "_"% এইচ_% এম_% এস.gz
টেরিয়ন

1
আপনি এটি পুনরুদ্ধার করার আগে ডেটা আনজিপ করুন। ওয়ান লাইনার হিসাবে এটি করার জন্য আপনাকে cat your_dump.sqlআনজিপ কমান্ড এবং পাইপ দিয়ে প্রতিস্থাপন করতে হবে যা catফলাফলের পরিবর্তে ডকার এক্সিকিউট করতে হবে।
টারিয়েন

2
তারিখের ফর্ম্যাটটি গণ্ডগোল হয়ে গেছে, তাই অনুলিপি করে পেস্ট করার আগে ডাবল পরীক্ষা করে দেখুন।
ভিজিটিজ

1
তাদের জন্য কীভাবে তারিখের ফর্ম্যাটিংয়ের কাজ করা যায় তা বুঝতে পারেন না: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
ব্যবহারকারীর 1230795

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

ঠিক আছে, আমি এটি খুঁজে পেয়েছি। পোস্টগ্রাএসকিএল একবার চালু হওয়ার পরে ফোল্ডারে / var / lib / postgresql পরিবর্তনগুলি সনাক্ত করতে পারে না, কমপক্ষে আমি যে ধরণের পরিবর্তন চাই তা সনাক্ত করতে পারি না।

প্রথম সমাধানটি হ'ল সরাসরি পোস্টগ্রিস সার্ভার শুরু করার পরিবর্তে ব্যাশ দিয়ে একটি ধারক শুরু করা, ডেটা পুনরুদ্ধার করা এবং তারপরে ম্যানুয়ালি সার্ভার শুরু করা।

দ্বিতীয় সমাধানটি হ'ল ডেটা ধারক ব্যবহার করা। আমি এর বিন্দুটি আগে পাইনি, এখন করি। এই ডেটা ধারক পোস্টগ্রিস ধারক শুরু করার আগে ডেটা পুনরুদ্ধার করতে দেয়। সুতরাং, যখন পোস্টগ্রিজ সার্ভার শুরু হয়, ডেটা ইতিমধ্যে সেখানে রয়েছে।


1
flocker বা কাফেলা ডেটা ধারক ব্যবসায়ের সাথে সহায়তা করতে পারে।
ওদিক

24
আরও বিশদ পূরণ করুন। এটি প্রকৃত সমাধানের চেয়ে কোনও সমাধানের স্কেচের মতো শোনাচ্ছে
nafg

5

আরেকটি পদ্ধতির ( ডকার-পোস্টগ্র্যাস্কিল-কর্মপ্রবাহের উপর ভিত্তি করে) )

স্থানীয় চলমান ডাটাবেস (ডকারে নয়, তবে একই পদ্ধতির কাজ হবে) রফতানি করতে:

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_dump ব্যবহার করার চেষ্টা করার সময় আমার এই সমস্যাটি ছিল। আমি সাধারণত ডিবিভারটি পুনরুদ্ধার করতে ব্যবহার করি however তবে একটি পিএসকিএল ডাম্প পেয়েছি, তাই ডকারের ধারকটি ব্যবহার করে পুনরুদ্ধার করার জন্য কোনও পদ্ধতি বের করতে হয়েছিল।

ফোর্থ দ্বারা প্রস্তাবিত এবং সোভিয়েত সম্পাদিত পদ্ধতিটি আমার পক্ষে কাজ করেছিল:

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

(যেহেতু এটি একটি একক ডিবি ডাম্প এবং একাধিক ডিবি নয় আমি নামটি অন্তর্ভুক্ত করেছি)

যাইহোক, এটির কাজটি পেতে, আমাকে ডকারের ধারক এবং প্রকল্পটি যে ভার্চুয়ালেনভের মধ্যে ছিল তাও বের করতে হয়েছিল it

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

এটি /var/lib/docker/network/files/local-kv.db ফাইলের কারণে ঘটতে পারে I সুতরাং ফরথের উত্তর ব্যবহার করে এই ফাইলটি এটি খুঁজছিল না।

আমি তখন ডিরেক্টরিতে সঠিকভাবে নেভিগেট করেছি (প্রকল্পের সাথে) ভার্চুয়ালেনভকে সক্রিয় করেছি এবং তারপরে স্বীকৃত উত্তরটি চালিয়েছি। বুম, শীর্ষের মতো কাজ করেছেন। আশা করি এটি অন্য কাউকে সাহায্য করবে!


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 ...উপায় আমার ডাম্পের জন্য কাজ করে না (for 2Gb)। এটি কয়েক ঘন্টা সময় নিয়েছে এবং মেমরির বাইরে থাকা ত্রুটির সাথে শেষ হয়েছিল।

পরিবর্তে, আমি সিপি'ড কন্টেইনারে ফেলেছিলাম এবং pg_restore'ed এর ভিতরে থেকে।

ধরে নিচ্ছি যে ধারক আইডি CONTAINER_IDএবং ডিবি নামটি হ'ল 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.