如何将Oracle数据库的普通表转换成分区表
2008-11-10 12:58:33 来源:WEB开发网PL/SQL 过程已成功完成。
SQL> EXEC dbms_redefinition.sync_interim_table(‘USER’, 'T', 'T_NEW')
现在,将中间表与原始表同步。(仅当要对表 T 进行更新时才需要执行该操作。)
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER’, 'T', 'T_NEW');
PL/SQL 过程已成功完成。
如果重组织失败,那么你就必须采取特殊的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。
DBMS_REDEFINITION.ABORT_REDEF_TABLE过程有三个参数,即用户(schema)、原始表格(original table name)名称以及持有表格名称(holding table name)。它“出栈”并允许你开始重组织表格。
SQL> SELECT COUNT(*) FROM T;
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
需要说明的是完成后,原表和中间表的结构也同时进行了交换,并且中间表里面有原表的数据备份。
优点:
保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。
不足:实现上比上面两种略显复杂,适用于各种情况。
然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制:
你必须有足以维护两份表格拷贝的空间。
你不能更改主键栏。
表格必须有主键。
必须在同一个大纲中进行表格重定义。
在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。
表格不能包含LONG、BFILE以及用户类型(UDT)。
不能重定义链表(clustered tables)。
不能在SYS和SYSTEM大纲中重定义表格。
不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。
不能在重定义过程中进行横向分集(horizontal subsetting)。
更多精彩
赞助商链接