云数据库 PostgreSQL pg_partman

这篇说说腾讯云PostgreSQL的pg_partman插件,用于自动化管理原生分区表,支持按时间或ID自动创建、路由和维护分区,并提供了创建分区表、配置策略、查看分区、数据写入及维护的完整操作步骤。 – 插件功能:自动预创建未来分区、清理过期分区,减少手动管理。 – 创建分区:使用create_parent函数配置分区策略,支持daily、hourly等间隔。 – 维护与查看:run_maintenance执行维护。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

这里说明 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 表中清理对应的残留配置记录。

十四、相关参考

pg_partman 产品文档

赞 (0)
上一篇 4天前
下一篇 4天前