매주 데이터베이스를 백업해야하는 것은 지루한 일입니다. 또한 주간 백업은 매일 백업으로 전환해야한다고 생각합니다. 그렇게해야한다면 수동으로하고 싶지 않습니다. 매일 PostgreSQL 데이터베이스 백업을 자동화하는 가장 좋은 방법은 무엇입니까?
매주 데이터베이스를 백업해야하는 것은 지루한 일입니다. 또한 주간 백업은 매일 백업으로 전환해야한다고 생각합니다. 그렇게해야한다면 수동으로하고 싶지 않습니다. 매일 PostgreSQL 데이터베이스 백업을 자동화하는 가장 좋은 방법은 무엇입니까?
답변:
자동화 할 수있는 다른 반복 작업과 마찬가지로 백업을 수행 할 스크립트를 작성한 다음 크론 작업을 설정하여 실행합니다.
예를 들어 다음과 같은 스크립트
(참고 : 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
DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$')
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
행을 분할하지 않도록을 사용하여 덤프를 분할하는 것이 좋습니다 . 실패한 복원의 디버깅이 더 쉽습니다.
"손으로"발행하는 명령이 무엇이든-스크립트에 작성하고 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
최소한의 시스템로드로 전체 클러스터를 백업하려면 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
그것은 내 백업 스크립트의 대부분입니다.
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
)