Oracle数据库通过在线重定义的方法新增字段详解

来源:未知 责任编辑:智问网络 发表时间:2013-10-22 19:28 点击:

  Oracle数据库操作中,假如在原始表TB_HXL_USER上新增字段remark01,默认值为'A',但是由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,最后还报出了undo空间不足的问题.而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock.
  下面试着通过在线重定义的方法新增字段,能够避免undo空间不足以及其他用户不能访问该表的情况.
  1.使用如下SQL获取原始表的DDL
  设置分隔符号以及去掉表DDL中的storage属性:
  begin
  Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
  'SQLTERMINATOR',
  True);
  Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
  'STORAGE',
  False);
  end;
  提取表,索引,约束以及权限的语句.
  Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'TB_HXL_USER') ||
  Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX',
  Base_Object_Name => 'TB_HXL_USER') ||
  Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'CONSTRAINT',
  Base_Object_Name => 'TB_HXL_USER') ||
  Dbms_Metadata.Get_Dependent_Ddl('OBJECT_GRANT', 'TB_HXL_USER', 'HXL')
  From Dual
  2.将步骤1 SQL中的表名TB_HXL_USER 替换为TB_HXL_USER_MID 创建中间表
  3.中间表新增字段 remark01
  alter table TB_HXL_USER_MID add remark01 varchar2(10) default 'A';
  4.检查能否进行重定义,过程执行成功即说明可以重定义
  Begin
  Dbms_Redefinition.Can_Redef_Table(USER, 'TB_HXL_USER');
  End;
  5.开始重定义表
  注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq: TX - row lock contention.
  不能执行start_redef_table的情况下,需要将如下权限赋予用户.
  grant create any table to hxl;
  grant alter any table to hxl;
  grant drop any table to hxl;
  grant lock any table to hxl;
  grant select any table to hxl;
  grant create any trigger to hxl;
  grant create any index to hxl;
  运行start_redef_table过程
  BEGIN
  dbms_redefinition.start_redef_table(
  uname => USER,
  orig_table => 'TB_HXL_USER',
  int_table => 'TB_HXL_USER_MID',
  options_flag => DBMS_REDEFINITION.cons_use_pk);
  如果有主键则是options_flag => DBMS_REDEFINITION.cons_use_pk,如果没有
  DBMS_REDEFINITION.cons_use_rowid  END;
  6.开始同步中间表
  BEGIN
  dbms_redefinition.sync_interim_table(
  uname => USER,
  orig_table => 'TB_HXL_USER',
  int_table => 'TB_HXL_USER_MID');
  END;
  7.完成同步
  注意:如原始表有未提交的事物,该过程会一直在等待
  BEGIN
  dbms_redefinition.finish_redef_table(
  uname => USER,
  orig_table => 'TB_HXL_USER',
  int_table => 'TB_HXL_USER_MID');
  END;
  8.删除中间表
  drop table tb_hxl_user_mid;
  9.修改索引名称
  alter index idx_tb_hxl_user_mid_n1 rename to idx_tb_hxl_user_n1;
  alter index idx_tb_hxl_user_mid_u1 rename to idx_tb_hxl_user_u1;
  执行完以上的9个步骤,新增字段就创建成功了.
  关于Oracle数据库用在线重定义的方法新增字段的操作就介绍到这里了,希望本次的介绍能够对您有所收获!

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Table函数使用简介
    • Oracle数据库Constraint约束的常用操作及异常处理
    • Bulk Collect性能分析(zz)
    • export/import的使用
    • OCP043第十五讲 Database Security
    • ORACLE10gr2数据导入MySQL方案
    • oracle 让sys用户可以使用isqlplus
    • 在oracle数据库下使用iSQL*Plus DBA访问数据库
    • Oracle行列转换小结
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1