Como fazer backup incremental a cada hora no Postgres?

18

Tentando fazer um backup incremental a cada hora de um único servidor Postgres (Win7 64).

Eu tenho a seguinte configuração em postgresql.conf:

max_wal_senders = 2
wal_level       = archive
archive_mode    = on
archive_command = 'copy "%p" "c:\\postgres\\foo\\%f"'

(reiniciar)

Eu fiz um backup básico com pg_basebackup -U postgres -D ..\foo -F t -x

O que criou um grande base.tararquivo nofoo pasta e adicionou alguns arquivos de 16.384 KB, que eu assumo serem WALs.

O que não entendo é por que os WALs foonão mudam . Os WALs em data/pg_xlogmudança. A página não deveria copiá-los? Como ele decide fazer isso?

Talvez eu precise definir archive_timeout=3600?

Eu já vi vários sites (listas de discussão da pg, página de postgres do bacula) que dizem que você precisa chamar pg_start_backup () e pg_stop_backup (), mas acredito que eles não são necessários. Isso é verdade?

Questões secundárias:

  1. Com que frequência os WALs data/pg_xlogsão escritos? O que desencadeia uma gravação?

    Parece atualizar um WAL se eu fizer algum DML \qno psql. Ou edite uma tabela no pgAdmin e feche a janela. Imaginei que escreveria no commit.

  2. Melhores Práticas? pg_basebackup uma vez por semana? Arquivar WALs na mesma máquina que o PG ou uma máquina remota?

Neil McGuigan
fonte

Respostas:

5

Você deseja fazer um backup incremental da pasta de arquivamento no armazenamento remoto.

Se você precisar restaurar a partir do backup, o cenário básico é que você precisará do backup básico como ponto de partida e todo o conteúdo da pasta de archive para reproduzir a atividade transacional que ocorreu entre o ponto de partida e a falha.

Além disso, para evitar que os arquivos na pasta de arquivamento se acumulem para sempre, você deseja fazer um novo backup de base de tempos em tempos e excluir os arquivos que foram arquivados antes do novo backup de base.

Daniel Vérité
fonte
Obrigado. Algumas perguntas: 1. Faço pg_start_backup (), copio os dados e, em seguida, corro pg_stop_backup () ou pg_start_backup (); pg_stop_backup () e copia?
Neil McGuigan
@ Neil: 1. e 2. não se aplicam quando você usa pg_basebackup, ele já cuida disso. 3. O postgres excluirá automaticamente os arquivos WAL pg_logquando não forem mais necessários. Você não deve fazer nada manualmente pg_log. Caso contrário, veja o wal_keep_segmentsparâmetro
Daniel Vérité
por pasta "archive", você quer dizer pg_xlog, sim?
Neil McGuigan
@ NeilMcGuigan: de maneira alguma. A pasta de arquivamento é a pasta de destino do seu comando de arquivamento, por exemplo, aqui "c: \ postgres \ foo". pg_xlogé totalmente gerenciado automaticamente pelo postgres, enquanto a pasta de arquivamento é totalmente gerenciada pelo DBA.
Daniel Vérité
Acho que estou confuso porque as Wals em foo nunca mudam após a pg_basebackup inicial
Neil McGuigan
8

Existe uma ferramenta existente que o ajudará bastante, o WAL-E . Fornece umaarchive_command e restore_commandpara PITR para S3.

Não comandos para fazer backups lógicos incrementais ou diferenciais . pg_dumpnão pode levar um incremental ou diferencial. A única maneira de fazer isso é através do arquivamento de log.

Em teoria, você pode fazer um novo backup completo, fazer uma comparação binária entre ela e o último backup e fazer o upload da comparação. Isso me parece uma maneira frágil e ineficiente de fazer as coisas, e eu realmente não recomendaria.

Além disso, o PgBarman suporta a integração com o S3 via scripts de gancho e automatizará grande parte da rotação e gerenciamento de backup para você. Novamente, isso pode não ser uma opção no Windows.

Craig Ringer
fonte