基础介绍

Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入、删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delete操作。

对一般的DDL过程而言,Oracle都会给数据对象一个独占表锁。也就是说,在进行DDL操作的过程中,我们是不能对数据表进行DML(增加、修改和删除操作)。只有等待DDL结束,才能够继续操作。

也就是说,如果一个DDL持续时间很长,比如数据表海量大小,那么在这个长时间中,系统数据表其实是不能对外提供服务的。

Oracle在线重定义提供了解决问题的途径。我们如果需要对一个数据表进行重定义,需要定义一个中间目标表Interim。在Interim表中定义好目标结构,比如期望的存储、分区、字段关系。在线重定义使用的主要是dbms_redefinition包的对应方法。

在线重定义最大的特点是,当进行online操作的时候,我们还可以对数据表进行DML操作。结束定义过程时,期间进行的操作都是可以反馈到目标数据表中的。

目前,Oracle在线重定义支持下列种类的重定义动作:

  • 插入、删除数据表列和对一个存在的数据表列改名
  • 修改字段类型;
  • 消除数据表段中的碎片块
  • 索引、约束等对象的重定义
  • 分区表转变;

查看DBMS_REDEFINITION包的使用

  1. desc DBMS_REDEFINITION
  2. PROCEDURE ABORT_REDEF_TABLE
  3. Argument Name Type In/Out Default?
  4. ------------------------------ ----------------------- ------ --------
  5. UNAME VARCHAR2 IN
  6. ORIG_TABLE VARCHAR2 IN
  7. INT_TABLE VARCHAR2 IN
  8. PART_NAME VARCHAR2 IN DEFAULT
  9. PROCEDURE CAN_REDEF_TABLE
  10. Argument Name Type In/Out Default?
  11. ------------------------------ ----------------------- ------ --------
  12. UNAME VARCHAR2 IN
  13. TNAME VARCHAR2 IN
  14. OPTIONS_FLAG BINARY_INTEGER IN DEFAULT
  15. PART_NAME VARCHAR2 IN DEFAULT
  16. PROCEDURE COPY_TABLE_DEPENDENTS
  17. Argument Name Type In/Out Default?
  18. ------------------------------ ----------------------- ------ --------
  19. UNAME VARCHAR2 IN
  20. ORIG_TABLE VARCHAR2 IN
  21. INT_TABLE VARCHAR2 IN
  22. COPY_INDEXES BINARY_INTEGER IN DEFAULT
  23. COPY_TRIGGERS BOOLEAN IN DEFAULT
  24. COPY_CONSTRAINTS BOOLEAN IN DEFAULT
  25. COPY_PRIVILEGES BOOLEAN IN DEFAULT
  26. IGNORE_ERRORS BOOLEAN IN DEFAULT
  27. NUM_ERRORS BINARY_INTEGER OUT
  28. COPY_STATISTICS BOOLEAN IN DEFAULT
  29. COPY_MVLOG BOOLEAN IN DEFAULT
  30. PROCEDURE FINISH_REDEF_TABLE
  31. Argument Name Type In/Out Default?
  32. ------------------------------ ----------------------- ------ --------
  33. UNAME VARCHAR2 IN
  34. ORIG_TABLE VARCHAR2 IN
  35. INT_TABLE VARCHAR2 IN
  36. PART_NAME VARCHAR2 IN DEFAULT
  37. PROCEDURE REGISTER_DEPENDENT_OBJECT
  38. Argument Name Type In/Out Default?
  39. ------------------------------ ----------------------- ------ --------
  40. UNAME VARCHAR2 IN
  41. ORIG_TABLE VARCHAR2 IN
  42. INT_TABLE VARCHAR2 IN
  43. DEP_TYPE BINARY_INTEGER IN
  44. DEP_OWNER VARCHAR2 IN
  45. DEP_ORIG_NAME VARCHAR2 IN
  46. DEP_INT_NAME VARCHAR2 IN
  47. PROCEDURE START_REDEF_TABLE
  48. Argument Name Type In/Out Default?
  49. ------------------------------ ----------------------- ------ --------
  50. UNAME VARCHAR2 IN
  51. ORIG_TABLE VARCHAR2 IN
  52. INT_TABLE VARCHAR2 IN
  53. COL_MAPPING VARCHAR2 IN DEFAULT
  54. OPTIONS_FLAG BINARY_INTEGER IN DEFAULT
  55. ORDERBY_COLS VARCHAR2 IN DEFAULT
  56. PART_NAME VARCHAR2 IN DEFAULT
  57. PROCEDURE SYNC_INTERIM_TABLE
  58. Argument Name Type In/Out Default?
  59. ------------------------------ ----------------------- ------ --------
  60. UNAME VARCHAR2 IN
  61. ORIG_TABLE VARCHAR2 IN
  62. INT_TABLE VARCHAR2 IN
  63. PART_NAME VARCHAR2 IN DEFAULT
  64. PROCEDURE UNREGISTER_DEPENDENT_OBJECT
  65. Argument Name Type In/Out Default?
  66. ------------------------------ ----------------------- ------ --------
  67. UNAME VARCHAR2 IN
  68. ORIG_TABLE VARCHAR2 IN
  69. INT_TABLE VARCHAR2 IN
  70. DEP_TYPE BINARY_INTEGER IN
  71. DEP_OWNER VARCHAR2 IN
  72. DEP_ORIG_NAME VARCHAR2 IN
  73. DEP_INT_NAME VARCHAR2 IN

DBMS_REDEFINITION包:

  1. ABSORT_REDEF_TABLE:清理重定义的错误和中止重定义;
  2. CAN_REDEF_TABLE:检查表是否可以进行重定义,存储过程执行成功代表可以进行重定义;
  3. COPY_TABLE_DEPENDENTS:同步索引和依赖的对象(包括索引、约束、触发器、权限等);
  4. FINISH_REDEF_TABLE:完成在线重定义;
  5. REGISTER_DEPENDENTS_OBJECTS:注册依赖的对象,如索引、约束、触发器等;
  6. START_REDEF_TABLE:开始在线重定义;
  7. SYNC_INTERIM_TABLE:增量同步数据;
  8. UNREGISTER_DEPENDENT_OBJECT:不注册依赖的对象,如索引、约束、触发器等;

举例说明

下面,我们通过一个简单的例子,去看看如何使用dbms_redefinition包进行重定义操作。

现有一张用户MIS_AUDIT下的业务表audit_log需要添加一字段,数据量为6361345,考虑到由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock。在此使用Oracle提供的DBMS_REDEFINITION包执行在线重定义表.

1. 查看原表信息

  1. select count(*) from audit_log; #数据量
  2.  
  3. COUNT(*)
  4. ----------
  5. 6361345
  6.  
  7. desc audit_log #表结构
  8. Name Null? Type
  9. --------------------------------------------- -------- -----------------------------------
  10. AUDIT_LOG_ID NOT NULL NUMBER(38)
  11. PROCEDURE_ID NOT NULL NUMBER(38)
  12. PROCEDURE_DATE DATE
  13. PROCESS_ID NOT NULL NUMBER(38)
  14. JOB_ID NOT NULL NUMBER(38)
  15. TASK_ID NOT NULL NUMBER(38)
  16. TYPE NOT NULL VARCHAR2(32)
  17. MESSAGE VARCHAR2(2000)
  18. STATUS NOT NULL VARCHAR2(32)
  19. CREATE_TIME NOT NULL DATE
  20. CREATED_BY NOT NULL VARCHAR2(64)
  21.  
  22. column INDEX_NAME format a25
  23. column INDEX_TYPE format a20
  24. column TABLE_OWNER format a20
  25. column TABLE_NAME format a20
  26. column TABLE_TYPE format a20
  27. select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG'; #该表对应的索引
  28.  
  29. INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS
  30. ------------------------- ---------------- ---------------- ---------------- ---------------- ------------------------
  31. IDX_AUDIT_LOG_TYPE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  32. IDX_ALOG_PROCESS_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  33. IDX_ALOG_PROCEDURE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  34. PK_AUDIT_LOG NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  35.  
  36. column CONSTRAINT_NAME format a15
  37. column CONSTRAINT_TYPE format a15
  38. column INVALID format a15
  39. column TABLE_NAME format a15
  40. column OWNER format a15
  41. select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG'; #该表对应的约束
  42.  
  43. CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER
  44. --------------- --------------- ---------------- ----------- ---------------
  45. SYS_C0011415 C ENABLED AUDIT_LOG MIS_AUDIT
  46. SYS_C0011416 C ENABLED AUDIT_LOG MIS_AUDIT
  47. SYS_C0011417 C ENABLED AUDIT_LOG MIS_AUDIT
  48. SYS_C0011418 C ENABLED AUDIT_LOG MIS_AUDIT
  49. SYS_C0011419 C ENABLED AUDIT_LOG MIS_AUDIT
  50. SYS_C0011420 C ENABLED AUDIT_LOG MIS_AUDIT
  51. SYS_C0011421 C ENABLED AUDIT_LOG MIS_AUDIT
  52. SYS_C0011422 C ENABLED AUDIT_LOG MIS_AUDIT
  53. SYS_C0011423 C ENABLED AUDIT_LOG MIS_AUDIT
  54. PK_AUDIT_LOG P ENABLED AUDIT_LOG MIS_AUDIT #该表拥有一个主键约束
  55.  
  56. 10 rows selected.

2. 赋予用户MIS_AUDIT拥有在线重新定义表的权限

使用Online Redefinition在线重定义需要用到DBMS_REDEFINITION程序包,EXECUTE_CATALOG_ROLE角色默认被赋予该PL/SQL Package的执行权限。除了执行该程序包的权限外,用户还需要拥有以下权限:

  • CREATE ANY TABLE
  • ALTER ANY TABLE
  • DROP ANY TABLE
  • LOCK ANY TABLE
  • SELECT ANY TABLE

若要执行COPY_TABLE_DEPENDENTS存储过程则还需要以下权限:

  • CREATE ANY TRIGGER
  • CREATE ANY INDEX
  1. grant EXECUTE_CATALOG_ROLE,CREATE ANY TABLE,ALTER ANY TABLE,DROP ANY TABLE,LOCK ANY TABLE,SELECT ANY TABLE,CREATE ANY TRIGGER,CREATE ANY INDEX to mis_audit;

3. 查看该业务表是否支持在线重定义

有两种在线重定义的方法.

  • 第一种是我们较为推荐的方式,采用Primary Key主键或者pseudoprimary key伪主键实施重定义(从Oracle 10g开始支持pseudoprimary key伪主键)。 这里pseudoprimary key伪主键要求是唯一键且所有的成员列均是非空NOT NULL。使用该种方式,重定义前和重定义后版本的表均必须有相同的Primary Key主键或者pseudoprimary key伪主键列。不管是从性能角度,还是从操作的复杂度考虑,常规场景中都推荐尽可能使用此种方式
  • 第二种方式是使用rowid进行redefinition。首先索引组织表index-organized table (IOT)不支持使用rowid的重定义方式。此外,若使用该种redefinition方式,最终会有一个隐藏的字段M_ROW$$被加入到重定义后版本的表上,Oracle官方推荐在重定义完成后将该M_ROW$$字段drop掉或者标记为unused。
  1. EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_ROWID); #查看该表是否支持primary key方式重定义
  2.  
  3. PL/SQL procedure successfully completed.
  4.  
  5. EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_PK); #查看该表是否支持ROWID方式重定义
  6.  
  7. PL/SQL procedure successfully completed.

4. 获取业务表的ddl语句

  1. EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE);
  2. EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',True);
  3. EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
  4. select dbms_metadata.get_ddl('TABLE','AUDIT_LOG','MIS_AUDIT') from dual; #获取业务表的DDl语句
  5. DBMS_METADATA.GET_DDL('TABLE','AUDIT_LOG','MIS_AUDIT')
  6. --------------------------------------------------------------------------------
  7.  
  8. CREATE TABLE "MIS_AUDIT"."AUDIT_LOG"
  9. ( "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE,
  10. "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE,
  11. "PROCEDURE_DATE" DATE,
  12. "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE,
  13. "JOB_ID" NUMBER(*,0) NOT NULL ENABLE,
  14. "TASK_ID" NUMBER(*,0) NOT NULL ENABLE,
  15. "TYPE" VARCHAR2(32) NOT NULL ENABLE,
  16. "MESSAGE" VARCHAR2(2000),
  17. "STATUS" VARCHAR2(32) NOT NULL ENABLE,
  18. "CREATE_TIME" DATE NOT NULL ENABLE,
  19. "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE,
  20. CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID")
  21. USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATIS
  22. TICS NOLOGGING
  23. TABLESPACE "TOOL" ENABLE
  24. ) SEGMENT CREATION IMMEDIATE
  25. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
  26. NOCOMPRESS NOLOGGING
  27. TABLESPACE "TOOL" ;
  28.  
  29. select dbms_metadata.get_ddl('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT') from dual; #获取表的创建主键约束的语句
  30.  
  31. DBMS_METADATA.GET_DDL('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT')
  32. --------------------------------------------------------------------------------
  33.  
  34. ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY K
  35. EY ("AUDIT_LOG_ID")
  36. USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE S
  37. TATISTICS NOLOGGING
  38. TABLESPACE "TOOL" ENABLE;

5.创建中间表AUDIT_LOG_TEMP

修改建表语句,增加字段location,这里不要创建任何索引和主键约束信息,只要创建基本的表结构对象

  1. CREATE TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP"(
  2. "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE,
  3. "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE,
  4. "PROCEDURE_DATE" DATE,
  5. "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE,
  6. "JOB_ID" NUMBER(*,0) NOT NULL ENABLE,
  7. "TASK_ID" NUMBER(*,0) NOT NULL ENABLE,
  8. "TYPE" VARCHAR2(32) NOT NULL ENABLE,
  9. "MESSAGE" VARCHAR2(2000),
  10. "STATUS" VARCHAR2(32) NOT NULL ENABLE,
  11. "CREATE_TIME" DATE NOT NULL ENABLE,
  12. "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE,
  13. "LOCATION" VARCHAR2(256)
  14. );

6.开始重定义过程

  1. set timing on
  2. begin
  3. DBMS_REDEFINITION.START_REDEF_TABLE(uname => 'MIS_AUDIT',
  4. orig_table => 'AUDIT_LOG',
  5. int_table => 'AUDIT_LOG_TEMP',
  6. col_mapping => 'AUDIT_LOG_ID AUDIT_LOG_ID,
  7. PROCEDURE_ID PROCEDURE_ID,
  8. PROCEDURE_DATE PROCEDURE_DATE,
  9. PROCESS_ID PROCESS_ID,
  10. JOB_ID JOB_ID,
  11. TASK_ID TASK_ID,
  12. TYPE TYPE,
  13. MESSAGE MESSAGE,
  14. STATUS STATUS,
  15. CREATE_TIME CREATE_TIME,
  16. CREATED_BY CREATED_BY',
  17. options_flag => DBMS_REDEFINITION.CONS_USE_PK);
  18. end;
  19. /
  20.  
  21. PL/SQL procedure successfully completed.
  22.  
  23. Elapsed: 00:02:01.18
  24.  
  25. select count(*) from audit_log_temp;
  26.  
  27. COUNT(*)
  28. ----------
  29. 6361345

  30. select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP';
  31.  
  32. no rows selected
  33.  
  34. Elapsed: 00:00:00.05

若在完成重定义(执行finish_redef_table)之前希望中断在线重定义表,则需要使用DBMS_REDEFINITION.ABORT_REDEF_TABLE明确手动中断abort

  1. begin
  2. dbms_redefinition.abort_redef_table(uname => 'MIS_AUDIT',
  3. orig_table => 'AUDIT_LOG',
  4. int_table => 'AUDIT_LOG_TEMP');
  5. end;
  6. /
  7.  
  8. PL/SQL procedure successfully completed.

6.调用COPY_TABLE_DEPENDENTS过程克隆依赖对象

(自动在AUDIT_LOG_TEMP表上创建触发器,索引,物化视图日志,授权和约束)

  1. DECLARE
  2. num_errors PLS_INTEGER;
  3. BEGIN
  4. DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname => 'MIS_AUDIT',
  5. orig_table => 'AUDIT_LOG',
  6. int_table => 'AUDIT_LOG_TEMP',
  7. copy_indexes => DBMS_REDEFINITION.cons_orig_params,
  8. copy_triggers => TRUE,
  9. copy_constraints => TRUE,
  10. copy_privileges => TRUE,
  11. copy_statistics => TRUE,
  12. ignore_errors => FALSE,
  13. num_errors => num_errors
  14. );
  15. END;
  16. /
  17.  
  18. DECLARE
  19. *
  20. ERROR at line 1:
  21. ORA-01442: column to be modified to NOT NULL is already NOT NULL
  22. ORA-06512: at "SYS.DBMS_REDEFINITION", line 1015
  23. ORA-06512: at "SYS.DBMS_REDEFINITION", line 1907
  24. ORA-06512: at line 4
  25.  
  26. Elapsed: 00:01:49.43

可以通过DBA_REDEFINITION_ERRORS视图来判断在使用COPY_TABLE_DEPENDENTS存储过程克隆依赖对象过程中是否产生了错误。该视图记录了重定义过程中在克隆依赖对象时产生的错误。 克隆对象可能因缺少系统资源或原表的一个逻辑结构变化而失败。在我们成功克隆这些依赖对象后,相关错误将会从该视图中被移除。 我们可以反复执行COPY_TABLE_DEPENDENTS尝试重新克隆依赖对象。

  1. column OBJECT_TYPE format a15
  2. column OBJECT_NAME format a15
  3. column DDL_TXT format a150
  4. select OBJECT_TYPE,OBJECT_NAME,DDL_TXT from DBA_REDEFINITION_ERRORS;
  5.  
  6. OBJECT_TYPE OBJECT_NAME DDL_TXT
  7. --------------- --------------- ------------------------------------------------------------------------------------------------------------------------------------------------------
  8. CONSTRAINT SYS_C0011622 ALTER TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP" MODIFY ("JOB_ID" CONSTRAINT "TMP$$_SYS_C00116220" NOT NULL ENABLE NOVALIDATE)

由于之前指定了主键,所以已经是not null 了,检查可以看到索引已经创建成功。

  1. select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP';
  2.  
  3. INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS
  4. ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------
  5. TMP$$_IDX_AUDIT_LOG_TYPE_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID
  6. TMP$$_IDX_ALOG_PROCESS_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID
  7. TMP$$_IDX_ALOG_PROCEDURE_ID0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID
  8. TMP$$_PK_AUDIT_LOG0 NORMAL MIS_AUDIT AUDIT_LOG_TEMP TABLE VALID
  9.  
  10. Elapsed: 00:00:00.00

此时查看临时表的约束,发现主键约束并没有同步过来,

  1. select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP';
  2.  
  3. CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER
  4. --------------- --------------- ------------------------ --------------- ---------------
  5. SYS_C0011656 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  6. SYS_C0011657 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  7. SYS_C0011658 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  8. SYS_C0011659 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  9. SYS_C0011660 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  10. SYS_C0011661 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  11. SYS_C0011662 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  12. SYS_C0011663 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  13. SYS_C0011664 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  14.  
  15. 9 rows selected.
  16.  
  17. Elapsed: 00:00:00.00

7. 利用sync_interim_table过程同步临时表的数据减少finish_redef_table的耗时

  1. BEGIN
  2. DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP');
  3. END;
  4. /
  5.  
  6. PL/SQL procedure successfully completed.
  7.  
  8. Elapsed: 00:00:00.07

8. 执行finish_redef_table过程完成重定义

最后使用finish_redef_table来将两个表的名互换,以实现功能重定义的功能。原表更名为了中间表AUDIT_LOG_TEMP,可以Drop掉了。

  1. BEGIN
  2. DBMS_REDEFINITION.FINISH_REDEF_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP');
  3. END;
  4. /
  5.  
  6. PL/SQL procedure successfully completed.
  7.  
  8. Elapsed: 00:00:03.21

9. 查看原表信息确认在线定义已经完成

  1. desc audit_log
  2. Name             Null? Type
  3. ----------------------------------------------------- -------- ------------------------------------
  4. AUDIT_LOG_ID          NOT NULL NUMBER(38)
  5. PROCEDURE_ID          NOT NULL NUMBER(38)
  6. PROCEDURE_DATE                 DATE
  7. PROCESS_ID           NOT NULL NUMBER(38)
  8. JOB_ID             NOT NULL NUMBER(38)
  9. TASK_ID             NOT NULL NUMBER(38)
  10. TYPE             NOT NULL VARCHAR2(32)
  11. MESSAGE                   VARCHAR2(2000)
  12. STATUS             NOT NULL VARCHAR2(32)
  13. CREATE_TIME           NOT NULL DATE
  14. CREATED_BY           NOT NULL VARCHAR2(64)
  15. LOCATION                 VARCHAR2(256)
  16.  
  17. MIS_AUDIT@userdata>select count(*) from audit_log;
  18.  
  19. COUNT(*)
  20. ----------
  21. 6361345
  22.  
  23. Elapsed: 00:00:00.49
  24.  
  25. select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG';
  26.  
  27. INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABLE_TYPE STATUS
  28. ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------
  29. IDX_AUDIT_LOG_TYPE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  30. IDX_ALOG_PROCESS_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  31. IDX_ALOG_PROCEDURE_ID NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID
  32. PK_AUDIT_LOG NORMAL MIS_AUDIT AUDIT_LOG TABLE VALID

10.删除临时表的主键约束并添加主键约束到原表

  1. select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG';
  2.  
  3. CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER
  4. --------------- --------------- ------------------------ --------------- ---------------
  5. SYS_C0011656 C ENABLED AUDIT_LOG MIS_AUDIT
  6. SYS_C0011657 C ENABLED AUDIT_LOG MIS_AUDIT
  7. SYS_C0011658 C ENABLED AUDIT_LOG MIS_AUDIT
  8. SYS_C0011659 C ENABLED AUDIT_LOG MIS_AUDIT
  9. SYS_C0011660 C ENABLED AUDIT_LOG MIS_AUDIT
  10. SYS_C0011661 C ENABLED AUDIT_LOG MIS_AUDIT
  11. SYS_C0011662 C ENABLED AUDIT_LOG MIS_AUDIT
  12. SYS_C0011663 C ENABLED AUDIT_LOG MIS_AUDIT
  13. SYS_C0011664 C ENABLED AUDIT_LOG MIS_AUDIT
  14.  
  15. 9 rows selected.
  16.  
  17. Elapsed: 00:00:00.05
  18.  
  19. select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP';
  20.  
  21. CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER
  22. --------------- --------------- ------------------------ --------------- ---------------
  23. SYS_C0011622 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  24. SYS_C0011623 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  25. SYS_C0011624 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  26. SYS_C0011625 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  27. SYS_C0011626 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  28. SYS_C0011627 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  29. PK_AUDIT_LOG P ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  30. SYS_C0011619 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  31. SYS_C0011620 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  32. SYS_C0011621 C ENABLED AUDIT_LOG_TEMP MIS_AUDIT
  33.  
  34. 10 rows selected.
  35.  
  36. Elapsed: 00:00:00.00
  37.  
  38. alter table AUDIT_LOG_TEMP drop constraint PK_AUDIT_LOG;
  39.  
  40. Table altered.
  41.  
  42. ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID");
  43.  
  44. Table altered.
  45.  
  46. Elapsed: 00:00:00.09
  47.  
  48. select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG';
  49.  
  50. CONSTRAINT_NAME CONSTRAINT_TYPE STATUS TABLE_NAME OWNER
  51. --------------- --------------- ------------------------ --------------- ---------------
  52. PK_AUDIT_LOG P ENABLED AUDIT_LOG MIS_AUDIT
  53. SYS_C0011656 C ENABLED AUDIT_LOG MIS_AUDIT
  54. SYS_C0011657 C ENABLED AUDIT_LOG MIS_AUDIT
  55. SYS_C0011658 C ENABLED AUDIT_LOG MIS_AUDIT
  56. SYS_C0011659 C ENABLED AUDIT_LOG MIS_AUDIT
  57. SYS_C0011660 C ENABLED AUDIT_LOG MIS_AUDIT
  58. SYS_C0011661 C ENABLED AUDIT_LOG MIS_AUDIT
  59. SYS_C0011662 C ENABLED AUDIT_LOG MIS_AUDIT
  60. SYS_C0011663 C ENABLED AUDIT_LOG MIS_AUDIT
  61. SYS_C0011664 C ENABLED AUDIT_LOG MIS_AUDIT
  62.  
  63. 10 rows selected.
  64.  
  65. Elapsed: 00:00:00.01

参考

http://blog.itpub.net/23135684/viewspace-1765128/

http://www.askmaclean.com/archives/know-oracle-online-redefinition.html

http://debugo.com/%E4%BD%BF%E7%94%A8%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%AE%9A%E4%B9%89%E6%94%B9%E5%8F%98%E8%A1%A8%E7%9A%84%E6%89%80%E5%9C%A8%E8%A1%A8%E7%A9%BA%E9%97%B4/

http://blog.itpub.net/24930246/viewspace-2063727/

通过DBMS_REDEFINITION包对表在线重定义的更多相关文章

  1. dbms_redefinition在线重定义表结构 可以在表分区的时候使用

    dbms_redefinition在线重定义表结构 (2013-08-29 22:52:58) 转载▼ 标签: dbms_redefinition 非分区表转换成分区表 王显伟 在线重定义表结构 在线 ...

  2. dbms_redefinition在线重定义表结构

    dbms_redefinition在线重定义表结构 (2013-08-29 22:52:58) 转载▼ 标签: dbms_redefinition 非分区表转换成分区表 王显伟 在线重定义表结构 在线 ...

  3. 基于 dbms_redefinition 在线重定义表

    Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL.DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的.当然在线重定 ...

  4. Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

    实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/tes ...

  5. oracle在线重定义表

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

  6. 在线重定义(Rdefine Table online)

    二.        概念理解 在线重定义用于对表的逻辑或者物理结构的修改,而且在修改时不影响表的可用性与传统方式相比.当一个表被重定义时,会被锁定为exclusive mode很短一段时间,这段时间的 ...

  7. (Oracle)已有数据表建立表分区—在线重定义

    今天在做数据抽取的时候,发现有一张业务表数据量达到了5000W,所以就想将此表改为分区表.分区表的有点如下: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.2.增强可用性: ...

  8. oracle普通表转分区表(在线重定义方式)

    1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table(' ...

  9. Oracle 在线重定义表分区

    ==================原始表================原始表=====================原始表 create table BUILDING_temp(building ...

随机推荐

  1. 接口Interface的四种含义

    摘自<需求分析与系统设计(第3版)>第七章Q5 1. GUI——显示信息的计算机屏幕(注:其他终端) 2. API——是一套软件程序和开发工具,为应用程序提供函数调用,使程序可以访问一些级 ...

  2. JQGrid 在页面加载时展开SubGrid

    1.jqgrid在加载完成之后展开SubGrid,用得如下办法: gridComplete: function () { var rowIds = $("#list2").getD ...

  3. 1 --- Vue 基础指令

    1.vue 指令 1.v-model  主要在表单中使用,文本框.teaxare.单选.下拉 等 2.v-text   文本渲染  类似{{}} 3.v-show  控制Dom显示隐藏   displ ...

  4. Python 全集变量

    1.添加关键字: global 在要给变量从新赋值的时候添加. 全局变量都大写,局部变量都小写.

  5. python 传递多个参数

    def oper(a,*args): print(args) print(a) oper("q","s","d","z" ...

  6. springboot 解决配置js/css/img缓存问题

    # 解决配置js/css/img缓存问题 spring.resources.chain.strategy.content.enabled=true spring.resources.chain.str ...

  7. lua_call/lua_pcall/xpcall

    vs2013+lua5.3.3 1.涉及函数 主要C函数:lua_call和lua_pcall 主要lua函数xpcall 2.正常使用lua_call ①hello.lua文件内容 function ...

  8. Codeforces 374D - Inna and Sequence

    374D - Inna and Sequence 思路: 树状数组+二分 因为被删的点最多N=1e6个,所以复杂度N*logN*logN 前段时间做过一道一样的题,这类题基本套路二分找没删除前的位置 ...

  9. Asp.net core 学习笔记 ( ViewComponent 组件 )

    refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components core 和 Angular 的 comp ...

  10. (6)进程---Event事件

    # 阻塞事件 : e = Event()生成事件对象e e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False] e.wait(2) 传参 ...