本系统有三台数据库服务器,每台上有三个节点。共十五个节点。按照道理来说,如果一个表是分区表的话,那么该表的数据会均匀的分配在这十五个节点上。但是查询结果并非如此!有的节点并没有数据,有数据的节点分配也是不均衡的。
那么就开始查找原因了,首先看检查数据的相关配置问题,这个就是公司专门的人员来做的了。小白不懂这个。
看看建表的时候是怎么建的吧。
随便找了几个大表,立马找出来问题所在。
建表时的PARTITIONING KEY有问题,是随随便便找的字段进行分区的,这样显然是有问题的。
正确的分区键应该是:字段组合能唯一确定一条数据。这样的分区键才是正确的做法。
那么就只能重新建表,清理表了。
完整的操作过程如下:
【1】记录一下改表有多少数据量,给需要更改的表先换个表名
【2】重建改表
【3】将表数据导入到重建的表中,数据量多的可以分段load。
【4】清除表的冗余空间
【5】千万不要立刻删除temp里面的表数据,要先查看导入的表数据量和记录的量是否一致!!!
【6】检查无误后,删除temp里面的表数据,并清除temp表的冗余空间,最后删除temp表。过程结束
--给表名换个名字
rename table 需要重建的表名 to 需要重建的表名_TEMP@
CREATE TABLE "schema名"."需要重建的表名"
(你的表字段
你的表字段
......
)organize by column
IN "表空间"
--分布主键,这里组合需是唯一确定一条数据
PARTITIONING KEY
(code1,
code2,
code3,
...
) USING HASHING@
COMMENT ON "schema名"."需要重建的表名"
(表字段注释
......
)@
--导入数据到表中, 数据多的可以分段导入
CALL SYSPROC.ADMIN_CMD('LOAD FROM (select * from 需要重建的表名_TEMP where year_week >= 201914 AND year_week <= 201918) OF CURSOR INSERT INTO schema名.需要重建的表名 NONRECOVERABLE')@
CALL SYSPROC.ADMIN_CMD('LOAD FROM (select * from 需要重建的表名_TEMP where year_week >= 201919 AND year_week <= 201922) OF CURSOR INSERT INTO schema名.需要重建的表名 NONRECOVERABLE')@
CALL SYSPROC.ADMIN_CMD('LOAD FROM (select * from 需要重建的表名_TEMP where year_week >= 201923) OF CURSOR INSERT INTO schema名.需要重建的表名 NONRECOVERABLE')@
--清理冗余空间
CALL SYSPROC.ADMIN_CMD('reorg table '||TRIM('schema名')||'.需要重建的表名 reclaim extents only allow no access')@
-- 先检查load的数据量是否正确,然后执行下列操作,慎重!!!
-- 表数据多的分段删除
--delete from 需要重建的表名_TEMP where year_week >= 201914 AND year_week <= 201918@
--delete from 需要重建的表名_TEMP where year_week >= 201919 AND year_week <= 201922@
--delete from 需要重建的表名_TEMP where year_week >= 201923@
--清理冗余空间
--CALL SYSPROC.ADMIN_CMD('reorg table '||TRIM('schema名')||'.需要重建的表名_TEMP reclaim extents only allow no access')@
--drop table schema名.需要重建的表名_TEMP@
表已经重建完毕,现在来看看表的分配是否已经均衡了,由于我是按照三个字段来分区的,所以可以查看以下结果。
每个节点都有数据,并且每个节点的数据量为1:1:1:1...。该表重建成功!
--查询数据库表是否节点分布均衡语句
SELECT DBPARTITIONNUM(字段1), DBPARTITIONNUM(字段2), COUNT(1) FROM 表名
GROUP BY DBPARTITIONNUM(字段1), DBPARTITIONNUM(字段2)
ORDER BY DBPARTITIONNUM(字段1), DBPARTITIONNUM(字段2)
--在重建表的过程中,可以进入服务器查看进行到哪个步骤了
su db2inst1
db2 list utilities show detail
由于重建表的过程中,十分消耗数据库资源,cup使用率很大,所以操作尽量在晚上使用少的情况下重建。