Postgresql基础备份脚本

我正在使用以下脚本来执行Postgresql的文件级备份。 我有时会看到最后一部分,在调用“pgs_backup_stop”之后进行清理,在等待最后一个WAL被创build时挂起。 search的REF_FILE有时是错误的。

我还通过rsync将这些文件发送到不同的机器,每5分钟一次。

其他人如何安全删除旧的WAL文件?

#!/bin/bash PGDATA=/usr/local/pgsql/data WAL_ARCHIVE=/usr/local/pgsql/archives PGBACKUP=/usr/local/pgsqlbackup PSQL=/usr/local/pgsql/bin/psql today=`date +%Y%m%d-%H%M%S` label=base_backup_${today} echo "Executing pg_start_backup with label $label in server ... " CP=`$PSQL -q -Upostgres -d template1 -c "SELECT pg_start_backup('$label');" -P tuples_only -P format=unaligned` RVAL=$? echo "Begin CheckPoint is $CP" if [ ${RVAL} -ne 0 ] then echo "PSQL pg_start_backup failed" exit 1; fi echo "pg_start_backup executed successfully" echo "TAR begins ... " pushd $PGBACKUP tar -cjf pgdata-$today.tar.bz2 --exclude='pg_xlog' $PGDATA/* popd echo "TAR completed" echo "Executing pg_stop_backup in server ... " $PSQL -Upostgres template1 -c "SELECT pg_stop_backup();" if [ $? -ne 0 ] then echo "PSQL pg_stop_backup failed" exit 1; fi echo "pg_stop_backup done successfully" TO_SEARCH="*${CP:0:2}000000${CP:3:2}.00${CP:5}" echo "Check for ${WAL_ARCHIVE}/${TO_SEARCH}.backup" while [ ! -e ${WAL_ARCHIVE}/${TO_SEARCH}.backup ]; do echo "Waiting for ${WAL_ARCHIVE}/${TO_SEARCH}.backup" sleep 1 done REF_FILE="`echo ${WAL_ARCHIVE}/*${CP:0:2}000000${CP:3:2}`" echo "Reference file ${REF_FILE}" # "-not -newer" or "\! -newer" will also return REF_FILE # so you have to grep it out and use xargs; otherwise you # could also use the -delete action find ${WAL_ARCHIVE} -not -newer ${REF_FILE} -type f | grep -v "^${REF_FILE}$" | xargs rm -f REF_FILE="`echo ${PGBACKUP}/pgdata-$today.tar.bz2`" echo "Reference file ${REF_FILE}" find $PGBACKUP -not -newer ${REF_FILE} -type f -name pgdata* | grep -v "^${REF_FILE}$" | xargs rm -f 

为了清理主服务器上已存档的WAL段,我只是删除了超过N天的xlog_archive任何内容(现在N = 30,因为我有很多的磁盘空间,而且我的活动并没有接近于在30天内填满存档)。


Re:你的备份过程一般 –
如果您正在使用pg_standby执行WAL-shipping复制, pg_standby可以让pg_standby处理从属服务器上的WAL文件(请参阅http://www.postgresql.org/docs/current/static/pgstandby.html – 基本上,您只需要保留足够的WAL在从机上分段以通过启动/恢复)。

如果这是你正在做的,我build议在从服务器上进行文件系统级的备份(停止从服务器,备份,重启,并且赶上WAL重播) – 这样可以避免pg_start_backup() / pg_stop_backup()检查点和磁盘活动可能滞后于你的主服务器(在你的问题中引用的挂起是该活动的一个工件),并保持主服务器上的负载下降。