¿Cómo hacer una copia de seguridad incremental cada hora en Postgres?

18

Intentando hacer una copia de seguridad incremental por hora de un único servidor Postgres (Win7 64).

Tengo la siguiente configuración en postgresql.conf:

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

(reiniciar)

Hice una copia de seguridad base con pg_basebackup -U postgres -D ..\foo -F t -x

Lo que hizo un gran base.tararchivo en la foocarpeta y agregó algunos archivos de 16,384 KB, que supongo que son WAL.

Lo que no entiendo es por qué los WAL foono cambian . Los WAL en data/pg_xlogcambio. ¿Se supone que pg no debe copiarlos? ¿Cómo decide hacerlo?

Tal vez necesito configurar archive_timeout=3600?

He visto varios sitios (listas de correo de pg, página de postgres de bacula) que dicen que debe llamar a pg_start_backup () y pg_stop_backup (), pero creo que no son necesarios. ¿Es eso cierto?

Preguntas secundarias:

  1. ¿Con qué frecuencia se escriben los WAL data/pg_xlog? ¿Qué desencadena una escritura?

    Parece actualizar un WAL si hago algo de DML y luego \qen psql. O edite una tabla en pgAdmin y luego cierre la ventana. Pensé que escribiría en commit.

  2. ¿Mejores prácticas? pg_basebackup una vez por semana? ¿Archivar WAL en la misma máquina que PG o una máquina remota?

Neil McGuigan
fuente

Respuestas:

5

Desea hacer una copia de seguridad incremental de la carpeta de archivo en el almacenamiento remoto.

Si necesita restaurar desde la copia de seguridad, el escenario básico es que necesitaría su copia de seguridad base como punto de partida y todo el contenido de la carpeta de archivo para reproducir la actividad transaccional que ocurrió entre el punto de partida y el bloqueo.

Además, para evitar que los archivos de la carpeta de archivo se acumulen para siempre, debe realizar una nueva copia de seguridad base de vez en cuando y eliminar los archivos que se archivaron antes de la nueva copia de seguridad base.

Daniel Vérité
fuente
Gracias. Algunas preguntas: 1. ¿Hago pg_start_backup (), copio los datos y luego ejecuto pg_stop_backup () o pg_start_backup (); pg_stop_backup (), luego copiar?
Neil McGuigan
@Neil: 1. y 2. no se aplican cuando lo usas pg_basebackup, ya se encarga de esto. 3. Postgres eliminará automáticamente los archivos WAL pg_logcuando ya no sean necesarios. No deberías hacer nada manualmente pg_log. De lo contrario, vea el wal_keep_segmentsparámetro
Daniel Vérité
por carpeta "archivo" te refieres a pg_xlog, ¿sí?
Neil McGuigan
@NeilMcGuigan: en absoluto. La carpeta de archivo es la carpeta de destino de su comando de archivo, por ejemplo, aquí "c: \ postgres \ foo". pg_xlogestá completamente administrado automáticamente por postgres, mientras que la carpeta de archivo está completamente administrada por el DBA.
Daniel Vérité
Supongo que estoy confundido porque los WAL en foo nunca cambian después del pg_basebackup inicial
Neil McGuigan
8

Existe una herramienta existente que lo ayudará mucho, WAL-E . Proporciona un archive_commandy restore_commandpara PITR a S3.

No hay comandos para hacer copias de seguridad lógicas incrementales o diferenciales . pg_dumpno puede tomar un incremental o diferencial. La única forma de hacerlo es mediante el archivo de registro.

En teoría, podría tomar una nueva copia de seguridad completa, hacer una diferencia binaria entre ella y la última copia de seguridad, y cargar la diferencia. Sin embargo, esto me parece una forma frágil e ineficiente de hacer las cosas, y realmente no lo recomendaría.

Además, PgBarman admite la integración con S3 a través de scripts de enlace y automatizará gran parte de la rotación y administración de copias de seguridad. De nuevo, esto puede no ser una opción en Windows.

Craig Ringer
fuente