প্রশ্ন PostgreSQL ডাটাবেস ব্যাকআপ আপ স্বয়ংক্রিয় করার সেরা উপায় কি?


আমি এটা প্রতি সপ্তাহে ব্যাকআপ ডাটাবেস আছে ক্লান্তিকর খুঁজে। এবং আমি মনে করি সাপ্তাহিক ব্যাকআপগুলি দৈনন্দিন ব্যাকআপগুলিতে পরিণত হওয়া উচিত। যদি আমাকে সেটা করতে হয়, আমি নিজে নিজে এটি করতে চাই না। PostgreSQL ডাটাবেস ব্যাকআপ আপ স্বয়ংক্রিয়ভাবে সেরা উপায় কি?


20
2017-08-28 02:59


উত্স


ছোট নোট: ডিবি ডাম্পিং কর্মক্ষমতা হত্যা করতে পারে, একটি ক্লাস্টার এবং অ সক্রিয় নোডগুলিতে ডাম্প ব্যবহার করতে পারে। - neutrinus
আপনি এই বিনামূল্যে সরঞ্জাম সাহায্যে নির্ধারিত ব্যাকআপ করতে পারেন postgresql-backup.com - Olek Nilson
পরবর্তী প্রশ্ন: আপনি কত বড়, আপনার কাছে কোন সাধারণ ব্যাকআপ প্রক্রিয়া আছে। উদাহরণস্বরূপ, আমি নিজে নিজে কিছু ব্যাক আপ করছি না। আমার ব্যাকআপ সিস্টেমের এজেন্ট ইনস্টল করুন, UI এ ব্যাক আপ করার জন্য উপাদানগুলি নির্বাচন করুন, সময়সূচী ব্যাকআপ (আমার ক্ষেত্রে ডাটাবেসের জন্য: প্রতি 5 মিনিট) .... সমাপ্ত। কিন্তু যে যথেষ্ট ধারণ করে যে এটি একটি সঠিক সিস্টেম ইনস্টল করার ধারনা করে। - TomTom
আমি postgresql-backup.com কে একটি "মুক্ত" সমাধান কল করব না। এটি শুধুমাত্র প্রথম 2 ডেটাবেসগুলির জন্যই বিনামূল্যে ... @ ওলকনিলসন - Aidan Melen


উত্তর:


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

উদাহরণ হিসাবে একটি স্ক্রিপ্ট, উদাহরণস্বরূপ:

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

#! /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) অপ্রচলিত, এখন প্রতিস্থাপিত --column-inserts
https://wiki.postgresql.org/wiki/Deprecated_Features


38
2017-08-28 03:31



একটি মহান স্ক্রিপ্ট জন্য +1 - rkthkr
Backuppc এর জন্য PreDumpCmd হিসাবে খুব অনুরূপ কিছু ব্যবহার করি, ব্যতিক্রমটি যে আমি পথের মধ্যে তারিখ এনকোড করি না, যেমন ব্যাকআপ পিসি একাধিক কপি রাখার সাথে ডিল করে। - David Pashley
গ্রেট স্ক্রিপ্ট, কিন্তু আমি রেজেক্টটি টিকাক্স করতে চাই, যাতে এটি পাইপ এবং ডাটাবেস নামগুলির মতো ফাঁকা লাইন অন্তর্ভুক্ত করে না। DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$') - s29
@ s29 আমি সব Grep হ্যাকারের পরিবর্তে সরাসরি জিজ্ঞাস্য ব্যবহার করতে ভালো মনে করি, যেমন: DBS = ($ ($ {PSQL} -t -A -c "pg_database থেকে ডেটনাম নির্বাচন করুন যেখানে ডেটনামটি নেই ('টেমপ্লেট0', ' টেমপ্লেট 1 ') ")) - PolyTekPatrick


pg_dump dbname | gzip > filename.gz

সঙ্গে পুনরায় লোড করুন

createdb dbname
gunzip -c filename.gz | psql dbname

অথবা

cat filename.gz | gunzip | psql dbname

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

pg_dump dbname | split -b 1m - filename

সঙ্গে পুনরায় লোড করুন

createdb dbname
cat filename* | psql dbname

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

থেকে sourced http://www.postgresql.org/docs/8.1/interactive/backup.html#BACKUP-DUMP-ALL


6
2017-08-28 03:29



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


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

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

সরল সম্ভাব্য স্ক্রিপ্ট:

#!/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

2
2017-08-28 06:58





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

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

যে আমার ব্যাকআপ স্ক্রিপ্ট বাল্ক।


0
2017-08-28 22:05



না, আপনি ওয়াল সংরক্ষণাগার সক্ষম না থাকলে এটি কাজ করে না। - Peter Eisentraut


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

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

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
)

0
2018-02-03 18:38