0
点赞
收藏
分享

微信扫一扫

非分区表转换成分区表以及注意事项

奔跑的酆 2022-07-12 阅读 84

有时候刚开始设计的时候没考虑到数据归档。数据归档不是简单的导出delete。因为一般我们的数据库都是delete不释放空间。而我们一般数据库遇到空间不足,就不得不面对这个问题。当然也可以做碎片整理的空间回收。我不太喜欢这样,尤其大的表的时候。MySQL一旦超过100G的,在线环境我都不敢去做。Oracle的在线回收我做过20T的表,碎片800G,回收了一次做了55个小时(不停机)


我个人觉得最好的方式是采用分区,至于是迁移分区还是归档分区都好说。一般都是截断分区这样操作,很快。但是如果一个表之前没有做分区怎么办?


我们举例


create table b (id int ,a varchar2(10),time date);普通堆表


模拟5条数据


insert into b values (1,'a',sysdate-120);


insert into b values (2,'b',sysdate-90);


insert into b values (3,'c',sysdate-60);


insert into b values (4,'d',sysdate-30);


insert into b values (5,'e',sysdate);


 


一般来说我们都要使用到时间。所以时间建立索引。


create index b1 on b (time);


 


一般表都有主键,在Oracle中应该使用业务单据号来作为主键,在MySQL中用ID自增无业务含义。在PG中按照Oracle的来就行。


 


Alter table b add constraint pkb primary key(id);


为B表增加主键,这里注意一定要是自己命名的而不是数据库自己命令的。因为正常主从都没有问题,但是有OGG的场景这样的话就是一个坑。后面我来讲为什么。


 


ALTER TABLE b MODIFY


PARTITION BY RANGE (time)


(


PARTITION b1 VALUES LESS THAN (TO_DATE ('2022-03-01', 'YYYY-MM-DD')),


PARTITION b2 VALUES LESS THAN (TO_DATE ('2022-04-01', 'YYYY-MM-DD')),


PARTITION b3 VALUES LESS THAN (TO_DATE ('2022-05-01', 'YYYY-MM-DD')),


PARTITION b4 VALUES LESS THAN (TO_DATE ('2022-06-01', 'YYYY-MM-DD')),


PARTITION b5 VALUES LESS THAN (TO_DATE ('2022-07-01', 'YYYY-MM-DD'))


) online


UPDATE INDEXES


(


pkb GLOBAL,


b1 LOCAL


);


这个就是在线把非分区表转换成分别表的命令。注意红色部分我这里指定了主键名,如果是自动的那么就是自动的名字。上面讲的坑就在这里,因为在OGG场景下,目标端也就是下游数据库的自动的名字和源端上游不一样。执行这个命令时候就会引发OGG的中断。


 


那么这个是数据库的问题还是OGG的问题?我觉得都不是,是熟悉产品的问题。执行完毕以后看到表已经变成分区的了。

举报

相关推荐

0 条评论