ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle实验记录 (在线重定义表)

oracle实验记录 (在线重定义表)

原创 Linux操作系统 作者:fufuh2o 时间:2009-09-14 16:31:56 0 删除 编辑


有以下几个功能
1.修改表storage参数,
2.移动到其它tablespace,
3.加parallelism 查询,
4.增加删除分区,
5.rebulid table减少碎片
6.HEAP TABLE 转为IOT(索引组织表,表就是index,index就是表)或反向操作,
7.add or drop一个列

 

主要就是使用下面的包
SQL> desc dbms_redefinition;
PROCEDURE ABORT_REDEF_TABLE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~强制退出
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 PART_NAME                      VARCHAR2                IN     DEFAULT
PROCEDURE CAN_REDEF_TABLE
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 TNAME                          VARCHAR2                IN
 OPTIONS_FLAG                   BINARY_INTEGER          IN     DEFAULT
 PART_NAME                      VARCHAR2                IN     DEFAULT
PROCEDURE COPY_TABLE_DEPENDENTS
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 COPY_INDEXES                   BINARY_INTEGER          IN     DEFAULT
 COPY_TRIGGERS                  BOOLEAN                 IN     DEFAULT
 COPY_CONSTRAINTS               BOOLEAN                 IN     DEFAULT
 COPY_PRIVILEGES                BOOLEAN                 IN     DEFAULT
 IGNORE_ERRORS                  BOOLEAN                 IN     DEFAULT
 NUM_ERRORS                     BINARY_INTEGER          OUT
 COPY_STATISTICS                BOOLEAN                 IN     DEFAULT
PROCEDURE FINISH_REDEF_TABLE
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 PART_NAME                      VARCHAR2                IN     DEFAULT
PROCEDURE REGISTER_DEPENDENT_OBJECT
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 DEP_TYPE                       BINARY_INTEGER          IN
 DEP_OWNER                      VARCHAR2                IN
 DEP_ORIG_NAME                  VARCHAR2                IN
 DEP_INT_NAME                   VARCHAR2                IN
PROCEDURE START_REDEF_TABLE
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 COL_MAPPING                    VARCHAR2                IN     DEFAULT
 OPTIONS_FLAG                   BINARY_INTEGER          IN     DEFAULT
 ORDERBY_COLS                   VARCHAR2                IN     DEFAULT
 PART_NAME                      VARCHAR2                IN     DEFAULT
PROCEDURE SYNC_INTERIM_TABLE
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 PART_NAME                      VARCHAR2                IN     DEFAULT
PROCEDURE UNREGISTER_DEPENDENT_OBJECT
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 UNAME                          VARCHAR2                IN
 ORIG_TABLE                     VARCHAR2                IN
 INT_TABLE                      VARCHAR2                IN
 DEP_TYPE                       BINARY_INTEGER          IN
 DEP_OWNER                      VARCHAR2                IN
 DEP_ORIG_NAME                  VARCHAR2                IN
 DEP_INT_NAME                   VARCHAR2                IN

 

关于重定义有2种方法
1.基于primary key(defalut方法)
2.基于rowid (IOT 不能用),重定义后会有一个隐藏列(M_row$$ ,保存表里面被操作行的ROWID,作用和PK是一样的)

过程是
先使用
1.dbms_redefinition.CAN_REDEF_TABLE 看看能 重定义不,比如少primary key,就报错
2.在一个schema中建立一个中间表(中间表建立为重定义后的结构,分区啊,加列啊之类)
3.dbms_redefinition.START_REDEF_TABLE执行重定义 ,要有原始表名,中间表名,列映射规则,重定义方法
关于映射规则:未提供规则,oracle 认为所有包括在中间表中的列用语表的重定义 若给出映射规则方法,只考虑规则方法中的列, 如果未给重定义方法 default使用primary
4.在中间表上建立index,trigger,constraint,然后授权,重定义完成时 中间表的上index ,trigger,constraint和授权 会替换到重定义表上 ,中间表中disable的约束在重定义表

中为enable
5.如果 dbms_redefinition.START_REDEF_TABLE 到FINISH_REDEF_TABLE期间有大量DML  这样的话可多执行几次SYNC_INTERIM_TABLE ,减少最后这步FINISH_REDEF_TABLE锁定表时

间
6. dbms_redefinition.finish_REDEF_TABLE~完成重定义,过程中原始表会被加上X LOCK 加的时间长短 和表数据量有关系
7.可以重新命名index,constraint ,trigger, 要是定义方法用了rowid会有m_row$$列,  可以alter table XX set unused m_row$$(先在数据字典标记未用) 后 drop unused

columns


完成之后原始表使用中间表的属性 进行重新定义,在中间表建立的index,trigger,constraint 和授权 原始表上的index,trigger,constraint(enable)在中间表drop时候也drop了,
中间表中 constraint disable 到原始表中为enable状态

 

具体实验

SQL> conn xh/a831115
已连接。
SQL> create table t1 (a int);

表已创建。

SQL>  declare
  2   begin
  3   for i in 1..1000 loop
  4   insert into t1 values(i);
  5   end loop;
  6   commit;
  7   end;
  8  /

PL/SQL 过程已成功完成。

SQL> alter table t1 add constraint pk_t primary key(a);

表已更改。
SQL>
SQL>  create or replace trigger tri_t1
  2   before insert on t1 for each row
  3   begin
  4   null;
  5   end;
  6  /

触发器已创建


建立中间表

  1* create table t2 (a int,b int )partition by range(a)(partition p1 values less t
han (100),partition p2 values less than (200),partition p3 values less than (maxval
ue))
  2  ;  小于100的在P1分区,小于200的在P2分区,其它在P3分区,还新加了一列 b

表已创建。
SQL> COL high_value format a30
SQL> select partition_name,high_value from user_tab_partitions where table_name='T2
';

PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------
P1                             100
P2                             200
P3                             MAXVALUE
SQL> alter table t2 add constraint pk_t2 primary key(a);

表已更改。


SQL> execute dbms_redefinition.CAN_REDEF_TABLE('XH','T1',DBMS_REDEFINITION.CONS_USE
_PK);

PL/SQL 过程已成功完成。~~~~~~~~~~~没错误 可以重定义


SQL> execute dbms_redefinition.START_REDEF_TABLE('XH','T1','T2','a a,0 b',DBMS_REDE
FINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。
关于列规则
 可以看 这个例子 'empno empno, ename ename, job job, deptno+10 deptno, 0 bonus'   empno列名没变  后两个一样, depton+10 deptno  列中数加10(还可以其它运算) 名

字没变,0 BOUNS
新加BOUNS列
SQL> select count(*) from t2;

  COUNT(*)
----------
      1000

 


SQL> insert into t1 values(1001);~~~~~~~~~~~~此时还有DML 继续操作原始表

已创建 1 行。

SQL> commit;

提交完成。

SQL> select count(*) from t2;

  COUNT(*)
----------
      1000

SQL> select count(*) from t1;

  COUNT(*)
----------
      1001

SQL> exec dbms_redefinition.sync_interim_table('XH','T1','T2');~同步一下下

PL/SQL 过程已成功完成。

SQL> select count(*) from t2;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  COUNT(*)
----------
      1001


给中间表 加trigger

  1   create or replace trigger tri_t2
  2     before insert on t1 for each row
  3     begin
  4     null;
  5*    end;
SQL> /

触发器已创建

SQL>  execute dbms_redefinition.FINISH_REDEF_TABLE('XH','T1','T2');~~~~~~~~~这是会LOCK 表(X)

PL/SQL 过程已成功完成。

SQL> desc t1;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 A                                         NOT NULL NUMBER(38)~~~~~~~~~~~~~~~~~~~~~~~~~转过来了
 B                                                  NUMBER(38)

SQL> desc t2;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 A                                         NOT NULL NUMBER(38)

SQL> select partition_name,high_value from user_tab_partitions where table_name='T2
';

未选定行
SQL> select partition_name,high_value from user_tab_partitions where table_name='T1
';

PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------
P1                             100
P2                             200
P3                             MAXVALUE

SQL> SELECT COUNT(*) FROM T1;

  COUNT(*)
----------
      1001

SQL> SELECT COUNT(*) FROM T2;

  COUNT(*)
----------
      1001


如果有CONSTRAINT的话也都转换了中间表DISABLE 到 原始表ENABLE
INDEX,TRIGGER 都会转换过来

参考

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#sthref2362

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12020513/viewspace-614620/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-26

  • 博文量
    182
  • 访问量
    471645