매주 데이터베이스를 백업해야하는 것은 지루한 일입니다. 또한 주간 백업은 매일 백업으로 전환해야한다고 생각합니다. 그렇게해야한다면 수동으로하고 싶지 않습니다. 매일 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
답변
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
답변
“손으로”발행하는 명령이 무엇이든-스크립트에 작성하고 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
)