Backups incrementais para PostgreSQL

PostgreSQL não oferece suporte a backups incrementais prontos para uso. Você deve usar uma ferramenta chamada pg_rman .

Você precisa instalar pg_rman(se você estiver usando RedHat familly OS, você pode baixar a página rpm desta página), caso contrário, você terá que compilá-lo, antes de começar você precisará de alguns pacotes adicionais: libedit-dev, libpam-dev, postgresql- server-dev-9.2 .

Processo de instalação do pg_rman:

sudo su
cd
~
wget http
://pg-rman.googlecode.com/files/pg_rman-1.2.4.tar.gz
tar xvfz pg_rman
-1.2.4.tar.gz
cd pg_rman
-1.2.4
make USE_PGXS
=1
make USE_PGXS
=1 install
ln
-s /usr/lib/postgresql/9.2/bin/pg_rman /bin/pg_rman

Você deve configurar o PostgreSQL como abaixo (arquivo: /etc/postgresql/9.2/main/postgresql.conf ):

wal_level = archive
archive_mode
= on
archive_command
= 'cp "%p" "/mnt/pg_arclog/%f"'

pg_rman configuração:

sudo su
mkdir
/mnt/backup_pg_rman
mkdir
/mnt/pg_arclog
pg_rman init
-B /mnt/backup_pg_rman/ -D /var/lib/postgresql/9.2/main/

pg_rmanconfiguração (arquivo: / mnt / backup pg rman / pg_rman.ini ):

SRVLOG_PATH='/var/log/postgresql'
ARCLOG_PATH
='/mnt/pg_arclog'

BACKUP_MODE
= INCREMENTAL
COMPRESS_DATA
= YES

Defina os direitos corretos para os diretórios pg_rman:

sudo su
chown
-R postgres:postgres /mnt/backup_pg_rman
chown
-R postgres:postgres /mnt/pg_arclog

Backups de disparo:

  • cheio

    pg rman backup -B / mnt / backup pg_rman / –pgdata = / var / lib / postgresql / 9.2 / main / -b full

  • incremental

    pg rman backup -B / mnt / backup pg_rman / –pgdata = / var / lib / postgresql / 9.2 / main /

Envie backup para S3. Basta criar um arquivo ~/send_backup_to_s3(como usuário postgres e adicionar direitos de execução chmod +x ~/send_backup_to_s3) e colar as seguintes linhas:

#!/bin/bash

DAY
=`ls -lt /mnt/backup_pg_rman/ | grep $USER | grep -vE "tar|gz" | head -n 1 | awk {'print $9'}`
BACKUP
=`ls -lt /mnt/backup_pg_rman/$DAY | grep $USER | grep -vE "tar|gz" | head -n 1 | awk {'print $9'}`

LOCAL_STORE
='/mnt/backup_pg_rman/'$DAY
BACKUP_NAME
=$LOCAL_STORE/$DAY_$BACKUP.tar.gz
DIRECTORY_TO_BACKUP
=/mnt/backup_pg_rman/$DAY/$BACKUP

if [ ! -f $BACKUP_NAME ]
then
tar cfzP $BACKUP_NAME $DIRECTORY_TO_BACKUP

s3cmd put $BACKUP_NAME s3
://backup/pg_rman/
fi

Backup automático por cron, por exemplo, um backup completo por dia e um backup incremental por hora.

10   7 * * 1-5 /bin/bash -l -c 'source /etc/environment && pg_rman backup -B /mnt/backup_pg_rman/ --pgdata=/var/lib/postgresql/9.2/main/ -b full && pg_rman validate -B /mnt/backup_pg_rman ~/send_pg_rman_backup_to_s3'
20 */1 * * 1-5 /bin/bash -l -c 'source /etc/environment && pg_rman backup -B /mnt/backup_pg_rman/ --pgdata=/var/lib/postgresql/9.2/main/ && pg_rman validate -B /mnt/backup_pg_rman && ~/send_pg_rman_backup_to_s3'

Aproveitar.