shrink space分两个阶段:
1)通过把segment后面的数据delete,然后insert到segment的前面,这个操作的事务单位比较小,在这个过程中即使把进程取消,也不会有问题下次可以继续上一次的操作。而不是很多人理解的,取消掉后,会回滚之前的操作。由于这个阶段的事务单位比较小,因此取消后,只会回滚此次没有提交掉的事务。
During segment shrink, data will be moved as part of the compaction phase. During
compaction locks will be held on individual rows and/or blocks containing the data.
This will cause the concurrent DMLs like updates and deletes to serialize on the
locks. The compaction will be done in units of smaller transactions, so the availability
of the object will not be impacted significantly.
2)第二步就是降低高水位,这个过程要在表上加X锁,会造成所有表上的DML阻塞。一般这个过程比较短,我们可以在做这个操作前,多执行几次阶段一的操作。这样能保证这个时间足够的小。
后记:大表即使第一个操作做了N遍,第二个操作依然会比较久,结合10046会发现,这个过程中以单块读的形式读了数据库绝大多数的块。而且降低高水位过程中会获得表上6类型的锁,因此会阻塞DML,因此SHRINK操作,也是个风险较大的操作
However during certain phases of segment shrink (when the HWM is adjusted), the segment
will have to be locked in exclusive mode.
由于这个过程中,行的rowid会变化,因此需要开启行移动alter table table_name enable row movement ;
建议对于大表,生产环境下,都采取两步操作:
1)alter table table_name shrink space compcat;-------------相当于只执行了阶段一,中间可以取消掉,下次重新来过,分多次进行,
2)alter table table_name shrink space;---------------------降低高水位,尽量放到空闲的时候做,这个时候不能取消,否则可能遭遇BUG或字典不一致。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-701961/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22034023/viewspace-701961/