Automatiser la création et la rétention des partitions avec pg_partman
PostgreSQLPartitionnementCommande
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;
CREATE TABLE public.measurements (
id bigint GENERATED ALWAYS AS IDENTITY,
ts timestamptz NOT NULL,
value numeric,
PRIMARY KEY (id, ts)
) PARTITION BY RANGE (ts);
-- Daily partitions, pre-create 7 days ahead (pg_partman 5.x syntax)
SELECT partman.create_parent(
p_parent_table := 'public.measurements',
p_control := 'ts',
p_interval := '1 day',
p_premake := 7
);
-- Drop partitions older than 30 days
UPDATE partman.part_config
SET retention = '30 days',
retention_keep_table = false
WHERE parent_table = 'public.measurements';
-- Maintenance: run periodically (schedule with pg_cron or pg_partman_bgw)
CALL partman.run_maintenance_proc();
-- Any rows in the default partition?
SELECT * FROM partman.check_default(p_exact_count := true);Ce que fait la commande
Enregistre une table parent auprès de pg_partman ; crée à l'avance les partitions futures, supprime celles qui dépassent la période de rétention et signale les lignes tombées dans la partition par défaut.
Quand l'utiliser
Lorsque vous avez besoin d'une automatisation standard et observable au lieu de gérer à la main ou par des scripts maison des partitions quotidiennes/mensuelles (tables de journaux, de métriques, d'événements).
Attention
L'API a changé entre pg_partman 4.x et 5.x : en 5.x, p_type n'accepte que 'range'/'list' ('range' par défaut), et le p_type := 'native' de 4.x est invalide ; vérifiez la version installée avec SELECT extversion FROM pg_extension WHERE extname = 'pg_partman';. create_parent crée aussi une partition par défaut par défaut. retention_keep_table = false supprime définitivement (DROP) les partitions ; si vous avez besoin d'une archive, laissez-le à true et utilisez retention_schema. Si run_maintenance_proc() n'est pas planifié, aucune nouvelle partition n'est créée et les données tombent dans la partition par défaut. pg_partman_bgw exige shared_preload_libraries plus un redémarrage.
Voir aussi
- Créer une table partitionnée par range mensuel (générer les partitions dans une boucle)
- Attacher une table préparée comme partition avec un verrou court (ATTACH PARTITION)
- Détacher une ancienne partition sans bloquer le trafic (DETACH CONCURRENTLY)
- Piège de la partition par défaut : une nouvelle partition échoue avec 'would be violated by some row'
- Vérifier que le partition pruning fonctionne (à la planification et à l'exécution)