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

在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
select * 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');

drop 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)。

时间: 2024-08-23 00:40:56

用Oracle9i在线表格重定义来重新组织表格的相关文章

oracle 10g在线重定义新特性:关联对象自动重命名(二)

9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义解决这个问题.如果对象是利用COPY_TABLE_DEPENDENTS创建的,那么这些关联的对象在重定义操作完成后,自动改为原始的名称.如果是手工创建的关联对象,则可以利用REGISTER_DEPENDENT_OBJECT过程,所有执行了REGISTER_DEPENDENT_OBJECT过程的关联对

oracle 10g在线重定义新特性:关联对象自动重命名(一)

10g的在线重定义解决这个问题.如果对象是利用COPY_TABLE_DEPENDENTS创建的,那么这些关联的对象在重定义操作完成后,自动改为原始的名称.如果是手工创建的关联对象,则可以利用REGISTER_DEPENDENT_OBJECT过程,所有执行了REGISTER_DEPENDENT_OBJECT过程的关联对象,都会在重定义操作完成后自动重命名. 这篇文章来看COPY_TABLE_DEPENDENTS的例子. 首先看看9i下的例子: SQL> SELECT * FROM V$VERSIO

oracle 11g的在线重定义简介

在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程,在此期间应用程序对该表的操作将失败.除了这个,如果用exp,我们也不能保证exp的时候该表的数据没有改变(除非单用户),而imp更是一个漫长的过程.为了解决这个问题,Oracle9i在其DBMS_REDEFINITION软件包中引入了在线重定义功能.这个特性对24*7的数据库系统来说非常重要,使用这个技术DBA可以在保持表允许DML语句的情况下修改结构,比如添加列

Oracle在线重定义失败后的处理

普通表在线重定义为分区表过程中报错,数值范围超过了分区限制大小,那么想要重新对表进行在线重定义需要经过哪些步骤呢?这个例子记录了处理过程: SALES@ORCL>exec dbms_redefinition.start_redef_table('SALES', 'SALES', 'SALES_P'); BEGIN dbms_redefinition.start_redef_table('SALES', 'SALES', 'SALES_P'); END; * ERROR at line 1: OR

oracle在线重定义拷贝表结构的NOT NULL约束问题

以前测试和使用的时候还真的没发现这个问题,一直认为COPY_TABLE_DEPENDENTS会自动过滤NOT NULL约束. 然而事实并发如此,如果打算使用COPY_TABLE_DEPENDENTS过程复制索引.约束以及权限等相关对象,那么在建立目标表的时候,即使是NOT NULL约束都应该避免,否则NOT NULL约束的存在会引发错误: SQL> CREATE TABLE T AS 2  SELECT ROWNUM ID, OBJECT_NAME NAME, OBJECT_TYPE TYPE

Oracle 表在线重定义之普通表到分区表

对于一个7*24的在线生产系统来说,修改表定义(DDL)时一件非常痛苦的时,因为如果直接使用 alter语句,将会在表上安放一个排他锁,也就是说在这期间所有的DML和select都无法操作,如果是一 个大表,alter的时间将很长,在这期间应用会受到很大的影响. 幸好,从9i开始,Oracle提供了在线表重定义功能,在修改表定义的同时几乎不影响DML和select语 句,因为排他锁只会在表上出现很短时间.但是在线表重定义需要额外的空间(大致等于原表空间大小 ). 在线表重定义具有如下功能: 修改

【Oracle】在线重定义表

Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作. 在线重定义表具有以下功能: 1 修改表的存储参数 2 可以将表转移到其他表空间 3 增加并行查询选项 4 增加或删除分区 5 重建表以减少碎片 6 将堆表改为索引组织表或相反的操作 7 增加或删除一个列 调用DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色和以下权限: CREATE ANY TABLE ALTER ANY TA

【Oracle】利用在线重定义的方式改变普通表为分区表

将普通表改为分区表有如下几种方式: 1 创建一个和原表一样的分区表A_NEW ;    将insert A_NEW SELECT * FROM A;    将表A 命名为A_OLD 将A_NEW 该名为A; 2 利用在先重定义的方式!也是接下来要介绍的方法! 第一种方式需要停止应用对A的写访问;使用在线重定义的方式可以对应用透明! 测试例子如下:1 创建测试表 创建普通表: @bigtab.sql --tom 的大表创建脚本! 创建中间分区PART_TAB,使用PART_TAB来替换bigtab

基于 dbms_redefinition 在线重定义表

      Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL.DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的.当然在线重定义期间,前端性能会稍微有所下降.Oracle提供的重定义包dbms_redefinition即是用与完成此操作.其实质是Oracle使用了智能物化视图及物化视图日志的方式.在对象结构重组期间,表现为一个本地对象的复制,重组期间发生的任何变化都会被刷新到最新.   1.在线重定义表的主要功