PostgreSQL 데이터베이스 백업을 자동화하는 가장 좋은 방법은 무엇입니까?


22

매주 데이터베이스를 백업해야하는 것은 지루한 일입니다. 또한 주간 백업은 매일 백업으로 전환해야한다고 생각합니다. 그렇게해야한다면 수동으로하고 싶지 않습니다. 매일 PostgreSQL 데이터베이스 백업을 자동화하는 가장 좋은 방법은 무엇입니까?


작은 참고 : db를 덤프하면 성능이 저하되고 클러스터를 사용하며 비활성 노드에서 덤프 할 수 있습니다.
neutrinus

이 무료 도구 postgresql-backup.com
Olek Nilson

다음 질문 : 규모가 크며 일반적인 백업 메커니즘은 무엇입니까? 예를 들어, 수동으로 아무것도 백업하지 않습니다. 백업 시스템의 에이전트를 설치하고 UI에 백업 할 요소를 선택하고 백업을 예약합니다 (필자의 경우 데이터베이스 : 5 분마다) .... 완료. 그러나 그것은 적절한 시스템을 설치하는 것이 합리적이라고 가정합니다.
TomTom 2016

postgresql-backup.com을 "무료"솔루션이라고 부르지 않습니다. 처음 두 데이터베이스에 대해서만 무료입니다 ... @OlekNilson
Aidan Melen

답변:


40

자동화 할 수있는 다른 반복 작업과 마찬가지로 백업을 수행 할 스크립트를 작성한 다음 크론 작업을 설정하여 실행합니다.

예를 들어 다음과 같은 스크립트

(참고 : postgres 사용자 또는 동일한 권한을 가진 다른 사용자로 실행해야합니다)

#! /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/Deprecated_Features 로 바뀝니다.--column-inserts


10
좋은 스크립트에 대한 한
rkthkr

backuppc가 여러 복사본을 유지하는 것을 처리하기 때문에 날짜를 경로로 인코딩하지 않는다는 점을 제외하고 backuppc에는 PreDumpCmd와 매우 유사한 것을 사용합니다.
David Pashley

2
훌륭한 스크립트이지만 파이프와 빈 줄이 데이터베이스 이름으로 포함되지 않도록 정규 표현식을 조정해야한다는 것을 알았습니다. 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에서 datname을 선택하십시오. template1 ') "))
PolyTekPatrick

멋진 스크립트-이것이 ClusterControl과 같은 서비스와 어떻게 비교됩니까?
karns

7
pg_dump dbname | gzip > filename.gz

로 다시로드

createdb dbname
gunzip -c filename.gz | psql dbname

또는

cat filename.gz | gunzip | psql dbname

용도 split . 이 split명령을 사용하면 기본 파일 시스템에 적합한 크기로 출력을 분할 할 수 있습니다. 예를 들어, 1MB의 청크를 만들려면

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행을 분할하지 않도록을 사용하여 덤프를 분할하는 것이 좋습니다 . 실패한 복원의 디버깅이 더 쉽습니다.
Gianluca Della Vedova

3

"손으로"발행하는 명령이 무엇이든-스크립트에 작성하고 cron 또는 사용하는 스케줄러에서이 스크립트를 호출하십시오.

물론 스크립트를 더 화려하게 만들 수는 있지만 일반적으로 간단하게 시작한 다음 나중에 다시 시작할 것이라고 생각합니다.

가장 간단한 스크립트 :

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

/home/randell/bin/backup.sh로 저장하고 cron에 추가하십시오.

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

pg_dumpall이 사용되면 단일 테이블을 복원 할 수 있습니까? 아니면 한 번에 모두 복원합니까? dumpall
Ashish Karpe

0

최소한의 시스템로드로 전체 클러스터를 백업하려면 postgresql 클러스터의 루트 디렉토리를 tar하면됩니다. 예를 들면 다음과 같습니다.

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
아니요, WAL 보관 기능이 활성화되어 있지 않으면 작동하지 않습니다.
Peter Eisentraut

0

cygwin 등의 도움없이 Windows 시스템에서 postgres를 백업 해야하는 경우 작업을 수행하는 배치 파일이 있습니다.

데이터베이스를 매일 자체 디렉토리의 개별 파일로 백업합니다.

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.