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

数据库 Oracle
本文我们主要介绍了Oracle数据库操作中,当数据库表的数据量比较大的时候,采用在线重定义的方法新增字段的方法,以避免undo空间不足以及其他用户不能访问该表的情况发生。希望能够对您有所帮助。

Oracle数据库操作中,假如在原始表TB_HXL_USER上新增字段remark01,默认值为'A',但是由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,最后还报出了undo空间不足的问题。而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock。

下面试着通过在线重定义的方法新增字段,能够避免undo空间不足以及其他用户不能访问该表的情况。

1.使用如下SQL获取原始表的DDL

设置分隔符号以及去掉表DDL中的storage属性:

 

  1. begin  
  2.  
  3. Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,  
  4.  
  5. 'SQLTERMINATOR',  
  6.  
  7. True);  
  8.  
  9. Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,  
  10.  
  11. 'STORAGE',  
  12.  
  13. False);  
  14.  
  15. end; 

 

提取表,索引,约束以及权限的语句。

 

  1. Select Dbms_Metadata.Get_Ddl(Object_Type => 'TABLE', Name => 'TB_HXL_USER') ||  
  2.  
  3. Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX',  
  4.  
  5. Base_Object_Name => 'TB_HXL_USER') ||  
  6.  
  7. Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'CONSTRAINT',  
  8.  
  9. Base_Object_Name => 'TB_HXL_USER') ||  
  10.  
  11. Dbms_Metadata.Get_Dependent_Ddl('OBJECT_GRANT', 'TB_HXL_USER', 'HXL')  
  12.  
  13. 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.  
  3. Dbms_Redefinition.Can_Redef_Table(USER, 'TB_HXL_USER');  
  4.  
  5. End; 

 

5.开始重定义表

注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq: TX - row lock contention。

不能执行start_redef_table的情况下,需要将如下权限赋予用户。

 

  1. grant create any table to hxl;  
  2.  
  3. grant alter any table to hxl;  
  4.  
  5. grant drop any table to hxl;  
  6.  
  7. grant lock any table to hxl;  
  8.  
  9. grant select any table to hxl;  
  10.  
  11. grant create any trigger to hxl;  
  12.  
  13. grant create any index to hxl; 

 

运行start_redef_table过程

 

  1. BEGIN  
  2.  
  3. dbms_redefinition.start_redef_table(  
  4.  
  5. uname => USER,  
  6.  
  7. orig_table => 'TB_HXL_USER',  
  8.  
  9. int_table => 'TB_HXL_USER_MID',  
  10.  
  11. options_flag => DBMS_REDEFINITION.cons_use_pk); 

 

如果有主键则是options_flag => DBMS_REDEFINITION.cons_use_pk,如果没有

  1. DBMS_REDEFINITION.cons_use_rowid  
  2. END; 

 

6.开始同步中间表

 

  1. BEGIN  
  2.  
  3. dbms_redefinition.sync_interim_table(  
  4.  
  5. uname => USER,  
  6.  
  7. orig_table => 'TB_HXL_USER',  
  8.  
  9. int_table => 'TB_HXL_USER_MID');  
  10.  
  11. END; 

 

7.完成同步

注意:如原始表有未提交的事物,该过程会一直在等待

 

  1. BEGIN  
  2.  
  3. dbms_redefinition.finish_redef_table(  
  4.  
  5. uname => USER,  
  6.  
  7. orig_table => 'TB_HXL_USER',  
  8.  
  9. int_table => 'TB_HXL_USER_MID');  
  10.  
  11. 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.  
  3. alter index idx_tb_hxl_user_mid_u1 rename to idx_tb_hxl_user_u1; 

 

执行完以上的9个步骤,新增字段就创建成功了。

关于Oracle数据库用在线重定义的方法新增字段的操作就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. 关于Oracle数据库闪回个性的详细介绍
  2. Oracle数据库对DDL语句和DML语句的事务管理
  3. Oracle数据库启动参数文件及相关SQL语句简介
  4. Oracle数据库的几种文件及表空间数据块的知识简介
  5. Oracle数据库查询登录用户名所属表空间及其使用情况
责任编辑:赵鹏 来源: ChinaUnix博客
相关推荐

2011-03-22 14:49:35

Oracle数据库重定义表

2011-07-25 16:54:52

Oracle数据库注册监听

2011-05-19 13:25:14

Oracle数据库

2022-01-11 08:46:56

Oracle 在线重定义数据库

2010-04-14 15:14:11

Oracle数据库

2010-04-02 13:59:08

Oracle数据库

2011-03-29 10:47:49

ORACLE数据库

2011-05-26 14:18:49

Oracle数据库字段属性

2010-04-23 14:32:01

Oracle数据库

2010-05-10 15:50:39

Oracle数据库性能

2011-04-11 13:19:41

Oracle数据库

2011-05-17 15:02:15

ORACLE数据库备份

2011-08-18 15:49:21

Oracle厉行计划

2010-10-26 11:04:48

oracle数据导入

2011-04-13 14:07:17

OracleSybase数据库

2010-10-27 14:15:44

Oracle数据库效率

2010-10-28 14:18:01

oracle数据库版本

2010-05-06 09:30:16

Oracle创建数据库

2011-08-22 18:12:20

OracleORA-01591

2011-08-18 17:05:16

Oracle数据库的服
点赞
收藏

51CTO技术栈公众号