Script de backup de base do Postgresql

1

Estou usando o seguinte script para fazer um backup em nível de arquivo do Postgresql. Eu às vezes vejo que a última parte, para fazer a limpeza depois de "pgs_backup_stop" é chamada, trava enquanto aguarda o último WAL a ser criado. O REF_FILE para procurar é por vezes errado.

Também estou enviando esses arquivos para uma máquina diferente, a cada 5 minutos via rsync.

O que outras pessoas fazem para remover arquivos WAL antigos com segurança?

#!/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
    
por Terry G Lorber 14.06.2010 / 19:01

1 resposta

1

Para limpar os segmentos WAL arquivados no mestre, basta excluir qualquer coisa em xlog_archive mais de N dias de idade (N = 30 agora, porque tenho muito espaço em disco e minha atividade não chega perto de preencher o arquivo em 30 dias).

Re: seu processo de backup em geral -
Se você estiver fazendo a replicação de envio do WAL com pg_standby , poderá deixar o pg_standby lidar com os arquivos WAL no escravo (Consulte link - Basicamente, você precisa apenas manter segmentos WAL suficientes no escravo para passar pela inicialização / recuperação).

Se é isso que você está fazendo, sugiro fazer o backup em nível de sistema de arquivos no escravo (parar o servidor escravo, fazer backup, reiniciá-lo e deixá-lo acompanhar a reprodução do WAL) - Isso evita pg_start_backup() / pg_stop_backup() checkpointing & atividade de disco que pode atrasar seu servidor mestre (o travamento a que você se refere na sua pergunta é um artefato dessa atividade) e mantém a carga em seu servidor mestre inativa.

    
por 14.06.2010 / 19:13