PostgreSQL डेटाबेस के बैक-अप को स्वचालित करने का सबसे अच्छा तरीका क्या है?


22

मुझे लगता है कि यह हर हफ्ते बैकअप डेटाबेस के लिए थकाऊ है। और मुझे भी लगता है कि साप्ताहिक बैकअप को दैनिक बैकअप में बदल देना चाहिए। अगर मुझे ऐसा करना होता, तो मैं इसे मैन्युअल रूप से नहीं करना चाहता। रोजाना PostgreSQL डेटाबेस के बैकअप को स्वचालित करने का सबसे अच्छा तरीका क्या है?


छोटे नोट: db को डंप करने से परफॉरमेंस की मृत्यु हो सकती है, क्लस्टर का उपयोग करें और गैर-सक्रिय नोड्स पर डंप करें।
न्यूट्रिनस

आप इस मुफ्त टूल की सहायता से अनुसूचित बैकअप कर सकते हैं postgresql-backup.com
ओलेक निल्सन

अगला प्रश्न: आप कितने बड़े हैं, आपके पास कौन से सामान्य बैकअप तंत्र हैं? उदाहरण के लिए, मैं कभी भी कुछ भी मैन्युअल रूप से बैकअप नहीं ले रहा हूं। मेरे बैकअप सिस्टम के एजेंट को स्थापित करें, UI में बैकअप किए जाने वाले तत्वों का चयन करें, बैकअप (डेटाबेस के लिए मेरे मामले में: हर 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

EDIT:
pg_dumpall -D स्विच (लाइन 27) को हटा दिया गया है, अब इसे https://wiki.postgresql.org/wiki/Deprecated_Features से बदल दिया गया है--column-inserts


10
एक महान स्क्रिप्ट के लिए +1
rkthkr

मैं बैकपेक के लिए PreDumpCmd के रूप में कुछ इसी तरह का उपयोग करता हूं, इस अपवाद के साथ कि मैं रास्ते में तारीख को सांकेतिक शब्दों में बदलना नहीं करता, क्योंकि बैकपेक कई प्रतियों को रखने के साथ संबंधित है।
डेविड पैशले

2
महान स्क्रिप्ट, लेकिन मैंने पाया कि मुझे रेगेक्स को ऐसे मोड़ने की ज़रूरत थी कि इसमें डेटाबेस के नाम के रूप में पाइप और रिक्त लाइनें शामिल नहीं थीं। DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$')
s29

@ s29 मुझे लगता है कि सभी के बजाय सीधा हैक का उपयोग करने के लिए एक बेहतर क्वेरी का उपयोग करना बेहतर है, जैसे: DBS = ($ ($ {PSQL} -t -c) pg_database से datname चुनें जहाँ datname नहीं है ('template0', ' template1 ') "))
PolyTekPatrick

बहुत बढ़िया स्क्रिप्ट - तो यह ClusterControl जैसी सेवाओं की तुलना कैसे करता है?
कर्न्स

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 का उपयोग किया जाता है, तो क्या इससे एकल तालिका को पुनर्स्थापित करना संभव है या यह एक ही बार में सभी को पुनर्स्थापित करेगा? क्या आप डंपल का उपयोग करके बनाई गई एकल तालिका को पुनर्स्थापित करने के लिए स्क्रिप्ट साझा कर सकते हैं
आशीष

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
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.