GaussDB分区表DDL业务报错
- 故障现象
使用分区表进行分区DDL业务,出现业务报错。
- 故障原因
分区DDL操作有新增(Add)、删除(Drop)、交换(Exchange)、清空(Truncate)、分割(Split)、合并(Merge)、移动(Move)、重命名(Rename)共8种,不同的分区DDL有对应的规格限制,用户如果试图越过规格限制进行该类操作,会导致业务报错。
- 处理方法
在《特性指南》中“分区表 > 分区表运维管理”章节列出了分区DDL操作的使用方法和注意事项,这里给出具体的规格限制,按照不同的规格限制进行排查处理。
新增分区
− 新增分区的名称不能与该分区表已有分区的名称相同。
− 若新增RANGE分区,新增分区的分区键值要大于分区表中最后一个范围分区的上边界。
− 若新增LIST分区,新增分区的分区键值不能与现有分区键值重复。
− 若RANGE分区表定义有MAXVALUE,或LIST分区定义有DEFAULT,无法新增分区。
− 不支持新增HASH分区。
删除分区
− 当分区表只有一个分区时,不能删除该分区。
− 不支持删除HASH分区。
− 删除分区会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
交换分区
− 执行交换分区时,可以申明WITH/WITHOUT VALIDATION,表明是否校验普通表数据满足目标分区的分区键约束规则(默认开启校验)。
− 如果申明WITHOUT VALIDATION,且交换的数据不完全属于目标分区,会导致分区表后续业务出现不可预知的后果。
− 可以申明WITH VALIDATION VERBOSE,数据库会将不满足目标分区的分区键约束规则的数据,插入到分区表的其他分区中,最后再进行普通表与目标分区的交换。
− 进行交换的普通表和分区的列数目、列结构、列信息需要完全一致,包括已被删除的列也需严格一致。
− 进行交换的普通表索引和分区表Local索引个数相同,且对应索引的信息严格一致。
− 进行交换的普通表索引和分区表压缩信息、表约束严格一致。
− 进行交换的普通表索引和分区表不可以有动态数据脱敏,行访问控制约束。
− 交换分区会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
− 不支持对二级分区表的一级分区交换分区。
清空分区
− 清空分区会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
分割分区
− 分割后的新分区,可以与源分区名字相同,比如将分区p1分割为p1,p2。但数据库不会将分割前后相同名的分区视为同一个分区,这会影响分割期间数据库对源分区查询行为的判断。
− 不支持分割HASH分区。
− 若指定分割点分割RANGE分区,分割点要位于正被分割分区的分区键范围内。
− 若不指定分割点分割RANGE分区,分割后的新分区必须满足分区范围定义递增的约束。
− 若指定分割点分割LIST分区,分割点必须是源分区的一个非空真子集。
− 若不指定分割点分割LIST分区,分割后的每个新分区都必须是源分区的一个非空真子集,且互不交叉。
− 分割分区会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
− 不支持对二级分区表的一级分区分割分区。
合并分区
− 对于RANGE/INTERVAL分区,源分区的范围要求连续且递增。
− 合并后的新分区,对于RANGE/INTERVAL分区,可以与最后一个源分区名字相同;对于LIST分区,可以与任一源分区名字相同。
− 如果新分区与源分区名字相同,数据库会将新分区视为对源分区的继承,这会影响合并期间数据库对源分区查询行为的判断。
− 不支持合并HASH分区。
− 合并分区会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
− 不支持对二级分区表的一级分区合并分区。
− USTORE存储引擎表不支持在事务块/存储过程中执行合并分区的操作。
- 点赞
- 收藏
- 关注作者
评论(0)