我正在使用以下脚本对 Postgresql 进行文件级备份。我有时会发现,最后一部分(在调用“pgs_backup_stop”后进行清理)在等待创建最后一个 WAL 时挂起。要搜索的 REF_FILE 有时是错误的。
我还每 5 分钟通过 rsync 将这些文件发送到不同的机器。
其他人如何安全地删除旧的 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
答案1
为了清理主服务器上的存档 WAL 段,我只需删除xlog_archive
超过 N 天的所有内容(现在 N=30,因为我有很多磁盘空间,而且我的活动在 30 天内还不足以填满存档)。
回复:你的备份过程一般来说——
如果你正在进行 WAL 传输复制,pg_standby
你可以让 pg_standby 处理从属服务器上的 WAL 文件(参见http://www.postgresql.org/docs/current/static/pgstandby.html— 基本上,您只需要在从属服务器上保留足够的 WAL 段以完成启动/恢复)。
如果这是您正在做的,我建议在从属服务器上进行文件系统级备份(停止从属服务器,备份它,重新启动它并让其赶上 WAL 重放) - 这避免了可能滞后主服务器的pg_start_backup()
/pg_stop_backup()
检查点和磁盘活动(您在问题中提到的挂起是该活动的产物)并保持主服务器上的负载较低。