postgresql11.2修改分区表中复合索引字段长度遇到的BUG

业务场景:对于range分区表,在父表中创建复合主键,修改复合主键中的非分区键字段时,会导致查询该表失败。如果想删除该表,在进行重建该表时,会导致数据库异常关闭,无法正常启动。

(一)操作系统

[root@xxx ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo
说明:操作系统系统为中标麒麟v5u4版本

(二)数据库版本

show server_version;


11.2

(三)测试表(range分区表无数据)

1.创建测试表

CREATE TABLE T_RANGE_PARTITION
(
ID varchar(10) NOT NULL,
DATATYPE NUMERIC,
TABLENAME VARCHAR(100),
TABLECOMMENT VARCHAR(200),
STARTTIME TIMESTAMP,
ENDTIME TIMESTAMP,
COL1 NUMERIC,
COL2 NUMERIC,
COL3 VARCHAR(2),
COL4 VARCHAR(2),
COL5 VARCHAR(25),
COL6 VARCHAR(50),
STORETIME TIMESTAMP DEFAULT current_timestamp(0)
)
PARTITION BY RANGE (STORETIME)
TABLESPACE SWDS_DATA_TAB_05;
2.创建复合主键
ALTER TABLE T_RANGE_PARTITION ADD CONSTRAINT PK_T_RANGE_PARTITION
PRIMARY KEY (ID,STORETIME) USING INDEX TABLESPACE SWDS_IX_TAB_01;
说明:storetime为分区键

3.创建分区
create table T_RANGE_PARTITION_2018 partition of T_RANGE_PARTITION for values from (‘2018-01-01’) to (‘2019-01-01’);
create table T_RANGE_PARTITION_2019 partition of T_RANGE_PARTITION for values from (‘2019-01-01’) to (‘2020-01-01’);
在这里插入图片描述

(四)测试场景一:将ID字段长度由varchar(10)修改为varchar(50)

1.修改字段长度
alter table T_RANGE_PARTITION alter column id type varchar(50);
2.查看修改结果
在这里插入图片描述
3.查询表失败
select * from t_range_partition;
ERROR: could not open file “pg_tblspc/16410/PG_11_201809051/16384/42306”: No such file or directory

(五)测试场景二:将ID字段长度由varchar(10)修改为varchar(5)

1.修改字段长度
alter table T_RANGE_PARTITION alter column id type varchar(5);
2.查看修改结果
在这里插入图片描述
3.查询表成功
在这里插入图片描述

(六)测试场景三:将ID字段长度由varchar(5)修改为varchar(50)

1.删除主键
ALTER TABLE T_RANGE_PARTITION DROP CONSTRAINT PK_T_RANGE_PARTITION;
在这里插入图片描述

2.修改字段长度
alter table T_RANGE_PARTITION alter column id type varchar(50);
在这里插入图片描述
3.查询表成功
在这里插入图片描述

4.添加主键
ALTER TABLE T_RANGE_PARTITION ADD CONSTRAINT PK_T_RANGE_PARTITION
PRIMARY KEY (ID,STORETIME) USING INDEX TABLESPACE SWDS_IX_TAB_01;
在这里插入图片描述

(七)测试结果

对于range分区表,在父表中创建复合主键时,修改复合主键中的非分区键字段(以ID为例子)的结果如下。
1、ID字段的长度不能改大,只能改小。
2、ID字段长度改大后,查询该表报错。
3、ID字段类型为numeric和varchar都有该问题。

(八)解决方法及步骤

以场景一为例,修改复合主键中的非分区键字段时,修改步骤如下
1、备份数据库(pg_dump或pg_basebackup)
2、删除该表上的复合主键
3、修改复合主键中非分区键字段长度
4、在该表上创建复合主键

升级postgresql数据库的版本到11.3

(九)注意事项

以场景一为例,修改完id字段长度后,查询该表报错时,采取以下措施
1、禁止对该表做drop、alter操作,会导致数据库异常关闭,无法启动。
drop table T_RANGE_PARTITION;
WARNING: AbortTransaction while in COMMIT state
ERROR: SMgrRelation hashtable corrupted
PANIC: cannot abort transaction 1822, it was already committed
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
2、对数据库进行备份(pg_dump)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值