一、普通表结构
要转换的表及索引定义语句为:
CREATE TABLE “TEST”.“TGK_001”
(
“OCCUR_TIME” TIMESTAMP(6) NOT NULL,
“CHAN_ID” NUMERIC(20,0) NOT NULL,
“STATUS” NUMERIC(10,0) NOT NULL,
“CONTENT” VARCHAR(200),
“CUSTOMIZED_GROUP” NUMERIC(10,0),
“CONFIRM_STATUS” NUMERIC(10,0),
“CONFIRM_TIME” TIMESTAMP(6),
“CONFIRM_USER_ID” NUMERIC(10,0),
“CONFIRM_NODE_ID” NUMERIC(20,0),
CONSTRAINT “PK_DMS_CHANNEL_GK” CLUSTER PRIMARY KEY(“CHAN_ID”, “OCCUR_TIME”, “STATUS”)) STORAGE(ON “OPEN_DATA”, CLUSTERBTR) ;
CREATE INDEX “INDEX_DMTEST_1” ON “ALARM”.“DMS_CHANNEL_GK”(“OCCUR_TIME” ASC) STORAGE(ON “OPEN_DATA”, CLUSTERBTR) ;
其中OCCUR_TIME字段为数据产生时间。
二、操作步骤
1、重命名索引
ALTER INDEX INDEX_DMTEST_1 RENAME TO INDEX_DMTEST_1_old;
2、创建分区表
CREATE TABLE “TEST”.“TGK_001_NEW”
(
“OCCUR_TIME” TIMESTAMP(6) NOT NULL,
“CHAN_ID” NUMERIC(20,0) NOT NULL,
“STATUS” NUMERIC(10,0) NOT NULL,
“CONTENT” VARCHAR(200),
“CUSTOMIZED_GROUP” NUMERIC(10,0),
“CONFIRM_STATUS” NUMERIC(10,0),
“CONFIRM_TIME” TIMESTAMP(6),
“CONFIRM_USER_ID” NUMERIC(10,0),
“CONFIRM_NODE_ID” NUMERIC(20,0))
PARTITION BY RANGE (OCCUR_TIME) INTERVAL (NUMTODSINTERVAL(1,‘day’))
(partition P20180928 values less than (TO_DATE(‘2017-11-09 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’)));
3、给新表增加主键和索引
alter table “TEST”.“TGK_001_NEW” add primary key(“CHAN_ID”, “OCCUR_TIME”, “STATUS”);
CREATE INDEX " INDEX_DMTEST_1" ON “TEST”.“TGK_001_NEW”(“OCCUR_TIME” ASC);
最好先加主键再加索引。
4、迁移普通表数据到分区表
方法1:适用于数据量较小的表
登陆数据库执行语句
insert into “TEST”.“TGK_001_NEW” SELECT * FROM “TEST”.“TGK_001”;
COMMIT;
方法2:数据量比较大的表建议使用DTS迁移工具进行迁移
cd /home/dmdba/dm/dmdbms/tool
./dts
图形化界面操作如下:
新建工程
新建迁移
选择DM7-DM7迁移
输入源库目的库信息(均为一区库)
选择TEST模式 选择源表为TGK_001 选择目的表为TGK001_NEW
点击下方转换,修改批量导出及提交条数并行导出勾选
点击完成 点击下一步进行迁移 等待迁移完成
5、将两种表重命名,使用分区表
(1)重命名DMS_CHANNEL_GK为历史表
ALTER TABLE TEST. TGK_001 RENAME TO TGK_001_OLD;
(2)重命名分区表为当前使用表
ALTER TABLE TEST. TGK_001_NEW RENAME TO TGK_001;
如果迁移时间过长可以通过查询时间戳,筛选出迁移时缺少的数据,INSERT到新分区表中
Insert into TEST. TGK_001 select * from TEST. TGK_001_OLD WHERE OCCUR_TIME >TO_DATE(‘2023-09-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’));
COMMIT;
6、核对分区表数据
–核对从表总数据量,看两者是否相同
select count(ID) from TEST. TGK_001;
select count(ID) from TEST.TGK_001_OLD;
7、更新统计信息
在命令窗口执行表统计信息
表上所有索引采样:
STAT 100 ON INDEX ALARM.INDEX_DMTEST_1;
全表所有列20%采样:
CALL SP_STAT_ON_TABLES_COLS(‘TEST’,’ TGK_001’,’20’);
统计完成后查看各分区数据量
SELECT
T.TABLE_NAME ,
T.PARTITION_NAME,
T.NUM_ROWS ,
T.LAST_ANALYZED
FROM
DBA_TAB_PARTITIONS T
WHERE
T.TABLE_NAME = ‘TGK_001’ ORDER BY 2;
8、清理备份表释放磁盘空间
待生产环境正常后,再执行:
drop table TEST. TGK_001_OLD;
9、可能遇到的问题
创建分区表时,关键字interval和over被屏蔽
解决方法:
修改dm.ini中EXCLUDE_RESERVED_WORDS=xxx
去掉其中的interval和over
重启数据库服务使修改生效
再在所有客户端服务器
vi /etc/dm_svc.conf
添加
KEYWORDS=(over,interval)
重启客户端生效
文章
阅读量
获赞