Anlegen und Aufbewahrung von Partitionen mit pg_partman automatisieren
PostgreSQLPartitionierungBefehl
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);Was es tut
Registriert eine Parent-Tabelle bei pg_partman; legt künftige Partitionen vorab an, löscht solche jenseits der Aufbewahrungsdauer und meldet Zeilen, die in der Default-Partition gelandet sind.
Wann einsetzen
Wenn du statt manueller Verwaltung täglicher/monatlicher Partitionen oder eigener Skripte eine standardisierte, beobachtbare Automatisierung brauchst (Log-, Metrik-, Event-Tabellen).
Vorsicht
Die API hat sich zwischen pg_partman 4.x und 5.x geändert: In 5.x akzeptiert p_type nur 'range'/'list' (Standard 'range'), und p_type := 'native' aus 4.x ist ungültig; prüfe die installierte Version mit SELECT extversion FROM pg_extension WHERE extname = 'pg_partman';. create_parent legt standardmäßig auch eine Default-Partition an. retention_keep_table = false löscht Partitionen endgültig per DROP; brauchst du ein Archiv, lass es auf true und nutze retention_schema. Ist run_maintenance_proc() nicht eingeplant, werden keine neuen Partitionen angelegt und Daten landen in der Default-Partition. pg_partman_bgw erfordert shared_preload_libraries plus Neustart.
Verwandte Einträge
- Monatlich Range-partitionierte Tabelle anlegen (Partitionen in einer Schleife erzeugen)
- Vorbereitete Tabelle mit kurzer Sperre als Partition einhängen (ATTACH PARTITION)
- Alte Partition aushängen, ohne den Live-Betrieb zu blockieren (DETACH CONCURRENTLY)
- Falle Default-Partition: neue Partition scheitert mit 'would be violated by some row'
- Prüfen, ob Partition Pruning funktioniert (Planungs- und Laufzeit)