GaussDB分区表DQL/DML业务报错

举报
GaussDB 数据库 发表于 2025/12/09 11:09:31 2025/12/09
【摘要】 故障现象使用分区表进行DQL/DML业务,出现业务报错。故障原因导致分区表DQL/DML业务报错的原因有很多,需要根据具体的报错内容和报错的业务模型,来判断属于哪些场景。常见的可能原因有以下:开启行迁移开关后,并发UPDATE/DELETE报错。关闭行迁移开关后,跨分区更新导致的报错。插入数据无法路由到已有分区导致的报错。处理方法步骤 1     判断是否为开启行迁移开关导致的并发UPDAT...
  • 故障现象

使用分区表进行DQL/DML业务,出现业务报错。

  • 故障原因

导致分区表DQL/DML业务报错的原因有很多,需要根据具体的报错内容和报错的业务模型,来判断属于哪些场景。

常见的可能原因有以下:

  1. 开启行迁移开关后,并发UPDATE/DELETE报错。
  2. 关闭行迁移开关后,跨分区更新导致的报错。
  3. 插入数据无法路由到已有分区导致的报错。
  • 处理方法

步骤 1     判断是否为开启行迁移开关导致的并发UPDATE/DELETE报错

报错场景:

如果业务报错为以下两种场景之一,则说明为开启行迁移开关导致的并发UPDATE/DELETE报错。

--UPDATE业务报错
ERROR:  partition table update conflict
DETAIL:  disable row movement of table can avoid this conflict
--DELETE业务报错
ERROR:  partition table delete conflict
DETAIL:  disable row movement of table can avoid this conflict

原因分析:

开启行迁移开关后,允许通过更新分区键的方式,将数据从一个分区更新到另一个分区;关闭行迁移开关后,如果业务试图将数据从一个分区更新到另一个分区,则业务会抛出报错。

开启/关闭行迁移开关的方法是创建分区表时申明ENABLE/DISABLE ROW MOVEMENT子句。也可以通过ALTER TABLE命令来修改:

--开启分区表t1的行迁移开关
ALTER TABLE t1 ENABLE ROW MOVEMENT;
 
--
关闭分区表t1的行迁移开关
ALTER TABLE t1 DISABLE ROW MOVEMENT;

开启行迁移开关后,并发UPDATE/DELETE业务可能会报错。原因如下:

UPDATEDELETE操作对于旧数据都是标记为已删除。在打开行迁移开关情况下,如果更新分区键时,导致了跨分区更新,内核会把旧分区中旧数据标记为已删除,在新分区中新增加一条数据,无法通过旧数据找到新数据。

UPDATEUPDATE并发、DELETEDELETE并发、UPDATEDELETE并发三个并发场景下,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。

a.  对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。

如果第一个操作是UPDATE,第二个操作能成功找到最新的数据,之后对新数据操作。

如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。

b.  对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。

如果第一个操作是UPDATE,由于新数据在新分区中,第二个操作不能成功找到最新的数据,就无法操作,之后会报错。

如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,但无法判断删除旧数据的操作源于UPDATE还是DELETE。如果是UPDATE,报错处理。如果是DELETE,终止操作,为了保持数据的正确性,同样报错处理。

处理方法:

如果业务明确不存在跨分区更新分区键的业务,可以关闭关闭行迁移开关。

如果业务确实存在跨分区更新分区键的业务,需要串行执行业务才能解决问题;或者考虑更换分区键。

步骤 2     判断是否为关闭行迁移开关导致的跨分区更新报错

报错场景

如果业务报错为以下场景,则说明为关闭行迁移开关导致的跨分区更新报错。

ERROR:  fail to update partitioned table "t1"
DETAIL:  disable row movement

原因分析

关闭行迁移开关后,如果业务试图将数据从一个分区更新到另一个分区,则业务会抛出报错。

处理方法

如果业务确实存在跨分区更新分区键的业务,可以考虑打开行迁移开关,但需考虑是否可能会存在并发报错场景;或者考虑更换分区键。

步骤 3     判断是否为插入数据无法路由到已有分区导致的报错

报错场景:

如果业务报错为以下场景,则说明为插入数据无法路由到已有分区导致的报错。

ERROR:  inserted partition key does not map to any table partitiont

原因分析:

导致这种场景出现的原因一般有两种,一种是因为分区定义不合理导致的业务异常,另一种是分区键类型设计不合理导致的比较异常。

分区定义不合理是指业务定义的分区结构无法满足全量表数据的匹配,有部分数据不属于任一已有分区。比如下面的业务就会抛出这种报错:

CREATE TABLE t1 (
 c1 integer,
 c2 integer
)
PARTITION BY RANGE (c1)
(
 PARTITION p1 VALUES LESS THAN (100),
 PARTITION p2 VALUES LESS THAN (200)
)
DISABLE ROW MOVEMENT;
INSERT INTO t1 VALUES(1,1),(201,1);

分区键类型设计不合理是指使用了不合理的分区键类型,导致数据的比较规则并不符合用户预期场景。比如按照字典序规则,字符串'9''100'大。

下面的业务就会抛出这种报错:

CREATE TABLE t1 (
 c1 varchar,
 c2 integer
)
PARTITION BY RANGE (c1)
(
 PARTITION p1 VALUES LESS THAN ('100'),
 PARTITION p2 VALUES LESS THAN ('200')
)
DISABLE ROW MOVEMENT;
INSERT INTO t1 VALUES('9',1);

步骤 4     如果是分区定义不合理导致的业务异常,需要重新设计分区结构。可以使用分区DDL命令,比如ADD分区、SPLIT分区、MERGE分区等来调整分区结构。

步骤 5     如果是分区键类型设计不合理导致的比较异常,目前不支持修改分区键所在列的类型,需要重新创建分区表。

----结束

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。