本文为您介绍 pg_partman 插件的简介及使用方法。
概述
pg_partman 是分区管理插件,用于自动化管理 PostgreSQL 原生分区表,支持按时间或 ID 自动创建分区、自动路由数据、自动维护分区。
支持版本
PostgreSQL 版本 | 内核版本 |
PostgreSQL 11 | v11.22_r1.35及以上 |
PostgreSQL 12 | v12.22_r1.37及以上 |
PostgreSQL 13 | v13.22_r1.32及以上 |
PostgreSQL 14 | v14.22_r1.42及以上 |
PostgreSQL 15 | v15.14_r1.27及以上 |
PostgreSQL 16 | v16.10_r1.22及以上 |
PostgreSQL 17 | v17.9_r1.16及以上 |
PostgreSQL 18 | v18.3_r1.6及以上 |
说明:
您可在控制台实例详情页查看当前实例的内核版本,或执行
SHOW tencentdb_version; 查询。插件简介
pg_partman 在 PostgreSQL 原生分区的基础上提供分区管理能力:创建分区父表后,pg_partman 会自动预创建未来分区、自动清理过期分区,并在后台定期执行维护,减少手动管理分区的工作量。
环境准备
在目标数据库中执行以下语句创建扩展:
postgres=> CREATE EXTENSION pg_partman;CREATE EXTENSION
说明:
本插件的函数创建在
public 模式下,可直接调用。创建时间分区表
创建原生分区表
先创建一张按时间范围分区的原生分区表:
postgres=> CREATE TABLE events (id bigint,event_time timestamptz NOT NULL,data text) PARTITION BY RANGE (event_time);CREATE TABLE
配置分区策略
使用
create_parent 函数将分区表交由 pg_partman 管理,指定按天(daily)分区:postgres=> SELECT create_parent('public.events', 'event_time', 'native', 'daily');create_parent---------------t(1 row)
create_parent 主要参数说明:参数 | 说明 |
第一个参数 | 父表名(含 schema) |
第二个参数 | 分区键列名 |
第三个参数 | 分区类型, native 表示原生分区 |
第四个参数 | 分区间隔,如 daily、hourly、monthly |
返回
t 表示配置成功。pg_partman 会自动按当前时间预创建若干分区。查看分区
使用
show_partitions 函数查看父表下的所有分区:postgres=> SELECT show_partitions('public.events');show_partitions-----------------------------(public,events_p2026_08_30)(public,events_p2026_08_31)(public,events_p2026_09_01)(public,events_p2026_09_02)(public,events_p2026_09_03)(public,events_p2026_09_04)(public,events_p2026_09_05)(public,events_p2026_09_06)(public,events_p2026_09_07)(9 rows)
数据写入
向父表插入数据时,PostgreSQL 会根据分区键自动路由到对应的子分区:
postgres=> INSERT INTO events VALUES (1, now(), 'a'), (2, now(), 'b');INSERT 0 2postgres=> SELECT tableoid::regclass AS partition, count(*) FROM events GROUP BY partition ORDER BY partition;partition | count--------------------+-------events_p2026_09_03 | 2(1 row)
说明:
两条数据被自动写入
events_p2026_09_03 分区,即当前日期对应的分区。查看分区配置
part_config 表记录了 pg_partman 管理的分区表配置:postgres=> SELECT parent_table, partition_type, partition_interval, premake FROM part_config;parent_table | partition_type | partition_interval | premake---------------+----------------+--------------------+---------public.events | native | 1 day | 4(1 row)
字段 | 说明 |
parent_table | 父表名 |
partition_type | 分区类型, native 表示原生分区 |
partition_interval | 分区间隔 |
premake | 预创建的未来分区数量 |
分区维护
使用
run_maintenance 函数执行分区维护,自动创建新的未来分区并清理过期分区:postgres=> SELECT run_maintenance();run_maintenance-----------------(1 row)
说明:
run_maintenance 是函数,使用 SELECT 调用。在生产环境中,pg_partman 会通过后台进程定期自动执行维护,通常无需手动调用。创建 ID 分区表
对于按 ID 递增的场景,可使用 ID 分区。以下示例按每1000个 ID 一个分区:
postgres=> CREATE TABLE orders (order_id bigint NOT NULL,order_time timestamptz,amount numeric) PARTITION BY RANGE (order_id);CREATE TABLEpostgres=> SELECT create_parent('public.orders', 'order_id', 'native', '1000');create_parent---------------t(1 row)postgres=> SELECT show_partitions('public.orders');show_partitions-----------------------(public,orders_p0)(public,orders_p1000)(public,orders_p2000)(public,orders_p3000)(public,orders_p4000)(5 rows)
说明:
ID 分区的第四个参数为每个分区的 ID 区间大小,上例按每1000个 ID 划分一个分区。
常见问题
Q:create_parent 返回 t 后,为什么没有立即看到分区?
A:pg_partman 会按当前时间自动预创建分区,正常情况下会立即创建。您可使用
show_partitions 函数查看分区列表;若列表为空,请确认传入的分区键列名与类型是否正确。Q:如何删除 pg_partman 管理的分区表?
A:直接对父表执行
DROP TABLE 会级联删除其所有分区,随后可在 part_config 表中清理对应的残留配置记录。