Oracle9i在线表格重定义来组织表格

文章作者 100test 发表时间 2007:03:14 14:01:11
来源 100Test.Com百考试题网


在Oracle9i出现之前,你只能通过导出和导入的方式来进行表格重定义,因此表格重定义的过程是一个离线过程。甚至在线变化(“ALTER TABLE ADD NEW_COL NUMBER(3)”)也会导致独占性死锁(exclusive locks),这就需要在DDL完成之前防止所有DML(插入、更新)的运行。

为了解决这个问题,Oracle9i在其DBMS_REDEFINITION软件包中引入了在线表格重定义功能。有了DBMS_REDEFINITION软件包,你就可以:

1.拷贝表格(用CTAS)。

2.创建表格的快照(snapshot)。

3.把重定义表格的过程中所发生的变化进行排队。

4.并用变化队列来同步重定义后的表格。

这个特性对24/7Oracle数据库来说非常重要,这是由于DBA现在可以在保持表格的可更新性的同时重新组织表格的结构。

我们以下面的脚本为例来说明重新组织表格结构的完整过程。

  

  exec dbms_redefinition.abort_redef_table(PUBS,TITLES,TITLES2).

  alter table titles add constraint pk_titles primary key (title_id).

  

  exec dbms_redefinition.can_redef_table(PUBS,TITLES).

  

  create table titles2

  as

  0select * from titles.

  

  exec dbms_redefinition.start_redef_table(PUBS,TITLES,TITLES2,

title_id title_id,title title,type type,

pub_id pub_id,price price,advance advance,

royalty*1.1 royalty,ytd_sales ytd_sales,notes notes,pubdate pubdate).

  

  exec dbms_redefinition.sync_interim_table(PUBS,TITLES,TITLES2).

  exec dbms_redefinition.finish_redef_table(PUBS,TITLES,TITLES2).

  

  0drop table titles2.
  

如果重组织失败,那么你就必须采取特殊的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。

DBMS_REDEFINITION.ABORT_REDEF_TABLE过程有三个参数,即大纲(schema)、原始表格(original table name)名称以及持有表格名称(holding table name)。它“出栈”并允许你开始重组织表格。

  

  dbms_redefinition.abort_redef_table(PUBS,TITLES,TITLES2).
  

然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制。

你必须有足以维护两份表格拷贝的空间。

你不能更改主键栏。

表格必须有主键。

必须在同一个大纲中进行表格重定义。

在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。

表格不能包含LONG、BFILE以及用户类型(UDT)。

不能重定义链表(clustered tables)。

不能在SYS和SYSTEM大纲中重定义表格。

不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。

不能在重定义过程中进行横向分集(horizontal subsetting)。



相关文章


Oracle数据操作和控制语言详解(10)
Oracle中捕获问题SQL解决CPU过渡消耗(3)
Oracle9i中利用自动撤销管理的优点
利用分段使用映射为数据库建立HTML
Oracle9i在线表格重定义来组织表格
关于Oracle数据库的性能优化心得
MSSQLServer和Oracle的常用函数对比
Oracle的imp命令导入备份数据
针对Oracle数据库的优化器详细介绍
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛