oracle 11g的在线重定义简介

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

在线重定义具有以下功能:

(1)修改表的存储参数;

(2)可以将表转移到其他表空间;

(3)在表上增加、修改或删除一列或是多列;

(4)增加并行查询选项;

(5)增加分区支持;

(6)修改分区结构;

(7)重建表以减少碎片;

(8)将堆表改为索引组织表或相反的操作;

在线重定义的方法

1.基于主键

2.基于ROWID。ROWID的方式不能用于索引组织表,而且重定义后会存在隐藏列M_ROW$$。

默认采用主键的方式。

在线重定义的一些限制

1.要求原始表和中间表在同一个方案下;

2.要求有2倍甚至是多于2倍的表空间空间;

3.如果使用主键重定义的方式,原始表上要有主键;

对于在线重定义的步骤,这里不再具体说明,我们通过一个实验来演示一下,下面是一个把普通表转换成分区表在线重定义的例子

一、首先创建用户tj,并授予能够完成在线重定义的权限和角色

SQL> create user tj identified by tj

 2  default tablespace users

 3  temporary tablespace temp

 4  quota unlimited on users;

User created.

SQL> GRANT CREATE SESSION, CREATE ANY TABLE,ALTER ANY TABLE,

 2        DROP ANY TABLE, LOCK ANY TABLE  ,SELECT ANY TABLE,

 3        CREATE ANY INDEX,CREATE ANY TRIGGER

 4  TO TJ;

Grant succeeded.

SQL> GRANT EXECUTE_CATALOG_ROLE TO TJ;

Grant succeeded.

二、使用TJ用户登录,创建表DEMO,作为在线重定义的原始表,在表上添加主键和一个索引

SQL> conn tj/tj

Connected.

SQL> create table demo as select empno,ename,sal,deptno from scott.emp;

Table created.

SQL> set linesize 120

SQL> set pagesize 60

SQL> select * from demo;

EMPNO ENAME             SAL     DEPTNO

---------- ---------- ---------- ----------

 7369 SMITH            6000         20

 7499 ALLEN            1600         30

 7521 WARD             1250         30

 7566 JONES            2975         20

 7654 MARTIN           1250         30

 7698 BLAKE            2850         30

 7782 CLARK            2450         10

 7788 SCOTT            1000         20

 7839 KING             5000         10

 7844 TURNER           1500         30

 7876 ADAMS            1100         20

 7900 JAMES             950         30

 7902 FORD             3000         20

 7934 MILLER           1300         10

14 rows selected.

SQL>  alter table demo add constraint demo_pk primary key(empno);

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-09-21 10:51:34

oracle 11g的在线重定义简介的相关文章

Oracle Online Redefinition在线重定义(上)

面对越来越多的7*24系统,运维人员进行工作可用的时间窗口变的越来越小.就在有限的时间窗口中,硬件检修.网络改造配置占据了很多时间.对数据库对象进行日常维护,越来越成为我们需要关注的问题.   进行数据重排.表分区.字段类型修改.字段增改这样的操作,在开发和测试环境上是比较容易进行的.即使数据表很大,操作耗时可能会很高,我们也能够通过一些非技术的手段赢取操作时间窗.但是对于投产系统而言,操作过程中的长时间锁定可能是业务不能接受的.这个时候,就可以考虑Oracle的一些Online操作技术.  

Oracle Online Redefinition在线重定义(中)

上篇中,我们简单地介绍了如何使用Oracle在线重定义特性进行数据表Online的结构变动操作.本篇我们从一个较复杂的案例出发,讨论复杂变化情况下如何进行Online Redefinition,以及dbms_redefinition包各个关键方法的作用.   3.一个分区表的重定义动作   我们定义一个数据表T.     SQL> create table t as select object_id, object_name, created from dba_objects; Table cr

Oracle Online Redefinition在线重定义(下)

在之前的文章中,我们看到了如何处理单表在线重定义过程.本篇我们来看一下如何进行关联表的重定义过程.   4.外键关系表重定义   我们先创建出实验数据表.     SQL> create table t_master as select owner, table_name, tablespace_name, status from dba_tables where 1=0; Table created   SQL> alter table t_master add constraint pk_

【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

Oracle表的在线重定义(一)

好处: When a table is redefined online, it is accessible to both queries and DML during much of the redefinition process.  内部机制: Typically, the table is locked in the exclusive mode only during a very small window that is independent of the size of the

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 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在线重定义拷贝表结构的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