oracle online系列(三):online move table

在12c之前,move table属于一个离线操作,由于TM锁不兼容会阻塞dml操作,并且move之后表上索引会变成unusable,这对于7*24小时的业务场景是不可接受的,如果想实现online move table必须要使用在线重定义来完成。而在线重定义操作步骤还是相对比较繁琐的。

为了简化online move table功能,oracle在12.1推出了move table partitions和sub-partitions online功能,并且在12.2引入了online move table去替代12c之前繁琐的在线重定义,但并不是在线重定义的所有使用场景都能替代,毕竟在线重定义功能非常强大,使用场景也非常多,比如:在线修改字段名、在线增删字段、按某个字段列排序重组表(多半是为了降低某些索引的聚簇因子)等等,online move table就无法实现。

老样子,本文也是通过测试验证来深入解析oracle是如何实现online move table的。

测试环境与对象:

第一步发起online move命令表上会立刻持有2号TM锁,之后调用ctcsoo_setup_online_op开始online操作会将表锁模式改为3号TM锁。

第二步调用ctccjt_create_journal_table函数创建JOURNAL表, JOURNAL表是一个IOT表,之后调用kkzuRmtCreate函数创建一个RMTAB_H表,该表是一个堆表,创建完成两个内部表之后,开始move表数据,并且产生表的临时段。

其中 JOURNAL表用于记录表的dml变更记录, RMTAB_H表用于记录原表与目标表记录的rowid对应关系。在后续merge JOURNAL表记录时将起到一个非常重要的作用。

在move期间测试插入9条记录删除1条数据,发现该阶段并不会构建rowid对应关系,但是会记录在 JOURNAL表中。

第三步move完成之后会调用ctcmerge函数构建rowid关联关系,RMTAB_H会比实际表少8条,因为我们刚才插入了9条数据删除了1条。

第四步调用kkzuRmtCreateINT函数创建RMTAB_I表,这是一个IOT表,其实就是从 SYS_RMTAB$$_H 中CTAS来的,这个表的作用是为了处理索引的。

第五步调用kkzuRmtDrop函数删除 SYS_RMTAB$$_H,它的使命已经完成。

第六步调用kkpocim_create_indexes_modpart,创建一个不可见索引,从10046跟踪来看,读取的是新表的segment,这是在同步表上的索引了。

第七步调用ctcmj_merge_journal开始进行merge操作。merge完成之后,修改数据字典切换表和索引,并删除老的索引和JOURNAL表

可以看到切换后索引状态正常因为是基于新的segment创建的。最后再次调用kkzuRmtDrop函数删除 RMTAB_I表

至此online move table过程结束。

此条目发表在Oracle分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注