Назад | Перейти на главную страницу

Скрипт базового резервного копирования Postgresql

Я использую следующий сценарий для резервного копирования 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

Для очистки заархивированных сегментов WAL на мастере я просто удаляю что-нибудь в xlog_archive старше N дней (N = 30 прямо сейчас, потому что у меня много места на диске, и моя активность не приближается к заполнению архива в течение 30 дней).


Re: ваш процесс резервного копирования в целом -
Если вы выполняете репликацию WAL-доставки с pg_standby вы можете позволить pg_standby работать с файлами WAL на ведомом устройстве (см. http://www.postgresql.org/docs/current/static/pgstandby.html - По сути, вам нужно только сохранить достаточное количество сегментов WAL на ведомом устройстве для запуска / восстановления).

Если это то, что вы делаете, я предлагаю сделать резервную копию на уровне файловой системы на ведомом (остановите ведомый сервер, создайте его резервную копию, перезапустите его и дайте ему догнать воспроизведение WAL) - это позволяет избежать pg_start_backup() / pg_stop_backup() контрольные точки и активность диска, которые могут отставать от вашего главного сервера (зависание, о котором вы упомянули в своем вопросе, является артефактом этой активности) и снижают нагрузку на ваш главный сервер.