web-dev-qa-db-fra.com

Quelle est la meilleure façon d'automatiser la sauvegarde des bases de données PostgreSQL?

Je trouve fastidieux de devoir sauvegarder des bases de données chaque semaine. Et je pense aussi que les sauvegardes hebdomadaires devraient être transformées en sauvegardes quotidiennes. Si je devais faire ça, je ne veux pas le faire manuellement. Quelle est la meilleure façon d'automatiser quotidiennement la sauvegarde des bases de données PostgreSQL?

22
Randell

la même chose que vous le faites pour toute autre tâche répétitive pouvant être automatisée - vous écrivez un script pour faire la sauvegarde, puis configurez un travail de cron pour l'exécuter.

un script comme ce qui suit, par exemple:

(Remarque: il doit être exécuté en tant qu'utilisateur Postgres ou tout autre utilisateur avec les mêmes Privs)

#! /bin/bash

# backup-postgresql.sh
# by Craig Sanders <[email protected]>
# 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 Un commutateur (ligne 27) est obsolète, maintenant remplacé par --column-inserts
[.____] https://wiki.postgresql.org/wiki/depecated_features

40
cas
pg_dump dbname | gzip > filename.gz

Recharger avec

createdb dbname
gunzip -c filename.gz | psql dbname

ou

cat filename.gz | gunzip | psql dbname

Utilisez split. La commande split vous permet de scinder la sortie en morceaux de taille acceptable dans le système de fichiers sous-jacents. Par exemple, pour faire des morceaux de 1 mégaoctet:

pg_dump dbname | split -b 1m - filename

Recharger avec

createdb dbname
cat filename* | psql dbname

Vous pourriez lancer un de ceux-ci dans /etc/cron.hourly

Provenant de - http://www.postgresql.org/docs/8.1/interactive/backup.html#backup-dump-all

7
Nick Anderson

Quelles que soient les commandes que vous utilisez "à la main", - écrivez-les au script et appellez à ce script en Cron ou quel que soit le planificateur que vous utilisez.

Vous pouvez bien sûr rendre le script plus de fantaisie, mais en général, je pense que vous allez y arriver - commencez simplement et affinez plus tard.

Script le plus simple possible:

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

Enregistrez-le comme /home/randell/bin/backup.sh, Ajouter à Cron:

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

Si vous souhaitez sauvegarder un cluster entier avec une charge de système minimale, vous pouvez simplement gérer le répertoire racine du cluster PostgreSQL. par exemple:

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

c'est la majeure partie de mon script de sauvegarde.

0
lee

si quiconque doit sauvegarder leurs postgres sur une machine Windows sans l'aide de Cygwin, etc., j'ai un fichier de commandes qui fait très bien le travail.

cela permettra de sauvegarder les bases de données dans des fichiers individuels dans son propre répertoire tous les jours

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
l0ft13