Oracle 高可用特性, 想必大家都知道。 这里我想记录一次工作中的小小尝试。 在线重定义19G表转化为二级分区表
系统中表 ST_MNTR_BUS_ORDER_SUM3 现在按照list 分区, 改成组合分区, 原来的数据堆积起来有4 5 个月的数据 共19G。查询很多过期数据
于是性能问题出现。 自动化清空大批过期数据,数据量始终可控。 我感觉精华部分在于分区的设计。 但是我这里不想重点说, 说说在线重定义。
上干货: 表木有主键, 哥通过rowid 完成在线重定义, 关于前骤, 自己去百度下,这里不多说。
begin
dbms_redefinition.can_redef_table('JS_ZWXN','ST_MNTR_BUS_ORDER_SUM3',Dbms_Redefinition.cons_use_rowid);
end;
begin
dbms_redefinition.start_redef_table('JS_ZWXN','ST_MNTR_BUS_ORDER_SUM3','ST_MNTR_BUS_ORDER_SUM_ONLINE',null,dbms_redefinition.cons_use_rowid);
end;
begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE('JS_ZWXN', 'ST_MNTR_BUS_ORDER_SUM3', 'ST_MNTR_BUS_ORDER_SUM_ONLINE');
end;
卡在第二步,哥看了等待事件, 多块读 每次读取11-16个数据块, 如果哥改成 每次读64,或者128 个块时间缩短到多少?? 当时哥花了15分钟。 哥是在业务不忙时候判断的, 关于如何判断哥不是通过时间 估测, 有相当精准的判断方案, IO压力, 内存压力, 每秒执行的SQL数量, 以及redo undo 综合判断得出的,
关于判断重定义时间经度, 哥不多说, 只提供两个方案 1 等待事件指向的 对象, 2 对应物化视图的总量,以及增加速度。
15分钟搞定, 不影响业务正常使用。 简单纪念, 记录之.........