`

oracle 9i下在线重定义表【转】

阅读更多
转自:http://www.cnblogs.com/rootq/archive/2010/01/13/1646396.html

9i提供了联机重定义表的方法,可以让你在基本不影响原表的DML情况下修改表结构。

实际上,联机重定义表并不是完全的联机重定义,在最后交换表名的时候会短暂地锁定原表和中间表,但这个过程很短暂,相对于传统方法来说,这是一个进步。

/*
9i提供了联机重定义表的方法,可以让你在基本不影响原表的DML情况下修改表结构。

实际上,联机重定义表并不是完全的联机重定义,在最后交换表名的时候会短暂地锁定原表和中间表,但这个过程很短暂,相对于传统方法来说,这是一个进步。

利用联机重定义功能可以在线实现如下功能:
修改表的存储参数
移动该表到相同 Schema 下的 不同表空间内
添加并行查询支持
添加或删除分区
重建表以便减少碎片
在普通表和索引组织(index-organized)表之间互相转换
添加或删除列,重新定义列的数据类型
添加/删除索引
做一个从普通表到分区表之间的转换操作.
修改约束

需要的权限:
CREATE ANY TABLE
ALTER ANY TABLE
DROP ANY TABLE
LOCK ANY TABLE
SELECT ANY TABLE


限制条件:
·你必须有足以维护两份表格拷贝的空间。
·你不能更改主键栏。
·表格必须有主键。
·必须在同一个大纲中进行表格重定义。
·在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。
·表格不能包含LONG、BFILE以及用户类型(UDT)。
·不能重定义链表(clustered tables)。
·不能在SYS和SYSTEM大纲中重定义表格。
·不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。
·不能在重定义过程中进行横向分集(horizontal subsetting)。


基本步骤如下

第一步:利用dbms_redefinition.can_redef_table过程检查该表是否能被在线重定义。
如果这一步不抛出异常,说明该表是可以在线重定义的。

第二步:创建一个与原表类似的空表结构,用于重定义该表,这里叫做是中间表
在这里你可以定义表的新列名、新数据类型、列顺序、存储参数等。注意,为了提高效率,在这一步不要建立索引和约束。

第三步:用dbms_redefinition.start_redef_table procedure定义重构开始

这个过程将会自动执行如下操作:
1、插入所有行从原有表到中间表
2、创建MLOG$_xxx快照与快照日志,临时存储DML语句直到完成。

该过程可以输入如下参数信息
. 用户的名称
. 原表的名称
. 中间表的名称
. 原表和中间表的列的映射关系。
这个参数默认值是null,表示原表和中间表的字段按原表的顺序一一对应。但如果需要在中间表添加、删除字段,修改字段数据类型、改变字段顺序,则必须要把这个参数填写好。不同字段间用都好分隔。
作映射时,对应的字段先写原表字段,然后再写中间表的字段。
如添加字段,并改变列的数据类型:
原表 a(id int ,name varchar2(10))
中间表b(id number,new_name varchar2(10),sex int)
exec dbms_redefinition.start_redef_table procedure('suk','a','b','name new_name,id id')
或者exec dbms_redefinition.start_redef_table procedure('suk','a','b','id id,name new_name')

再如 同时添加、删除字段:
原表 a(id int ,name varchar2(10))
中间表b(id number,sex int)
exec dbms_redefinition.start_redef_table procedure('suk','a','b','id id')

映射时可以使用一些简单函数,如
exec dbms_redefinition.start_redef_table procedure('suk','a','b','to_char(id) id')

所以,如果数据量很大的话,这一步会比较慢。
第四步:调用DBMS_REDEFINITION.SYNC_INTERIM_TABLE过程同步原表与中间表的数据
这一步不是必须的,如果省略这一步,在finish_redef_table也会执行这一步骤。但我们应该把这一步放在为中间表建立索引、约束等前面,这样可以提高效率。

第五步:与原表一致,在中间表上面创建约束,索引,触发器
与原表一致(如果需要),中间表的对象权限被授予给别的对象
注意:在中间表建立外键约束时应该加上DISABLE关键字

第六步:用dbms_redefinition.finish_redef_table过程完成表的最终重定义
该过程将自动完成
. 应用快照日志中的DML到中间表
. 互换原表与中间表的名字,包括所有可能出现的数据字典
. 但是需要注意的是,并不对换约束,索引,触发器的名称,这些需要手工修改
. 删除MLOG$_XXX
. 启用原来在中间表上的外键

同时,执行这一步时,oracle会短暂地LOCK原表和中间表

第七步:删除中间表、

第八步:如果是920以上,可以利用ALTER TABLE ... RENAME CONSTRAINT ...语句来修改约束名称,如果以下版本,就只有删除并重建了,当然,如果约束名称并不重要,也就无所谓了

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


几个需要注意的地方:
. 在重定义表期间,不允许对中间表作任何DML操作
*/


--以下是一个利用9i的联机重定义表删除字段的简单过程

--原表结构
SQL> desc channel
Name Type Nullable Default Comments
------------------- -------------- -------- ------- --------
CHANNEL_ID NUMBER(16)
CHANNEL_NAME VARCHAR2(120)
PARENT_CHANNEL_ID NUMBER(16) Y
CHANNEL_URL VARCHAR2(256) Y
CHANNEL_DESCRIPTION VARCHAR2(4000) Y
STYLE_CLASS VARCHAR2(120) Y
CONFIGURE_FILE VARCHAR2(120) Y
CHANNEL_SEQUENCE NUMBER(4) Y 9999
CHANNEL_LEVEL NUMBER(2) Y
CREATE_DATE DATE SYSDATE
SELF_TAG_ID NUMBER(8) Y
CHANNEL_CODE VARCHAR2(120) Y

--创建中间表
SQL> create table channel_test as select * from channel where 1=2;

Table created

SQL> alter table channel_test drop column STYLE_CLASS;

Table altered

SQL> desc channel_test
Name Type Nullable Default Comments
------------------- -------------- -------- ------- --------
CHANNEL_ID NUMBER(16)
CHANNEL_NAME VARCHAR2(120)
PARENT_CHANNEL_ID NUMBER(16) Y
CHANNEL_URL VARCHAR2(256) Y
CHANNEL_DESCRIPTION VARCHAR2(4000) Y
CONFIGURE_FILE VARCHAR2(120) Y
CHANNEL_SEQUENCE NUMBER(4) Y
CHANNEL_LEVEL NUMBER(2) Y
CREATE_DATE DATE
SELF_TAG_ID NUMBER(8) Y
CHANNEL_CODE VARCHAR2(120) Y

--检测是否能在线重定义表
SQL> exec dbms_redefinition.can_redef_table('suk','channel');

PL/SQL procedure successfully completed

--开始重定义表
SQL> exec dbms_redefinition.start_redef_table('suk','channel','channel_test','channel_id,CHANNEL_NAME,PARENT_CHANNEL_ID,CHANNEL_URL,CHANNEL_DESCRIPTION,CONFIGURE_FILE,CHANNEL_SEQUENCE,CHANNEL_LEVEL,CREATE_DATE,SELF_TAG_ID,CHANNEL_CODE');

PL/SQL procedure successfully completed

--完成重定义表
SQL> exec dbms_redefinition.finish_redef_table('suk','channel','channel_test');

PL/SQL procedure successfully completed

--查看重定义后的表结构,可以看到表channel的结构已经改变
SQL> desc channel
Name Type Nullable Default Comments
------------------- -------------- -------- ------- --------
CHANNEL_ID NUMBER(16)
CHANNEL_NAME VARCHAR2(120)
PARENT_CHANNEL_ID NUMBER(16) Y
CHANNEL_URL VARCHAR2(256) Y
CHANNEL_DESCRIPTION VARCHAR2(4000) Y
CONFIGURE_FILE VARCHAR2(120) Y
CHANNEL_SEQUENCE NUMBER(4) Y
CHANNEL_LEVEL NUMBER(2) Y
CREATE_DATE DATE
SELF_TAG_ID NUMBER(8) Y
CHANNEL_CODE VARCHAR2(120) Y
分享到:
评论

相关推荐

    oracle 9i 新特性

    - **联机重定义表**:Oracle9i支持在线重定义表,无需停机即可进行表结构的修改,提高了系统的可用性。 除了上述特性,Oracle9i还包括其他管理特性,如增强的数据仓库功能、高级安全特性、网络性能优化等。这些新...

    Oracle 9i配套PDF教材

    3. **在线重定义**(Online Redefinition):这一特性允许用户在不中断服务的情况下对表进行结构修改,提高了数据库维护的灵活性。 4. **自动存储管理**(Automatic Storage Management, ASM):Oracle 9i引入了ASM...

    oracle9i 精简版

    9. **联机重定义(Online Redefinition)**:在不中断服务的情况下,可以在线修改表的结构,降低了系统维护的风险和停机时间。 10. **分区(Partitioning)**:对大表进行分区,提高查询和维护性能,尤其适用于大...

    精通Oracle9

    此外,它还加强了表空间和数据文件的管理,支持在线重定义表空间,使得数据库维护更加灵活。 三、性能优化 Oracle 9i在性能优化方面做出了重大改进,包括SQL优化器的增强、Automatic Workload Repository(AWR)的...

    Oracle 9i中文版基础培训教程

    Oracle 9i引入了如在线重定义(Online Redefinition)、自动存储管理(ASM)和实时应用集群(RAC),这些特性大大提升了数据库的可用性和管理效率。 通过本教程的学习,读者可以系统了解Oracle 9i的基础知识,逐步...

    oracle9i的查询优化

    ### Oracle9i的查询优化深度解析 #### 引言 Oracle9i的查询优化是数据库管理系统中的关键组件...无论是面对复杂的数据仓库查询,还是高并发的在线事务处理,Oracle9i的查询优化都能确保数据库系统稳定、高效地运行。

    Oracle9i手册

    7. **在线重定义(Online Redefinition)**:在不中断服务的情况下,可以修改表的结构,如添加或删除列,这在大型系统中尤其重要。 8. **SQL优化改进**:包括优化器统计信息的自动收集、成本基础优化器(Cost-Based...

    oracle9i310.mis.rar

    6. **联机重定义(Online Redefinition)**:允许在不影响业务的情况下在线修改表结构,提高了数据库维护的灵活性。 7. **高级安全特性**:包括细粒度审计、透明数据加密等,增强了数据安全性。 8. **性能优化**:...

    Oracle 9i 10g 编程艺术

    - **9i新特性**:包括物化视图、流复制、在线重定义等,提升数据库的可用性和性能。 - **10g新特性**:如自动存储管理(ASM)、数据泵(DB Pump)、实时应用集群(RAC)等,进一步增强了Oracle的可扩展性和高可用...

    oracle9i入门

    6. 数据仓库优化:通过星型模式的物化视图、快速重装和并行查询优化,Oracle 9i提升了数据仓库的性能。 7. 分区功能增强:9i扩展了分区功能,支持更多的分区类型,如范围、列表、哈希等,使得大型表的管理和查询...

    Oracle 9i应用COMPOSE和UNISTR创建沉音

    Oracle 9i 提供了两种功能,COMPOSE 和 UNISTR,来帮助开发者处理 Unicode 字符,特别是涉及到沉音字符(accented character)的情况。在多种语言中,沉音字符是常见的,但它们并不属于 ASCII 字符集,因此在编码时...

    oracle9iDBA.rar

    7. **在线重定义**:9i允许在线重定义索引和表,这意味着在数据操作过程中可以进行结构修改而不会影响应用程序的正常运行。 8. **高级复制**:Oracle Advanced Replication提供了多种复制模式,包括同步和异步,...

    Oracle 9i&10g编程艺术:深入数据库体系结构 中文

    ### Oracle 9i&10g编程艺术:深入数据库体系结构 #### 一、书籍概览 《Oracle 9i&10g编程艺术:深入数据库体系结构》是一本全面介绍Oracle 9i和10g数据库编程技术的专业书籍。本书不仅涵盖了Oracle数据库的基础...

Global site tag (gtag.js) - Google Analytics