自动备份PostgreSQL数据库的最佳方法是什么?

我觉得每个星期都要备份数据库是很繁琐的。 而且我也认为每周备份应该变成每日备份。 如果我必须这样做,我不想手动执行。 什么是每天自动备份PostgreSQL数据库的最佳方式?

就像你为其他任何可以自动执行的重复任务所做的一样 – 你编写一个脚本来做备份,然后设置一个cron作业来运行它。

例如下面的脚本:

(注意:它必须以postgres用户或具有相同权限的任何其他用户身份运行)

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

编辑:
pg_dumpall -D开关(第27行)已被弃用,现在replace为--column-inserts
https://wiki.postgresql.org/wiki/Deprecated_Features

 pg_dump dbname | gzip > filename.gz 

重新加载

 createdb dbname gunzip -c filename.gz | psql dbname 

要么

 cat filename.gz | gunzip | psql dbname 

使用splitsplit命令允许您将输出拆分为基础文件系统可接受的大小。 例如,要制作1兆字节的块:

 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 

如果要以最小的系统负载备份整个群集,则可以简单地tar tar postgresql群集的根目录。 例如:

 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 

这是我的备份脚本的大部分。

如果有人不得不在Windows机器上备份他们的Postgres没有cygwin等的帮助,我有一个batch file,这项工作做得很好。

这将每天将数据库备份到它自己的目录中的单个文件中

 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 )