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

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

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

答案1

与您对任何其他可以自动执行的重复性任务所做的操作相同 - 编写脚本来执行备份,然后设置 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 -Dswitch (第 27 行)已被弃用,现在替换为--column-inserts
https://wiki.postgresql.org/wiki/Deprecated_Features

答案2

pg_dump dbname | gzip > filename.gz

重新加载

createdb dbname
gunzip -c filename.gz | psql dbname

或者

cat filename.gz | gunzip | psql dbname

使用split。该split命令允许您将输出拆分为底层文件系统可以接受的大小的块。例如,要制作 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

答案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

答案4

如果您想以最小的系统负载备份整个集群,您可以简单地 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

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

相关内容