archive_mode & archive_command
archive_mode habilita o arquivamento de WAL no primário. archive_command envia cada segmento de WAL concluído para armazenamento durável para segurança de PITR e para que os standbys se atualizem.
Receita
Diretório de arquivo local para laboratório; padrão S3 ou NFS para produção.
ALTER SYSTEM SET archive_mode = on;
ALTER SYSTEM SET archive_command =
'test ! -f /mnt/wal_archive/%f && cp %p /mnt/wal_archive/%f';
ALTER SYSTEM SET archive_timeout = '300s';
-- reinicie o PostgreSQL para habilitar archive_mode# Verifique se o arquivador está em execução
psql -c "SELECT * FROM pg_stat_archiver;"
ls -l /mnt/wal_archive/ | tailQuando usar isso: Qualquer cluster PostgreSQL 18.4 auto-hospedado que exija PITR ou retenção de WAL sem pgBackRest.
Exemplo de Trabalho
Padrões de produção: montagem NFS, rclone para S3 e integração com pgBackRest:
# archive_command via script (cópia atômica)
# /usr/local/bin/archive_wal.sh
#!/usr/bin/env bash
set -euo pipefail
WAL_PATH="$1"
WAL_NAME="$2"
DEST="/mnt/wal_archive/${WAL_NAME}"
test ! -f "$DEST" && cp "$WAL_PATH" "$DEST"
aws s3 cp "$DEST" "s3://prod-pg-wal/${WAL_NAME}" --only-if-different-- Equivalentes de postgresql.conf
-- archive_mode = on
-- archive_command = '/usr/local/bin/archive_wal.sh %p %f'
-- wal_level = replica (mínimo)
SELECT archived_count, failed_count, last_failed_wal, last_failed_time
FROM pg_stat_archiver;# Força a troca de segmento para testar o caminho de arquivamento
psql -c "SELECT pg_switch_wal();"
sleep 2
psql -c "SELECT last_archived_wal, last_archived_time FROM pg_stat_archiver;"O que isso demonstra:
archive_commanddeve retornar saída 0 em caso de sucesso; não-zero incrementafailed_count.test ! -fprevine erros de sobrescrita na retentativa.archive_timeoutforça a troca de WAL em sistemas de baixo tráfego para que os arquivos de arquivamento cheguem em tempo hábil.
Mergulho Profundo
Placeholders do archive_command
| Token | Significado |
|---|---|
%p | Caminho completo para o arquivo WAL a ser arquivado |
%f | Apenas o nome do arquivo WAL (ex: 000000010000000000000001) |
Destinos Comuns de Envio
| Destino | Padrão |
|---|---|
| Local/NFS | cp %p /archive/%f |
| S3 | Script personalizado com AWS CLI |
| pgBackRest | archive_command = 'pgbackrest --stanza=prod archive-push %p' |
pg_receivewal | Daemon secundário (menos comum agora) |
archive_mode vs streaming
- A replicação de streaming envia WAL para standbys ao vivo.
- O arquivamento copia segmentos concluídos para armazenamento durável para PITR.
- Use ambos: replicação para HA, arquivamento para redefinição e conformidade.
Armadilhas
- NFS cheio ou montagem obsoleta -
failed_countaumenta; a cadeia PITR quebra. Correção: Monitore o disco epg_stat_archiver. - archive_command não idempotente - A retentativa falha se a sobrescrita não for permitida. Correção: Guarda
test ! -fou pgBackRest. - archive_mode apenas em standby - O standby não gera novo WAL para arquivar para PITR das escritas do primário. Correção: Arquive no primário (ou pgBackRest a partir da política de backup do standby).
- Arquivo lento bloqueia a reciclagem de WAL - Pressão de disco no primário. Correção: Estágio local rápido e depois upload assíncrono para S3.
- Esqueceu de reiniciar após habilitar archive_mode - Parece configurado, mas inativo. Correção: Reinicie o PostgreSQL; confirme
SHOW archive_mode;.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| pgBackRest archive-push | Repositório de backup unificado | Configuração mínima apenas com shell |
| Snapshot EBS + WAL no S3 | Nativo da AWS | Necessidade de controle granular do archive_command |
| Backup gerenciado na nuvem | Backup automatizado do RDS | Patroni DIY em VMs |
FAQs
wal_level para arquivamento?
replica ou logical. minimal é insuficiente para combinação de HA + arquivamento em produção.
valor de archive_timeout?
Padrão 300s. Menor para RPO mais apertado em bancos de dados ociosos; maior reduz a contagem de arquivos de arquivamento em sistemas ocupados.
Patroni e archive_command?
Defina em postgresql.parameters ou bootstrap.dcs.postgresql.parameters do Patroni; reinício gradual via Patroni.
Compressão de WAL no arquivo?
pgBackRest comprime. cp bruto não comprime; habilite a compressão do sistema de arquivos ou gzip no script, se necessário.
Como reidratar um segmento ausente?
Copie de uma réplica externa do bucket de arquivamento; a recuperação não pode pular segmentos na cadeia.
Relacionados
- Noções Básicas de PITR - fluxo de recuperação
- Opções de Alvo de Recuperação - parar a repetição
- pgBackRest - archive-push
- Melhores Práticas de Backup - verificar arquivos
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.