Comment faire une sauvegarde incrémentielle toutes les heures dans Postgres?

18

Essayer de faire une sauvegarde incrémentielle toutes les heures d'un seul serveur Postgres (Win7 64).

J'ai la configuration suivante dans postgresql.conf:

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

(redémarrer)

J'ai fait une sauvegarde de base avec pg_basebackup -U postgres -D ..\foo -F t -x

Ce qui a fait un gros base.tarfichier dans le foodossier et ajouté quelques fichiers 16,384 KB, qui je suppose sont des WAL.

Ce que je ne comprends pas, c'est pourquoi les WAL foone changent pas . Les WAL en data/pg_xlogmutation. Pg n'est pas censé les copier? Comment décide-t-il de le faire?

Peut-être que je dois régler archive_timeout=3600?

J'ai vu plusieurs sites (listes de diffusion de pg, page postgres de bacula) qui disent que vous devez appeler pg_start_backup () et pg_stop_backup (), mais je pense que ceux-ci ne sont pas requis. Est-ce vrai?

Questions secondaires:

  1. À quelle fréquence les WAL data/pg_xlogsont-ils écrits? Qu'est-ce qui déclenche une écriture?

    Il semble mettre à jour un WAL si je fais du DML puis \qen psql. Ou modifiez un tableau dans pgAdmin puis fermez la fenêtre. J'ai pensé qu'il écrirait sur commit.

  2. Les meilleures pratiques? pg_basebackup une fois par semaine? Archiver les WAL sur la même machine que PG ou une machine distante?

Neil McGuigan
la source

Réponses:

5

Vous souhaitez effectuer une sauvegarde incrémentielle du dossier d'archivage vers le stockage distant.

Si vous avez besoin de restaurer à partir de la sauvegarde, le scénario de base est que vous auriez besoin de votre sauvegarde de base comme point de départ et de tout le contenu du dossier d'archivage pour relire l'activité transactionnelle qui s'est produite entre le point de départ et le crash.

De plus, pour éviter que les fichiers du dossier d'archives ne s'empilent pour toujours, vous souhaitez effectuer une nouvelle sauvegarde de base de temps en temps et supprimer les fichiers qui ont été archivés avant la nouvelle sauvegarde de base.

Daniel Vérité
la source
Merci. Quelques questions: 1. Dois-je faire pg_start_backup (), copier les données, puis exécuter pg_stop_backup () ou pg_start_backup (); pg_stop_backup (), puis copiez?
Neil McGuigan
@Neil: 1. et 2. ne s'appliquent pas lorsque vous utilisez pg_basebackup, il s'en occupe déjà. 3. postgres supprimera automatiquement les fichiers WAL pg_loglorsqu'ils ne seront plus nécessaires. Vous ne devez rien faire manuellement dans pg_log. Sinon, voir le wal_keep_segmentsparamètre
Daniel Vérité
par dossier "archive" vous voulez dire pg_xlog, oui?
Neil McGuigan
@NeilMcGuigan: pas du tout. Le dossier archive est le dossier de destination de votre commande archive, par exemple ici "c: \ postgres \ foo". pg_xlogest entièrement géré automatiquement par postgres, tandis que le dossier d'archives est entièrement géré par le DBA.
Daniel Vérité
Je suppose que je suis confus parce que les WAL dans foo ne changent jamais après la première pg_basebackup
Neil McGuigan
8

Il existe un outil existant qui vous aidera beaucoup, WAL-E . Il fournit un archive_commandet restore_commandpour PITR à S3.

Il n'existe aucune commande pour effectuer des sauvegardes logiques incrémentielles ou différentielles . pg_dumpne peut pas prendre un incrémental ou différentiel. La seule façon de procéder est l'archivage des journaux.

En théorie, vous pouvez prendre une nouvelle sauvegarde complète, faire un diff binaire entre celle-ci et la dernière sauvegarde et télécharger le diff. Cela me semble cependant une manière fragile et inefficace de faire les choses, et je ne le recommanderais vraiment pas.

De plus, PgBarman prend en charge l'intégration avec S3 via des scripts de raccordement et automatisera une grande partie de la rotation et de la gestion des sauvegardes pour vous. Encore une fois, cela peut ne pas être une option sous Windows.

Craig Ringer
la source