Vraag Wat is de beste manier om Back-up van PostgreSQL-databases te automatiseren?


Ik vind het vervelend om elke week back-ups van databases te maken. En ik vind ook dat wekelijkse back-ups moeten worden omgezet in dagelijkse back-ups. Als ik dat moet doen, wil ik het niet handmatig doen. Wat is de beste manier om de back-up van PostgreSQL-databases dagelijks te automatiseren?


20
2017-08-28 02:59


oorsprong


Kleine opmerking: het dum dumpen kan de prestaties doden, een cluster gebruiken en dumpen op niet-actieve knooppunten. - neutrinus
U kunt geplande back-ups maken met behulp van deze gratis tool postgresql-backup.com - Olek Nilson
Volgende vraag: Hoe groot ben je, welk algemeen back-upmechanisme heb je op zijn plaats. Ik maak bijvoorbeeld nooit handmatig iets back-ups. Installeer een agent van mijn back-upsysteem, selecteer elementen waarvan een back-up moet worden gemaakt in de gebruikersinterface, plan een back-up (in mijn geval voor databases: elke 5 minuten) .... klaar. Maar dat veronderstelt genoeg te hebben dat het logisch is om een ​​goed systeem te installeren. - TomTom
Ik zou postgresql-backup.com geen "gratis" oplossing willen noemen. Het is alleen gratis voor de eerste 2 databases ... @OlekNilson - Aidan Melen


antwoorden:


hetzelfde als voor elke andere repetitieve taak die kan worden geautomatiseerd - u schrijft een script om de back-up te maken en stelt vervolgens een cron-taak in om deze uit te voeren.

een script zoals het volgende, bijvoorbeeld:

(Opmerking: het moet worden uitgevoerd als de gebruiker postgres, of een andere gebruiker met dezelfde rechten)

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

BEWERK :
pg_dumpall -D switch (regel 27) is verouderd, nu vervangen door --column-inserts
https://wiki.postgresql.org/wiki/Deprecated_Features


38
2017-08-28 03:31



+1 voor een geweldig script - rkthkr
Ik gebruik iets vergelijkbaars als een PreDumpCmd voor backuppc, met uitzondering van het feit dat ik de datum niet in het pad codeer, omdat backuppc handelt over het houden van meerdere kopieën. - David Pashley
Geweldig script, maar ik merkte dat ik de regex zo moest aanpassen dat het geen leidingen en lege regels als databasenamen bevatte. DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$') - s29
@ s29 Ik denk dat het beter is om een ​​directe query te gebruiken in plaats van al die grep-hackery, zoals: DBS = ($ ($ {PSQL} -t -A -c "selecteer datname uit pg_database waar datnaam niet in staat ('template0', ' template1 ') ")) - PolyTekPatrick


pg_dump dbname | gzip > filename.gz

Herladen met

createdb dbname
gunzip -c filename.gz | psql dbname

of

cat filename.gz | gunzip | psql dbname

Gebruik split. De split Met de opdracht kunt u de uitvoer opsplitsen in stukken die acceptabel zijn in grootte voor het onderliggende bestandssysteem. Om bijvoorbeeld brokken van 1 megabyte te maken:

pg_dump dbname | split -b 1m - filename

Herladen met

createdb dbname
cat filename* | psql dbname

Je zou een van die kunnen gooien /etc/cron.hourly

Afkomstig van http://www.postgresql.org/docs/8.1/interactive/backup.html#BACKUP-DUMP-ALL


6
2017-08-28 03:29



Het splitsen van het bestand is een geweldig idee. Het is beter om de dump te splitsen, met behulp van split -C, zodat een lijn nooit wordt gesplitst. Het debuggen van een mislukte restore is eenvoudiger. - Gianluca Della Vedova


Welke opdrachten u ook met de hand publiceert, - schrijf ze naar een script en zet een oproep naar dit script in cron of een andere planner die u gebruikt.

Je kunt het script natuurlijk mooier maken, maar over het algemeen denk ik dat je het wel zult krijgen - begin eenvoudig en verfij je later.

Eenvoudigste script mogelijk:

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

Sla het op als /home/randell/bin/backup.sh, voeg toe aan cron:

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

2
2017-08-28 06:58





Als u een back-up wilt maken van een hele cluster met minimale systeembelasting, kunt u eenvoudig tar de hoofdmap van de postgresql-cluster tareren. bijvoorbeeld:

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

dat is het grootste deel van mijn back-up script.


0
2017-08-28 22:05



Nee, dit werkt niet als WAL-archivering niet is ingeschakeld. - Peter Eisentraut


in het geval dat iemand een back-up moet maken van zijn postgres op een Windows-machine zonder de hulp van cygwin enz. Ik heb een batchbestand dat het werk redelijk goed doet.

hierdoor wordt elke dag een back-up gemaakt van de databases in afzonderlijke bestanden in de eigen directory

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