Vieillissement automatique (suppression) des anciens enregistrements dans Postgres

15

Postgres dispose-t-il de fonctionnalités pour prendre en charge le vieillissement des anciens enregistrements?

Je veux utiliser Postgres pour la journalisation, comme une sorte de file d'attente, où les enregistrements (événements de journal) de plus de deux semaines sont automatiquement supprimés.

Basil Bourque
la source
Utilisez le partitionnement. La simple suppression des enregistrements ne réduira pas la taille de la table sur le disque.
sivann
@sivann Votre recommandation ne suppose-t-elle pas que son problème est la taille du disque? Si son problème est le temps d'exécution des requêtes, il semble que la suppression pourrait être une réponse peut-être plus simple que le partitionnement, non? (essayant toujours de comprendre cela moi-même)
stephenmm
1
Le problème est simplement que les enregistrements de journal ne sont plus intéressants après un certain temps. La suppression des anciennes lignes devrait faire de la place pour les nouvelles lignes fraîches.
Basil Bourque

Réponses:

15

Il n'y a pas de fonctionnalité intégrée pour supprimer automatiquement les lignes sur un régime basé sur le temps (que je connaisse).

Vous pouvez exécuter un cron-job quotidien (vous décidez) pour planifier des DELETEcommandes simples ou utiliser pgAgent à cet effet.

Ou vous pouvez utiliser le partitionnement avec des partitions hebdomadaires qui héritent d'une table principale , appelons-la log. Cela rendrait la suppression très bon marché : conservez simplement les deux dernières semaines et supprimez les anciennes partitions.

Créez un RULEou un TRIGGERsur la table principale qui redirige les INSERT vers la partition de la semaine en cours en fonction de l'heure système. Connectez-vous toujours à la table principale log. Créez des tables enfants à l'avance. Assurez-vous que plusieurs semaines à l'avance pour être sûr et exécutez un travail cron hebdomadaire qui ajoute les futures tables enfants ...

Il y a des exemples de code dans le manuel .
Réponse associée avec une fonction plpgsql créant automatiquement des tables:

La solution associée recrée un RULEpour rediriger les INSERT. Une fonction de déclenchement pourrait écrire dynamiquement sur la partition actuelle ...

Erwin Brandstetter
la source