GaussDB分区表DQL/DML业务报错调试
问题现象
使用分区表进行DQL/DML业务,出现业务报错。
原因分析
导致分区表DQL/DML业务报错的原因有很多,需要根据具体的报错内容和报错的业务模型,来判断属于哪些场景。
这里列出一些常见的报错场景:
- 开启行迁移开关后,并发UPDATE/DELETE报错
- 关闭行迁移开关后,跨分区更新导致的报错
- 插入数据无法路由到已有分区导致的报错
处理方法
判断是否为开启行迁移开关导致的并发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业务可能会报错。原因如下:
UPDATE和DELETE操作对于旧数据都是标记为已删除。在打开行迁移开关情况下,如果更新分区键时,导致了跨分区更新,内核会把旧分区中旧数据标记为已删除,在新分区中新增加一条数据,无法通过旧数据找到新数据。
在UPDATE和UPDATE并发、DELETE和DELETE并发、UPDATE和DELETE并发三个并发场景下,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。
- 对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。
- 如果第一个操作是UPDATE,第二个操作能成功找到最新的数据,之后对新数据操作。
- 如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。
- 对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。
- 如果第一个操作是UPDATE,由于新数据在新分区中,第二个操作不能成功找到最新的数据,就无法操作,之后会报错。
- 如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,但无法判断删除旧数据的操作源于UPDATE还是DELETE。如果是UPDATE,报错处理。如果是DELETE,终止操作,为了保持数据的正确性,同样报错处理。
处理方法
如果业务明确不存在跨分区更新分区键的业务,可以关闭关闭行迁移开关。
如果业务确实存在跨分区更新分区键的业务,需要串行执行业务才能解决问题;或者考虑更换分区键。
判断是否为关闭行迁移开关导致的跨分区更新报错
报错场景
如果业务报错为以下场景,则说明为关闭行迁移开关导致的跨分区更新报错。
ERROR: fail to update partitioned table "t1" DETAIL: disable row movement
原因分析
关闭行迁移开关后,如果业务试图将数据从一个分区更新到另一个分区,则业务会抛出报错。
处理方法
如果业务确实存在跨分区更新分区键的业务,可以考虑打开行迁移开关,但需考虑是否可能会存在并发报错场景;或者考虑更换分区键。
判断是否为插入数据无法路由到已有分区导致的报错
报错场景
如果业务报错为以下场景,则说明为插入数据无法路由到已有分区导致的报错。
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);
处理方法
如果是分区定义不合理导致的业务异常,需要重新设计分区结构。可以使用分区DDL命令,比如ADD分区、SPLIT分区、MERGE分区等来调整分区结构。
如果是分区键类型设计不合理导致的比较异常,目前不支持修改分区键所在列的类型,需要重新创建分区表。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新
摘要:HyG图计算引擎采用CSR格式来存储图的拓扑信息,CSR格式可以将稀疏矩阵的存储空间压缩,进而大大降低图的存储开销,同时具备访问效率高、格式易转化等优点。 本文分享自华为云社区《CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新》,作者: π 。 HyG图计算引擎采用CSR格式来存储图的拓扑信息,CSR格式可以将稀疏矩阵的存储空间压缩,进而大大降低图的存储开销,同时具备访问效率高、格式易转化等优点。利用CSR + 列存(parquet格式)的组合,HyG获得了很高的图访问性能。但是,对于数据需要增量更新的场景,CSR的更新非常困难,可能会导致大量的数据复制和移动,进而影响系统性能。HyG对传统CSR更新进行了一系列优化,实现了高效的数据更新。 什么是CSR格式? CSR格式是一种常用的稀疏矩阵存储格式,它将稀疏矩阵以三个数组的形式存储。具体来说,CSR格式使用 values、column indices和row offsets三个数组来表示稀疏矩阵。 定义NNZ(Num-non-zero)为矩阵M中非0元素的个数。 第一个数组为values数组。其中,values数组的长...
- 下一篇
我用 AI 为 3800 年前的爱情画了套漫画
我叫 April,99 年的白羊座女生。我是 KodeRover 产品运营团队的最新成员。加入公司恰逢我们的云原生软件工程平台产品 Zadig 开源两年,经过近两年的发展,Zadig 已经在国内 2000 多家企业深度使用,为软件工程师们所热爱。岭南以北的朋友们亲切地称我们“咋滴啦”,广州的朋友们用粤式普通话发音为“咋滴鸡”,其实发啥音都可以。Zadig 是 18 世纪法国启蒙作家伏尔泰笔下同名小说中虚构的单词和人名,虽然是虚构,但 Zadig 一书不仅在当时具有重要的社会意义,同时更是西方现代侦探小说的起源。小说描述了 3800年前古巴比伦的一位叫“Zadig" 的王子,英俊无比、正直善良、充满智慧。虽然出生王室,但一生坎坷,可他坚持本心,追寻真理,最终被大家推选为巴比伦之王,并找到了一生的真爱。这个故事感动了无数人,甚至被著名翻译家傅雷翻译成中文传到中国。故事跌宕起伏、画面感十足,借着 AIGC 的爆火,我突发奇想,决定用 AI 重现 3800 年前 Zadig 的英俊和几乎极客般的浪漫。经过近一周的学习和打磨,我终于做出了人生中的第一套漫画。所有图片全部由人工智能文本生成图像程序...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19