使用在线重定义改变表的所在表空间

通常情况下,在线改变一个表的定义信息是很困难的。例如,当需要在不影响应用使用的情况下,将表从一个表空间迁至另一个表空间上。如果使用ALTER TABLE命令,则会影响数据的可用性。此时我们就需要用到在线重定义技术,Oracle 9i以上的版本提供了DBMS_REDEFINITION这个包。
现在debugo用户的t表在下TBS_MSSM表空间下,需要迁移到TBS_ASSM表空间下:

验证是否满足基于主键的在线定义要求:

执行成功则满足在线重定义要求。

创建临时中间表:

启用在线重定义

这时候发现多了一个MLOG$_的段,这是DBMS_REDEFINITION建立了物化视图日志,说明Oracle用了物化视图功能来实现在线重定义的功能。
拷贝依赖对象

这时候往原表中插入一些数据,来模拟正常的业务。

下面的语句可以用来将物化视图日志刷新到新表中,避免在最后finish_redef_table时间过长。

最后使用finish_redef_table来将两个表的名互换,以实现功能重定义的功能。原表更名为了中间表INT_T,可以Drop掉了。

验证数据是否完整:

改变相关索引的表空间还需要手工来move+rebuild。

^^

Reference:
Secooler’s Blog – http://space.itpub.net/519536/viewspace-629973
Administrator’s Guide – Redefining Tables Online – http://docs.oracle.com/cd/B19306_01/server.102/b14231/tables.htm#sthref2335

Posted in Database, Oracle.