Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6660496
  • 博文数量: 1005
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13071
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1005)

文章存档

2020年(2)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Oracle

2011-08-08 16:15:22

目的:在原始表TB_HXL_USER上新增字段remark01,默认值为'A',该表的数据量大概有4个亿,试着用普通的做法直接在原表上新增字段,执行了很长时间,最后报undo空间不足而失败,而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock.下面试着通过在线重定义的方法新增字段,能够避免undo空间不足以及其他用户不能访问该表的情况.
 
1.使用如下SQL获取原始表的DDL
--设置分隔符号以及去掉表DDL中的storage属性
  1. begin
  2.     Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
  3.                                     'SQLTERMINATOR',
  4.                                     True);
  5.   Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
  6.                                     'STORAGE',
  7.                                     False);
  8. end;
--提取表,索引,约束,以及权限的语句,若索引和约束、权限没有的话,可以将相应的语句去掉
  1. Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'TB_HXL_USER') ||
  2.        Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX',
  3.                                        Base_Object_Name => 'TB_HXL_USER') ||
  4.        Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'CONSTRAINT',
  5.                                        Base_Object_Name => 'TB_HXL_USER') ||
  6.        Dbms_Metadata.Get_Dependent_Ddl('OBJECT_GRANT', 'TB_HXL_USER', 'HXL')
  7.   From Dual
2.将步骤1 SQL中的表名 TB_HXL_USER 替换为 TB_HXL_USER_MID 创建中间表
 
3.中间表新增字段 remark01
  1. alter table TB_HXL_USER_MID add remark01 varchar2(10) default 'A';
4.检查能否进行重定义,过程执行成功即说明可以重定义,表必须有主键或唯一性约束才能重定义
  1. Begin
  2.   Dbms_Redefinition.Can_Redef_Table(USER, 'TB_HXL_USER');
  3.  End;
若表没有主键的话,可以通过rowid进行检查

点击(此处)折叠或打开

  1. Begin
  2.  Dbms_Redefinition.Can_Redef_Table(USER, 'TB_TEST01',DBMS_REDEFINITION.cons_use_rowid );
  3. End



5.开始重定义表
注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq: TX - row lock contention
--不能执行start_redef_table的情况下,需要将如下权限赋予用户
  1. grant create any table to hxl;
  2. grant alter any table to hxl;
  3. grant drop any table to hxl;
  4. grant lock any table to hxl;
  5. grant select any table to hxl;
  6. grant create any trigger to hxl;
  7. grant create any index to hxl;
--运行start_redef_table过程
  1. BEGIN
  2.   dbms_redefinition.start_redef_table(
  3.     uname => USER,
  4.     orig_table => 'TB_HXL_USER',
  5.     int_table => 'TB_HXL_USER_MID',
  6.     options_flag => DBMS_REDEFINITION.cons_use_pk);
  7.     -- 如果有主键则是 options_flag => DBMS_REDEFINITION.cons_use_pk,如果没有DBMS_REDEFINITION.cons_use_rowid

  8. END;
6.开始同步中间表
  1. BEGIN
  2.   dbms_redefinition.sync_interim_table(
  3.     uname => USER,
  4.     orig_table => 'TB_HXL_USER',
  5.     int_table => 'TB_HXL_USER_MID');
  6. END;

7.完成同步
注意:如原始表有未提交的事物,该过程会一直在等待
  1. BEGIN
  2.   dbms_redefinition.finish_redef_table(
  3.     uname => USER,
  4.     orig_table => 'TB_HXL_USER',
  5.     int_table => 'TB_HXL_USER_MID');
  6. END;
8.删除中间表
  1. drop table tb_hxl_user_mid;

9.修改索引名称
  1. alter index idx_tb_hxl_user_mid_n1 rename to idx_tb_hxl_user_n1;
  2. alter index idx_tb_hxl_user_mid_u1 rename to idx_tb_hxl_user_u1;
阅读(4548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~