大家好,分享一则日常工作的案例: 关于分区管理工具pg_partman 5.0的变化。
目前测试有2套PG的环境:
1.PG15.5 + pg_partman 4.7
2.PG16.1 + pg_partman 5.0
之前一直用PG15.5 + pg_partman 4.7 来创建和管理分区,把熟悉的SQL都记录了下来,感觉很是方便。
今天有开发的小伙伴要求在PG16.1 + pg_partman 5.0 上创建分区表, 习惯性的拿出了之前 pg_partman 4.7 版本的SQL 语句,
结果就遇到了如下的错误:
ERROR: monthly is not a valid partitioning type for pg_partman
ERROR: Special partition interval values from old pg_partman versions (monthly) are no longer supported. Please use a supported interval time value from core PostgreSQL (https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-INTERVAL-INPUT)
db_plum_lemon=# SELECT partman.create_parent('bn_core.tb_audit_info', 'created', 'native', 'monthly',p_start_partition := '2023-02-01', p_premake := 3);
ERROR: monthly is not a valid partitioning type for pg_partman
CONTEXT: PL/pgSQL function partman.create_parent(text,text,text,text,text,integer,text,boolean,text,text[],text,boolean,text) line 111 at RAISE
DETAIL:
HINT:
CONTEXT: PL/pgSQL function partman.create_parent(text,text,text,text,text,integer,text,boolean,text,text[],text,boolean,text) line 629 at RAISE
db_plum_lemon=# SELECT partman.create_parent(p_parent_table:='bn_core.tb_audit_info', p_control:='created', p_type:='range', p_interval:='monthly',p_start_partition := '2023-02-01', p_premake := 3);
ERROR: Special partition interval values from old pg_partman versions (monthly) are no longer supported. Please use a supported interval time value from core PostgreSQL (https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-INTERVAL-INPUT)
CONTEXT: PL/pgSQL function partman.create_parent(text,text,text,text,text,integer,text,boolean,text,text[],text,boolean,text) line 74 at RAISE
DETAIL:
HINT:
CONTEXT: PL/pgSQL function partman.create_parent(text,text,text,text,text,integer,text,boolean,text,text[],text,boolean,text) line 629 at RAISE
从这句话中,ERROR: Special partition interval values from old pg_partman versions (monthly) are no longer supported
大概是版本 pg_partman 5.0不支持 monthly 这种写法。 我们只能上官网才查看一下最近的函数定义语法:
https://access.crunchydata.com/documentation/pg-partman/5.0.0/pg_partman/index.html
函数create_parent的参数p_interval 改成了 PG 原生的interval 的写法
源于PG原生的interval的写法可以参考:https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-INTERVAL-INPUT
除了参数 p_interval 的变化,我们可以看到pg_partman5.0 only support native 声明式的分区方式, 摒弃了陈旧的trigger 的方式的分区。
okay。 我们总结创建分区的命令是只要影响的2个参数发生了改变:
摒弃了参数p_type
修改了p_interval 参数写法 改为pg 原生的 interval 写法
old pg_partman 4.7 version:
我们pg_partman 5.0 创建一个测试分区表试一下:
db_plum_lemon=# create table t_range_month(id int, created timestamp not null) partition by range(created);
CREATE TABLE
调用PG_PARTNMAN 的函数创建分区:
db_plum_lemon=# select partman.create_parent(p_parent_table:='public.t_range_month', p_control:='created', p_type:='range', p_interval:='1 month',p_start_partition := '2024-01-01', p_premake := 3);
create_parent
---------------
t
(1 row)
db_plum_lemon=# select partman.reapply_privileges('public.t_range_month');
reapply_privileges
--------------------
(1 row)
最后我们验证一下创建分区个数:
db_plum_lemon=# \d+ public.t_range_month
Partitioned table "public.t_range_month"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
---------+-----------------------------+-----------+----------+---------+---------+--------------+-------------
id | integer | | | | plain | |
created | timestamp without time zone | | not null | | plain | |
Partition key: RANGE (created)
Partitions: t_range_month_p20240101 FOR VALUES FROM ('2024-01-01 00:00:00') TO ('2024-02-01 00:00:00'),
t_range_month_p20240201 FOR VALUES FROM ('2024-02-01 00:00:00') TO ('2024-03-01 00:00:00'),
t_range_month_p20240301 FOR VALUES FROM ('2024-03-01 00:00:00') TO ('2024-04-01 00:00:00'),
t_range_month_p20240401 FOR VALUES FROM ('2024-04-01 00:00:00') TO ('2024-05-01 00:00:00'),
t_range_month_p20240501 FOR VALUES FROM ('2024-05-01 00:00:00') TO ('2024-06-01 00:00:00'),
t_range_month_default DEFAULT
最后关于pg_partman 5.0的变更细节可以参考 github的release note:https://github.com/pgpartman/pg_partman/releases/tag/v5.0.1
这里需要重点关注一下 : BREAKING CHANGES
极简单的翻译总结了一下:
1.取消了对trigger 类型的分区支持,目前支持声明式的分区方式。5.0.1目前只能支持 range的分区类型,其他的分区方式的支持还在开发中,
2.许多函数的参数和命名发生了变化,分区配置表part_config和part_config_sub的元数据列同样进行了一些改变
3.如果有大版本的插件升级,需要注意对象权限的问题
4.之前指定分区时间间隔的方式发生了改变, 之前的weekly,hourly,daily不在支持,而是采用PG原生的interval的方式指定。
5.插件pg_partman5.0版本只能支持 pg14 以上的版本
6.由于目前最低支持PG14版本,取消了对事务中的语句 ALTER SUBSCRIPTION … REFRESH PUBLICATION的支持。
7.当创建新的分区的时候,增加了对分区键是否为空的强制验证。
Have a fun 😃 !