ITPub博客

首页 > 数据库 > Oracle > 测试在线重定义

测试在线重定义

原创 Oracle 作者:parknkjun 时间:2015-07-01 12:55:01 0 删除 编辑
测试将手动段管理表空间上的表通过在线重定义迁移至自动段管理表空间
1、创建手动段管理表空间,自动段管理表空间
SYS@jzh>create tablespace MSSM datafile '/u01/app/oracle/oradata/jzh/mssm01.dbf' size 10M segment space management manual;

SYS@jzh>create tablespace ASSM datafile '/u01/app/oracle/oradata/jzh/assm01.dbf' size 10M segment space management auto;
2、在手动段管理表空间上创建测试表
JZH@jzh>create table t (x number constraint pk_t primary key) tablespace mssm;

Table created.

JZH@jzh>select segment_name,segment_type,tablespace_name from user_segments where tablespace_name in ('MSSM','ASSM');

SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME
-------------------- ------------------ ------------------------------
T                    TABLE              MSSM
PK_T                 INDEX              MSSM
3、创建中间表
JZH@jzh>create table t_ref tablespace assm as select * from t where 1=0;

Table created.
4、验证是否满足在线重定义条件
JZH@jzh>BEGIN
  2  DBMS_REDEFINITION.CAN_REDEF_TABLE('jzh','T',
  3        DBMS_REDEFINITION.CONS_USE_PK);
  4  END;
  5  /

PL/SQL procedure successfully completed.

5、开始在线重定义
JZH@jzh>BEGIN
  2  DBMS_REDEFINITION.START_REDEF_TABLE('jzh', 't','t_ref',
  3         null,dbms_redefinition.cons_use_pk);
  4  END;
  5  /

PL/SQL procedure successfully completed.
6、COPY约束
JZH@jzh>DECLARE
  2  num_errors PLS_INTEGER;
  3  BEGIN
  4  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('jzh', 't','t_ref',
  5     DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
  6  END;
  7  /

PL/SQL procedure successfully completed.
7、将中间表生成的索引rebuild至自动段管理的表空间
JZH@jzh>alter index TMP$$_PK_T0 rebuild tablespace assm;

Index altered.
8、同步数据
JZH@jzh>BEGIN 
  2  DBMS_REDEFINITION.SYNC_INTERIM_TABLE('jzh', 't', 't_ref');
  3  END;
  4  /

PL/SQL procedure successfully completed.
9、结束在线重定义
JZH@jzh>BEGIN
  2  DBMS_REDEFINITION.FINISH_REDEF_TABLE('jzh', 't', 't_ref');
  3  END;
  4  /

PL/SQL procedure successfully completed.
10、查询结果
JZH@jzh>select segment_name,segment_type,tablespace_name from user_segments where tablespace_name in ('MSSM','ASSM');

SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME
--------------------           ------------------ ------------------------------
T_REF                        TABLE              MSSM
T                              TABLE              ASSM
TMP$$_PK_T0            INDEX              MSSM
PK_T                         INDEX              ASSM

表T和索引PK_T已经迁移至assm表空间了!

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

请登录后发表评论 登录
全部评论
DBA攻城狮

注册时间:2008-02-11

  • 博文量
    115
  • 访问量
    625433