--输出信息采用缩排或换行格式化
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', TRUE);
--确保每个语句都带分号
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
--关闭表索引、外键等关联(后面单独生成)
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER', FALSE);
--关闭存储、表空间属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', FALSE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', FALSE);
--关闭创建表的PCTFREE、NOCOMPRESS等属性
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', FALSE);
Oracle数据库操作中,假如在原始表TB_HXL_USER上新增字段remark01,默认值为'A',但是由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,最后还报出了undo空间不足的问题。而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock。
下面试着通过在线重定义的方法新增字段,能够避免undo空间不足以及其他用户不能访问该表的情况。
1.使用如下SQL获取原始表的DDL
设置分隔符号以及去掉表DDL中的storage属性
SELECT DBMS_METADATA.GET_DDL(OBJECT_TYPE => 'TABLE', NAME => 'INSURED') ||  
DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'INDEX',BASE_OBJECT_NAME => 'INSURED') ||  
DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_TYPE => 'CONSTRAINT',BASE_OBJECT_NAME => 'INSURED' ) ||  
DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT', 'INSURED', 'CMDS')  
FROM DUAL;

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 => 'INSURED') ||  Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX',  Base_Object_Name => 'INSURED') From Dual ;
2.将步骤1 SQL中的表名TB_HXL_USER 替换为TB_HXL_USER_MID 创建中间表
3.中间表新增字段 remark01
alter table insured_MID add remark01 varchar2(10) default 'A'; 
4.检查能否进行重定义,过程执行成功即说明可以重定义
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured',DBMS_REDEFINITION.CONS_USE_rowid);
end;
/
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE('cmds','insured_mid',DBMS_REDEFINITION.CONS_USE_rowid);
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过程
SQL> BEGIN  
dbms_redefinition.start_redef_table(uname => USER,orig_table => 'insured', int_table => 'INSURED_MID', options_flag => DBMS_REDEFINITION.cons_use_rowid); 
END; 
/

如果有主键则是options_flag => DBMS_REDEFINITION.cons_use_pk,如果没有DBMS_REDEFINITION.cons_use_rowid  
6.开始同步中间表
BEGIN  
dbms_redefinition.sync_interim_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID');  
END;
/
7.完成同步
注意:如原始表有未提交的事物,该过程会一直在等待
BEGIN  
dbms_redefinition.finish_redef_table(uname => 'CMDS',orig_table => 'INSURED',int_table => 'INSURED_MID');  
END;
/
8.删除中间表
drop table insured_mid;
9.修改索引名称
alter index IDX_INSURED_NO_mid rename to IDX_INSURED_NO;  
alter index IDX_INSURED_INDEX_mid rename to IDX_INSURED_INDEX; 
执行完以上的9个步骤,新增字段就创建成功了。

转载于:https://www.cnblogs.com/wangrongxin/p/6654009.html

cmds在线重定义增加列相关推荐

  1. ORACLE 普通表转换成分区表(在线重定义)

    在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就 ...

  2. Oracle 11gR2 在线重定义(online redefinition)

    在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程,在此期间应用程序对该表的操作将失败.除了这个,如果用exp,我们也 ...

  3. linux下出现重定义,Oracle Online Redefinition在线重定义

    在线重定义特性进行数据表Online的结构变动操作.本篇我们从一个较复杂的案例出发,讨论复杂变化情况下如何进行Online Redefinition,以及dbms_redefinition包各个关键方 ...

  4. 在线重定义的补充测试

    在很多时候,我们都是需要保持业务的可持续性,尽管说DDL的过程持续时间很短,但是在线业务出现,就会阻塞DML,导致业务访问中断,事务收到影响,所以在有些场景下,高可用的需求可能比性能的需求优先级还要高 ...

  5. 在线重定义生产环境大表分区的惨烈踩雷记录

    精彩预告:第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市朝阳区东三环中路61号富力万丽酒店盛大开启.本次大会邀请互联网领先企业的数据库专家,国产数据库的领军人物,云技术等领域的知名 ...

  6. oracle在线重定义(一)

    一.废话几句: 关于pd12导出图像, 首先ctrl+A全选 然后:edit->Export Image-->emf格式为默认,实则任选就OK了: 下午时隔4个月再次画ER图,相对的感觉要 ...

  7. Oracle在线重定义

    http://boylook.itpub.net/post/43144/520542 Oracle9i之前,表数据的整理是通过 alter table XXX move [tablespace XX] ...

  8. Oracle Online Redefinition在线重定义(下)

    在之前的文章中,我们看到了如何处理单表在线重定义过程.本篇我们来看一下如何进行关联表的重定义过程. 4.外键关系表重定义 我们先创建出实验数据表. SQL> create table t_mas ...

  9. Oracle11g新特性:在线操作功能增强-Oracle11g在线重定义功能对物化视图... (转载)

    Oracle的在线重定义功能就是利用了物化视图的功能,通过物化视图日志的记录功能,来同步目标表和基表的数据.因此,在11g以前,建立了物化视图日志的表是无法进行在线重定义操作的: SQL> CR ...

最新文章

  1. 外链引入css有哪些方式_引入CSS样式表的方式有哪些?
  2. memcached在windows下的基本使用方法
  3. Jmeter教程索引贴
  4. ?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
  5. 移动端堆栈关键行定位的新思路
  6. vue.js computedmethod
  7. 集成tomcat插件到eclipse
  8. 全志 a33 linux qt,全志A33 lichee 搭建Qt App开发环境编写helloworld
  9. ncverilog脚本_基于脚本和test bench的ncverilog ASIC仿真实例分析
  10. 【数据分享】全国POI数据分享(持续更新中)
  11. 利用mongodb实现分布式WEB图片存储
  12. 统计字符串中各类字符的个数
  13. CMOS搭建反相器、与非门和或非门以及OD和三态门
  14. 如何检测猥琐的私有SDWAN隧道协议
  15. Java处理Word, Excel, PDF文档的4种开源系统的代码例子
  16. 人生值得一看-观念,关键在观念 !
  17. 大热的“滑板底盘”会以什么节奏落地?
  18. 提示格式化怎么办,提示格式化找到方案
  19. 中国主要湖泊水库面状矢量边界图层ArcGIS使用之一篇
  20. JAVA电子设备销售网站计算机毕业设计Mybatis+系统+数据库+调试部署

热门文章

  1. eclipse问题_Alt+/不给提示,只补充代码问题的解决方案
  2. python中del语句
  3. 将网桥的配置写进去/etc/sysconfig/network-scripts/ifcfg-xxx
  4. 基础、语法都不是最重要的,学Python最重要的是什么?编程思路!
  5. Lua游戏开发----模块
  6. 《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形
  7. MacOS下MySQL配置
  8. postgresql9.5 run 文件linux安装后配置成开机服务
  9. Screen Painter 程序设计
  10. ASP.NET 4.0升级至ASP.NET 4.5需要注意的地方