Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
Table的学习 ②
 
    OK,今天继续学习Table的只是点。今天这内容没什么可说的,主要就是让我知道了,什么叫做联机重定义表。所谓的联机重定义,也就是在不关闭数据库的前提下,修改一些涉及到表的内部存储的特性,这个不是我们说改就能改的,所以需要Oracle提供的包才可以。
 
 
四、联机重定义表
 
    联机重定义的意义在于:
 
    ● 修改表的存储参数
    ● 将表移动到相同模式中的不同表空间
    ● 添加对并行查询的支持
    ● 添加、删除分区支持
    ● 重建表以减少碎片
    ● 将普通表(堆积结构)结构改变为索引结构
    ● 添加、删除列
 
    使用DBMS_REDEFINITION包进行联机重定义。
 
1、表的联机重定义步骤
 
    ① 调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,确认该表是否可以联机重定义。
 
    ② 创建一个具有所有所需属性的空的临时过渡表(同一模式中)
 
    ③ 调用DBMS_REDEFINITION.START_REDEF_TABLE()启动重定义进程
        注:需要提供:重定义对象、临时过渡表、列的映射 (没有映射则默认所有列)
 
    ④ 在临时过渡表上创建触发器、索引、授权、约束
        注:必须以停用状态进行创建
 
    ⑤ 执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()完成重定义。
        在此期间完成的工作包括:
        * 重定义原始表,使其具有临时过渡表所有的属性、索引、约束、授权、触发器
        * 包含临时过渡表的参照约束包含最终的被重定义的表并被启用
        注:在这个过程中,原始表会加上一会排他锁(时间很短,且不依赖于表的大小)
 
    重定义过程的最终结果是:
 
    ● 原始表按照临时过渡表的属性和特点被重定义
    ● START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间在临时过渡表上定义的触发器、授权、索引和约束现在定义到被重定义的表上并被启用。
    ● 原始表上的所有触发器、授权、索引和约束转换到临时表上,删除临时表时将它们删除
    ● 原始表上定义的任何PL/SQL过程和游标都无效,下次使用时自动生效
 
2、中间同步
 
    在调用START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间,可能会在原始表上执行大量的DML语句,如果这样,可是使用周期性得使临时表与原始表同步。
 
    可以用DBMS_REDEFINITION.SYNC_INTERIM_TABLE()过程来进行,这个过程可以减少为完成重定义过程而调用FINISH_REDEF_TABLE()时所花的时间。但是在FINISH_REDEF_TABLE()期间原始表被加锁的那一小段时间与是否调用过SYNC_INTERIM_TABLE()无关
 
3、出错后的中止和清除
 
    如果在重定义中途出错,则调用DBMS_REDEFINITION.ABORT_REDEF_TABLE()。
 
    这个过程会删除与重定义进程相关的临时日志和表。但是临时过渡表相关的对象需要手动删除。
 
4、举例
 
    重定义以下列:
    * 列salary乘以系数1.10并重命名为sal
    * 删除phone列
    * 添加默认值为10的一个新的deptno列
    * 重定义的表按empno列的范围分区
 
    假定已经运行了DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,且表emp可以被重定义,则重定义步骤如下:
 
    ① 创建临时过渡表int_emp
 
    CREATE TABLE int_emp
    (empno NUMBER PRIMARY KEY,
     name VARCHAR2(100),
     sal NUMBER,
     deptno NUMBER DEFAULT 10)
    PARTITION BY RANGE(empno)
    (PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE tbs_1,
     PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE tbs_2);
 
    ② 启动重定义进程
 
    DBMS_REDEFINITION.START_REDEF_TABLE('u1','emp','int_emp','empno empno,name name salary*1.10 sal');
 
    ③ 在int_emp上创建触发器、索引和约束。
 
    在重定义的最后一步中,这些将被转移换回原始表。在int_emp上的任何参数约束应被停用。可以定义与临时过渡表相关的任何授权,重定义之后,这些授权将取代原始表上的授权。
 
    ④ 可选地,同步临时过渡表
 
    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('u1','emp','int_emp');
 
    ⑤ 完成重定义
 
    DBMS_REDEFINITION.FINISH_REDEF_TABLE('u1','emp','int_emp');
    --此后表emp被加锁一小段时间,此后表emp被重定义,具有了int_emp的所有属性。
 
    ⑥ 删除临时过渡表
 
5、限制
 
    表的联机重定义有一下限制:
 
    ● 表必须有主键才能被联机重定义
    ● 将被重定义的表和临时过渡表必须有相同的主键列
    ● 定义过物化视图、物化视图日志的表不能被联机重定义
    ● 索引结构表的溢出表不能被联机重定义
    ● 具有用户定义类型(对象、REF、收集、类型化表)的表不能被联机重定义
    ● 具有FILE列的表不能被联机重定义
    ● 具有LONG列的表不能被联机重定义(但是有LOB列的表可以)
    ● 要重定义的表不能是簇的一部分
    ● SYS和SYSTEM模式中的表不能被联机重定义
    ● 临时表不能被重定义
    ● 没有同一级别的子设置值支持
    ● 在将临时过渡表中的列映射到原始表中的列时,只能使用简单的确切的表达式(例如不允许使用子查询)
    ● 如果重定义时添加列,在重定义完成之前,不能将其声明为NOT NULL
    ● 在正被重定义的表和临时过渡表之间没有任何参照约束
 
 
 
五、删除表
 
    使用DROP TABLE语句删除表,使用CASCADE选项来删除相关信息
 
    DROP TABLE emp;
    DROP TABLE emp CASCADE CONSTRAINTS; --可以删除子表中的外键约束
 
    删除表时需要注意以下几点:
 
    ● 删除表后与表相关的所有索引、触发器也会被删除。
    ● 与表相关的PL/SQL程序单元仍保留,但无效
    ● 被删除表的同义词仍保留,使用时返回错误值
    ● 删除盘区删除块
    ● 可使用TRUNCATE命令来快速得清空表
 
 
六、表信息相关的视图
 
    DBA|ALL|USER_TABLES:表信息。某些列包含了DBMS_STATS包或ANALYZE语句产生的统计信息
    DBA|ALL|USER_TAB_COLUMNS:表、视图、簇的列。同样包含了一些统计信息
    DBA|ALL|USER_ALL_TABLES:描述数据库中所有关系表和对象表
    DBA|ALL|USER_TAB_COMMENTS:表的列和视图的注释
    DBA|ALL|USER_COL_COMMENTS:表的列和视图的列的注释
    DBA|ALL|USER_EXTERNAL_TABLES:列出数据库中外部表的特殊属性
    DBA|ALL|USER_EXTERNAL_LOCATIONS:列数外部表的数据源
    DBA|ALL|USER_HISTOGRAMS:描述表和视图上的直方图
    DBA|ALL|USER_TAB_COL_STATISTICS:提供相关的TAB_COLUMNS视图中提取出来的列的统计数据和直方图
    DBA|ALL|USER_TAB_MODIFICATIONS:记录自上次收集统计信息以来被更改过的表
    DBA|ALL|USER_UNUSED_COL_TABS:列出具有未使用列的表,是用ALTER TABLE ... SET UNUSED语句标记的
    DBA|ALL|USER_PARTIAL_DROP_TABS:列出部分完成DROP COLUMN操作的表
   
 
 
posted on 2009-02-12 23:01 decode360 阅读(66) 评论(0)  编辑  收藏 所属分类: 08.DBA

只有注册用户登录后才能发表评论。


网站导航: