PostgreSQL ডাটাবেসগুলির স্বয়ংক্রিয় ব্যাক আপের সর্বোত্তম উপায় কী?


22

আমি প্রতি সপ্তাহে ডাটাবেস ব্যাকআপ করা ক্লান্তিকর বলে মনে করি। এবং আমি আরও মনে করি সাপ্তাহিক ব্যাকআপগুলি দৈনিক ব্যাকআপগুলিতে রূপান্তর করা উচিত। যদি আমাকে এটি করতে হয় তবে আমি নিজে এটি করতে চাই না। প্রতিদিন PostgreSQL ডাটাবেসগুলির ব্যাক আপটি স্বয়ংক্রিয় করার সর্বোত্তম উপায় কী?


ছোট নোট: ডিবি ডাম্পিং কার্য সম্পাদন করতে পারে, একটি ক্লাস্টার ব্যবহার করতে পারে এবং অ-অ্যাক্টিভ নোডগুলিতে ডাম্প করতে পারে।
নিউট্রিনাস

এই নিখরচায় সরঞ্জামটির সাহায্যে আপনি নির্ধারিত ব্যাকআপ করতে পারেন postgresql-backup.com
ওলেক নিলসন

পরবর্তী প্রশ্ন: আপনি কতটা বড়, আপনার সাধারণ ব্যাকআপ প্রক্রিয়াটি কী রয়েছে। উদাহরণস্বরূপ, আমি কখনও কোনও জিনিস ম্যানুয়ালি ব্যাক আপ করছি না। আমার ব্যাকআপ সিস্টেমের এজেন্ট ইনস্টল করুন, ইউআইতে ব্যাক আপ নিতে উপাদানগুলি নির্বাচন করুন, শিডিউল ব্যাকআপ (ডাটাবেসের জন্য আমার ক্ষেত্রে: প্রতি 5 মিনিটে) .... সমাপ্ত। তবে এটি যথেষ্ট পরিমাণে ধরেছে যে এটি একটি সঠিক সিস্টেম ইনস্টল করার জন্য বোধগম্য।
টমটম

আমি postgresql-backup.com কে একটি "ফ্রি" সলিউশন বলব না। এটি কেবলমাত্র প্রথম 2 ডাটাবেসের জন্য বিনামূল্যে ... @ ওলেকনিলসন
মেলেন

উত্তর:


40

স্বয়ংক্রিয়ভাবে চালিত যে কোনও অন্য পুনরাবৃত্ত কার্যের জন্য আপনি যেমন করেন - আপনি ব্যাকআপটি করার জন্য একটি স্ক্রিপ্ট লিখেছেন এবং তারপরে এটি চালানোর জন্য ক্রোন জব সেটআপ করেন।

নীচের মত একটি স্ক্রিপ্ট, উদাহরণস্বরূপ:

(দ্রষ্টব্য: এটি পোস্টগ্রিজ ব্যবহারকারী হিসাবে চালাতে হবে, বা একই বেসরকারী যে কোনও ব্যবহারকারী)

#! /bin/bash

# backup-postgresql.sh
# by Craig Sanders <cas@taz.net.au>
# This script is public domain.  feel free to use or modify
# as you like.

DUMPALL='/usr/bin/pg_dumpall'
PGDUMP='/usr/bin/pg_dump'
PSQL='/usr/bin/psql'

# directory to save backups in, must be rwx by postgres user
BASE_DIR='/var/backups/postgres'
YMD=$(date "+%Y-%m-%d")
DIR="$BASE_DIR/$YMD"
mkdir -p "$DIR"
cd "$DIR"

# get list of databases in system , exclude the tempate dbs
DBS=( $($PSQL --list --tuples-only |
          awk '!/template[01]/ && $1 != "|" {print $1}') )

# first dump entire postgres database, including pg_shadow etc.
$DUMPALL --column-inserts | gzip -9 > "$DIR/db.out.gz"

# next dump globals (roles and tablespaces) only
$DUMPALL --globals-only | gzip -9 > "$DIR/globals.gz"

# now loop through each individual database and backup the
# schema and data separately
for database in "${DBS[@]}" ; do
    SCHEMA="$DIR/$database.schema.gz"
    DATA="$DIR/$database.data.gz"
    INSERTS="$DIR/$database.inserts.gz"

    # export data from postgres databases to plain text:

    # dump schema
    $PGDUMP --create --clean --schema-only "$database" |
        gzip -9 > "$SCHEMA"

    # dump data
    $PGDUMP --disable-triggers --data-only "$database" |
        gzip -9 > "$DATA"

    # dump data as column inserts for a last resort backup
    $PGDUMP --disable-triggers --data-only --column-inserts \
        "$database" | gzip -9 > "$INSERTS"

done

# delete backup files older than 30 days
echo deleting old backup files:
find "$BASE_DIR/" -mindepth 1 -type d -mtime +30 -print0 |
    xargs -0r rm -rfv

সম্পাদনা:
pg_dumpall -D স্যুইচ (লাইন 27) হ্রাস করা হয়েছে, এখন https://wiki.postgresql.org/wiki/Drerecated_Features এর সাথে প্রতিস্থাপন করা হয়েছে--column-inserts


10
দুর্দান্ত স্ক্রিপ্টের জন্য +1
rkthkr

ব্যাকআপস একাধিক অনুলিপি রাখার বিষয়ে ডিল হিসাবে আমি ব্যাকআপের জন্য প্রিডম্প্পসিএমডি হিসাবে খুব অনুরূপ কিছু ব্যবহার করি the
ডেভিড পাশলে

2
দুর্দান্ত স্ক্রিপ্ট, কিন্তু আমি খুঁজে পেয়েছি যে রেগেক্সকে এমনভাবে টুইঙ্ক করতে হবে যাতে এটিতে পাইপ এবং ফাঁকা লাইনগুলি ডাটাবেসের নাম হিসাবে অন্তর্ভুক্ত করা যায় না। DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$')
s29

@ s29 আমি এই সমস্ত গ্রেপ হ্যাকেরির পরিবর্তে সরাসরি ক্যোয়ারী ব্যবহার করা ভাল বলে মনে করি, যেমন: ডিবিএস = ($ ($ {পিএসকিউএল t -t -A -c ") পিজি_ড্যাটাবেস থেকে ডেটা নাম নির্বাচন করুন যেখানে ডেটা নাম নেই ('টেমপ্লেট 0', ' টেমপ্লেট 1 ') "))
পলিটেকপ্যাট্রিক

দুর্দান্ত স্ক্রিপ্ট - সুতরাং এটি কীভাবে ক্লাস্টারকন্ট্রোলের মতো পরিষেবার সাথে তুলনা করে?
কর্নস

7
pg_dump dbname | gzip > filename.gz

দিয়ে পুনরায় লোড করুন

createdb dbname
gunzip -c filename.gz | psql dbname

অথবা

cat filename.gz | gunzip | psql dbname

ব্যবহার splitsplitকমান্ড আপনাকে টুকরা অন্তর্নিহিত ফাইল সিস্টেমে আকার গ্রহণযোগ্য মধ্যে আউটপুট বিভক্ত করতে পারেন। উদাহরণস্বরূপ, 1 মেগাবাইটের অংশগুলি তৈরি করতে:

pg_dump dbname | split -b 1m - filename

দিয়ে পুনরায় লোড করুন

createdb dbname
cat filename* | psql dbname

আপনি যারা এর মধ্যে একটি টস করতে পারে /etc/cron.hourly

Http://www.postgresql.org/docs/8.1/interactive/backup.html#BACKUP-DUMP-ALL থেকে উত্সাহিত


ফাইলটি বিভক্ত করা একটি দুর্দান্ত ধারণা। ব্যবহার করে ডাম্পকে বিভক্ত করা আরও ভাল split -C, যাতে কোনও লাইন কখনও বিভক্ত না হয়। একটি ব্যর্থ পুনরুদ্ধার ডিবাগিং সহজ।
জিয়ানলুকা ডেলা বেদোয়া

3

আপনি "হাত দিয়ে" যেই আদেশ জারি করেন না কেন - এগুলি স্ক্রিপ্টে লিখুন এবং ক্রোন বা আপনি যে কোনও সময়সূচী ব্যবহার করেন না কেন এই স্ক্রিপ্টে কল করুন।

আপনি অবশ্যই স্ক্রিপ্টটিকে আরও অভিনব করে তুলতে পারেন, তবে সাধারণত, আমি মনে করি যে আপনি সেখানে পৌঁছে যাবেন - সহজ শুরু করুন এবং পরে পরিমার্জন করুন।

সহজতম স্ক্রিপ্ট:

#!/bin/bash
/usr/local/pgsql/bin/pg_dumpall -U postgres -f /var/backups/backup.dump

এটিকে / home/randell/bin/backup.sh হিসাবে সংরক্ষণ করুন, ক্রোন যুক্ত করুন:

0 0 * * 0 /home/randell/bin/backup.sh

যদি pg_dumpall ব্যবহার করা হয় তবে এটি থেকে একক টেবিলটি পুনরুদ্ধার করা সম্ভব বা এটি একবারে সমস্ত পুনরুদ্ধার করবে? জন্য dumpall ব্যবহার করে নির্মিত একক টেবিল পুনঃস্থাপন আপনি ভাগ স্ক্রিপ্ট দয়া করে করতে পারেন
আশিস Karpe

0

আপনি যদি ন্যূনতম সিস্টেম লোড সহ একটি সম্পূর্ণ ক্লাস্টারটি ব্যাকআপ করতে চান তবে আপনি কেবল পোস্টগ্র্যাসকিএল ক্লাস্টারের মূল ডিরেক্টরিটি টর্প করতে পারেন। উদাহরণ স্বরূপ:

echo "select pg_start_backup('full backup - `date`');" | psql
/usr/bin/rdiff-backup --force --remove-older-than 7D $BACKUP_TARGET
/usr/bin/rdiff-backup --include '/etc/postgresql' --include $PGDATA --exclude '/*' / $BACKUP_TARGET
/bin/tar -cjf /mnt/tmp/$SERVER_NAME.tbz2 $BACKUP_TARGET 2>&1
echo "select pg_stop_backup();" | psql

এটি আমার ব্যাকআপ স্ক্রিপ্টের বেশিরভাগ অংশ।


1
না, যদি আপনি ওয়াল সংরক্ষণাগারটি সক্ষম না করেন তবে এটি কাজ করে না।
পিটার আইসেন্ট্রাট

0

যদি কারও সাইগউইন ইত্যাদির সহায়তা ছাড়াই উইন্ডোজ মেশিনে তাদের পোস্টগ্রাগগুলি ব্যাকআপ করতে হয় তবে আমার কাছে একটি ব্যাচ ফাইল রয়েছে যা কাজটি বেশ ভালভাবে করে।

এটি প্রতিদিন নিজস্ব ডিরেক্টরিতে পৃথক ফাইলগুলিতে ডাটাবেসগুলি ব্যাকআপ করবে

set dtnm=%date:~-4,4%%date:~-7,2%%date:~0,2%
set bdir=D:\backup\%dtnm%
mkdir %bdir%

FOR /F "tokens=1,2 delims=|" %%a IN ('psql -l -t -A -U postgres') DO (
    IF %%b EQU postgres pg_dump -U postgres -f %bdir%\%%a.sql.gz -Z 9 -i %%a
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.