GaussDB分区表DQL/DML业务报错调试

这篇具有很好参考价值的文章主要介绍了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并发三个并发场景下,如果并发操作同一行数据时,数据跨分区和非跨分区结果有不同的行为。

  1. 对于数据非跨分区结果,第一个操作执行完后,第二个操作不会报错。
    • 如果第一个操作是UPDATE,第二个操作能成功找到最新的数据,之后对新数据操作。
    • 如果第一个操作是DELETE,第二个操作看到当前数据已经被删除而且找不到最新数据,就终止操作。
  2. 对于数据跨分区结果,第一个操作执行完后,第二个操作会报错。
    • 如果第一个操作是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分区等来调整分区结构。
如果是分区键类型设计不合理导致的比较异常,目前不支持修改分区键所在列的类型,需要重新创建分区表。文章来源地址https://www.toymoban.com/news/detail-500209.html

到了这里,关于GaussDB分区表DQL/DML业务报错调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive 分区表 (Partitioned Tables) 『 创建分区表 | CRUD分区 | 修复分区 | 数据导入(静态分区、动态分区) | 查询数据/表结构』

    条件:假如现有一个角色表 t_all_hero ,该表中有6个清洗干净的互不干扰的数据文件:射手、坦克、战士、法师、刺客、辅助 要求:查找出名字为射手且生命值大于6000的角色人数 惯性解决方法:按照MySQL思维很容易想到 问:如何提高效率?这样虽然能够解决问题,但是由于要

    2024年02月04日
    浏览(78)
  • mysql分区表:日期分区

    1.创建分区表 2.查看分区 3.添加分区 4.存储过程:分区删除与创建 5.事件定时 6.触发器设计:子表每插入一行,总表获得一行 7.创建索引 8.添加枚举型字段

    2024年02月16日
    浏览(53)
  • hive分区表 静态分区和动态分区

    现有数据文件 data_file 如下: 2023-08-01,Product A,100.0 2023-08-05,Product B,150.0 2023-08-10,Product A,200.0 需要手动指定分区 现有源数据表如下: CREATE TABLE sales_source (     sale_date STRING,     product STRING,     amount DOUBLE ); INSERT INTO sales_source VALUES     (\\\'2023-08-01\\\', \\\'Product A\\\', 100.0),     (\\\'2023-08-

    2024年02月10日
    浏览(52)
  • Hive分区表实战 - 多分区字段

    本实战教程通过一系列Hive SQL操作,演示了如何在大数据环境下创建具有省市分区的大学表,并从本地文件系统加载不同地区的学校数据到对应分区。首先,创建名为 school 的数据库并切换至该数据库;接着,在数据库中定义一个名为 university 的分区表,其结构包括ID和名称两

    2024年01月15日
    浏览(49)
  • mysql分区表 -列表分区(list prtition)

    示例,创建一张员工表按照employee_id进行列表分区: 查询0号分区: select * from employees partition(p0); select * from employees partition(p1); select * from employees partition(p0,p1); 和range分区一样,可以使用alter table … add/drop partition新增/删除分区: ALTER TABLE employees ADD PARTITION(PARTITION p2 VALUES IN

    2024年02月16日
    浏览(51)
  • HIVE创建分区表

    partitioned by ( c2 string ) # 创建分区 c1跟c2都是字段,但是创建的时候不能写在t2里面,只能写在分区里面(同时select查询的时候,c2的字段也要写在最后面) 要加载数据到分区表,只需在原来的加载数据的语句上增加partition,同时指定分区的字段值即可。 注意:当你退出

    2024年02月15日
    浏览(44)
  • 用好 mysql 分区表

    为了保证MySQL的性能,我们都建议mysql单表不要太大,也经常有人问我这样的问题,整体来说呢,建议是:单表小于2G,记录数小于1千万,十库百表。如果但行记录数非常小,那么记录数可以再偏大些,反之,可能记录数到百万级别就开始变慢了。 那么,业务量在增长,数据

    2024年02月08日
    浏览(42)
  • MySQL 分区表设计

    1、分区表设计方案 当设计 MySQL 分区表时,需要考虑以下几个方面:分区策略、分区字段、分区数量和分区函数。下面是一个详细的示例,展示了如何设计和执行分区表的增删改查操作。 设计分区表: 考虑一个订单表的例子,我们可以按照订单创建时间对表进行范围分区。

    2024年02月07日
    浏览(52)
  • HiveSQL分区的作用及创建分区表案例演示(图解)

    目录 一、分区的作用 二、单级分区表 1.准备工作 2.创建数据表 3.查询数据 4.创建分区数据表 5.添加数据 5.1添加方式1:静态分区(需要指定分区字段和值) 5.2添加方式2:动态分区(只需指定分区字段,分区字段相同的数据自动分配到同一个区) 三、多级分区表 1.准备工作 2.创建分区

    2024年01月17日
    浏览(55)
  • oracle分区表创建(自动按年、月、日分区)实战

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。 oracle 11g 支持自动分区,不过得在创建表时就设置好分区。 如果已经存在的表需要改分区表,就需要将

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包