执行pg_partman.run_maintenance()遇默认分区约束错误求解决方案
解决pg_partman维护时默认分区数据冲突的问题
一、立即修复当前错误
1. 定位冲突数据
首先找出默认分区中属于待创建分区(示例中为2023-11)的记录:
SELECT * FROM raw.bupa_trace_resultados_default WHERE your_partition_column >= '2023-11-01 00:00:00-03' AND your_partition_column < '2023-12-01 00:00:00-03';
替换your_partition_column为实际的分区字段(如时间戳字段)。
2. 迁移冲突数据到目标分区
检查目标分区是否已存在:
SELECT tablename FROM pg_tables WHERE tablename = 'bupa_trace_resultados_p2023_11' AND schemaname = 'raw';
若分区已存在,执行数据迁移:
-- 插入数据到目标分区 INSERT INTO raw.bupa_trace_resultados_p2023_11 SELECT * FROM raw.bupa_trace_resultados_default WHERE your_partition_column >= '2023-11-01 00:00:00-03' AND your_partition_column < '2023-12-01 00:00:00-03'; -- 验证数据量匹配(删除前必做) SELECT COUNT(*) FROM raw.bupa_trace_resultados_default WHERE your_partition_column >= '2023-11-01 00:00:00-03' AND your_partition_column < '2023-12-01 00:00:00-03'; SELECT COUNT(*) FROM raw.bupa_trace_resultados_p2023_11; -- 删除默认分区中的冲突数据 DELETE FROM raw.bupa_trace_resultados_default WHERE your_partition_column >= '2023-11-01 00:00:00-03' AND your_partition_column < '2023-12-01 00:00:00-03';
3. 重新执行维护
现在可以正常运行pg_partman维护:
SELECT pg_partman.run_maintenance('raw.bupa_trace_resultados');
二、配置自动处理(避免未来重复报错)
1. 更新pg_partman配置
开启自动数据迁移功能:
UPDATE partman.part_config SET move_data = true, automatic_maintenance = 'on' WHERE parent_table = 'raw.bupa_trace_resultados';
2. 定期执行数据迁移+维护
使用pg_cron(或系统cron)调度任务,先迁移默认分区数据,再执行维护:
-- 示例:每天凌晨2点执行 SELECT cron.schedule('daily-partman-maintenance', '0 2 * * *', $$ -- 分批迁移默认分区数据到对应分区(避免锁表) SELECT pg_partman.partition_data('raw.bupa_trace_resultados_default', p_batch_size := 1000, p_batch_count := 100); -- 执行分区维护 SELECT pg_partman.run_maintenance('raw.bupa_trace_resultados'); $$);
p_batch_size:每批迁移的行数p_batch_count:最大批次数,可根据数据量调整
内容的提问来源于stack exchange,提问作者Luis Riquelme
相关产品推荐
相关产品推荐

