在之前的文章中,我们看到了如何处理单表在线重定义过程。本篇我们来看一下如何进行关联表的重定义过程。

4、外键关系表重定义

我们先创建出实验数据表。

SQL> create table t_master as select owner, table_name, tablespace_name, status from dba_tables where 1=0;

Table created

SQL> alter table t_master add constraint pk_t_master primary key (owner, table_name);

Table altered

Executed in 0.125 seconds

SQL> create table t_slave as select owner, table_name, column_name from dba_tab_columns where 1=0;

Table created

SQL> alter table T_SLAVE

2    add constraint pk_t_slave primary key (OWNER, TABLE_NAME, COLUMN_NAME);

Table altered

Executed in 0.422 seconds

T_MASTER和T_SLAVE构成主子表关系,插入数据。

SQL> insert into t_master select owner, table_name, tablespace_name, status from dba_tables;

2841 rows inserted

Executed in 0.157 seconds

SQL> commit;

Commit complete

Executed in 0 seconds

SQL> insert into t_slave select owner, table_name, column_name from dba_tab_cols where (owner, table_name) in (select owner, table_name from dba_tables);

32388 rows inserted

Executed in 2.328 seconds

SQL> commit;

Commit complete

Executed in 0 seconds

SQL> alter table T_SLAVE

2    add constraint fk_t_slave_master foreign key (OWNER, TABLE_NAME)

3    references t_master (OWNER, TABLE_NAME);

Table altered

Executed in 0.266 seconds

创建interim中间表对象,主要目标是将数据表按照owner进行分区,转化为分区表。

SQL> create table t_master_interim

2  (owner varchar2(30),

3   TABLE_NAME      VARCHAR2(30),

4   TABLESPACE_NAME VARCHAR2(30),

5   STATUS          VARCHAR2(8)

6  )

7  partition by list(owner)

8  (

9     partition p1 values ('SYS'),

10     partition p2 values (default)

11  )

12  ;

Table created

Executed in 0.156 seconds

SQL> create table t_slave_interim

2  (owner varchar2(30),

3   table_name varchar2(30),

4   column_name varchar2(30)

5  )

6  partition by list(owner)

7  (

8     partition p1 values ('SYS'),

9     partition p2 values (default)

10  )

11  ;

Table created

Executed in 0.032 seconds

进入正式的重定义流程。这个过程,如果处于安全和顺序关系看,应该是先子表后主表似乎好一点。笔者选择了先主表后子表的方法。

--判断是否可以进行在线重定义过程;

SQL> set serveroutput on;

SQL> exec dbms_redefinition.can_redef_table('SCOTT','T_MASTER',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

Executed in 0.172 seconds

SQL> exec dbms_redefinition.can_redef_table('SCOTT','T_SLAVE',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

Executed in 0.015 seconds

T_MASTER表进行重定义过程。

SQL> exec dbms_redefinition.start_redef_table('SCOTT','T_MASTER','T_MASTER_INTERIM',col_mapping => 'owner owner, table_name table_name, tablespace_name tablespace_name, status status',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

Executed in 1.125 seconds

SQL> exec dbms_redefinition.sync_interim_table('SCOTT','T_MASTER','T_MASTER_INTERIM');

PL/SQL procedure successfully completed

Executed in 0.047 seconds

SQL>

SQL> set serveroutput on;

SQL> declare

2    error_count number:=0;

3  begin

4    dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T_MASTER',

5                                            int_table => 'T_MASTER_INTERIM',

6                                            copy_indexes => dbms_redefinition.cons_orig_params,

7                                            num_errors => error_count);

8    dbms_output.put_line(to_char(error_count));

9  end;

10  /

0

PL/SQL procedure successfully completed

Executed in 6.766 seconds

SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T_MASTER','T_MASTER_INTERIM');

PL/SQL procedure successfully completed

Executed in 1.75 seconds

进行T_SLAVE表重定义过程。

SQL> exec dbms_redefinition.start_redef_table('SCOTT','T_SLAVE','T_SLAVE_INTERIM',col_mapping => 'owner owner, table_name table_name, column_name column_name',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

Executed in 1.484 seconds

SQL> exec dbms_redefinition.sync_interim_table('SCOTT','T_SLAVE','T_SLAVE_INTERIM');

PL/SQL procedure successfully completed

Executed in 0.047 seconds

SQL>

SQL> set serveroutput on;

SQL> declare

2    error_count number:=0;

3  begin

4    dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T_SLAVE',

5                                            int_table => 'T_SLAVE_INTERIM',

6                                            copy_indexes => dbms_redefinition.cons_orig_params,

7                                            num_errors => error_count);

8    dbms_output.put_line(to_char(error_count));

9  end;

10  /

0

PL/SQL procedure successfully completed

Executed in 6.718 seconds

SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T_SLAVE','T_SLAVE_INTERIM');

PL/SQL procedure successfully completed

Executed in 1.75 seconds

最后,我们检查处理结果。

--分区处理成功;

SQL> select table_name, partition_name from dba_tab_partitions where table_owner='SCOTT' and table_name in ('T_MASTER','T_SLAVE');

TABLE_NAME                     PARTITION_NAME

------------------------------ ------------------------------

T_MASTER                       P1

T_MASTER                       P2

T_SLAVE                        P1

T_SLAVE                        P2

Executed in 0.031 seconds

约束中存在一些需要额外处理的地方。

SQL> select constraint_name, constraint_type, R_CONSTRAINT_NAME from dba_constraints where wner='SCOTT' and table_name in ('T_MASTER','T_SLAVE');

CONSTRAINT_NAME                CONSTRAINT_TYPE R_CONSTRAINT_NAME

------------------------------ --------------- ------------------------------

TMP$$_FK_T_SLAVE_MASTER0       R               TMP$$_PK_T_MASTER0

SYS_C0011276                   C

SYS_C0011275                   C

SYS_C0011274                   C

PK_T_SLAVE                     P

FK_T_SLAVE_MASTER              R               PK_T_MASTER

SYS_C0011272                   C

SYS_C0011271                   C

PK_T_MASTER                    P

9 rows selected

Executed in 0.141 seconds

由于是分别进行的重定义动作,中间可能有关联裹挟的情况,所以需要额外进行一些处理。主要目标是将Interim数据表删除掉。

SQL> drop table t_slave_interim;

Table dropped

Executed in 0.438 seconds

SQL> alter table t_slave drop constraint "TMP$$_FK_T_SLAVE_MASTER0";

Table altered

Executed in 0.031 seconds

SQL> drop table t_master_interim purge;

Table dropped

Executed in 0.094 seconds

检查约束情况。

SQL> select constraint_name, constraint_type, R_CONSTRAINT_NAME from dba_constraints where wner='SCOTT' and table_name in ('T_MASTER','T_SLAVE');

CONSTRAINT_NAME                CONSTRAINT_TYPE R_CONSTRAINT_NAME

------------------------------ --------------- ------------------------------

PK_T_MASTER                    P

PK_T_SLAVE                     P

FK_T_SLAVE_MASTER              R               PK_T_MASTER

SYS_C0011271                   C

SYS_C0011272                   C

SYS_C0011274                   C

SYS_C0011275                   C

SYS_C0011276                   C

8 rows selected

Executed in 0.125 seconds

重定义成功。

5、结论和讨论

Oracle在线重定义是一种非常强大的定义工具。这个系列只是介绍了该特性中最常用的一些流程和方法。其他一些诸如register对象和重命名的方法,在一些特定场合下有比较好的使用空间。

应该说,Oracle在线重定义是一种平滑性能、减少锁定、提高系统整体可用性的解决方案。从操作时间和空间消耗上,在线重定义并不具有很高的优势。对于7*24小时的系统,该特性是一种不错的选择。

Oracle Online Redefinition在线重定义(下)相关推荐

  1. linux下出现重定义,Oracle Online Redefinition在线重定义

    在线重定义特性进行数据表Online的结构变动操作.本篇我们从一个较复杂的案例出发,讨论复杂变化情况下如何进行Online Redefinition,以及dbms_redefinition包各个关键方 ...

  2. oracle 11g 通过在线重定义方式修改表结构

    今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为"0"的值进行抽取,抽取之后更新HAVE_FLAG为其他值, ...

  3. Oracle 11gR2 在线重定义(online redefinition)

    在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程,在此期间应用程序对该表的操作将失败.除了这个,如果用exp,我们也 ...

  4. Oracle在线重定义

    http://boylook.itpub.net/post/43144/520542 Oracle9i之前,表数据的整理是通过 alter table XXX move [tablespace XX] ...

  5. ORACLE 普通表转换成分区表(在线重定义)

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

  6. oracle 10g在线重定义新特性——关联对象自动重命名(二)

    9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义 ...

  7. oracle在线重定义(一)

    一.废话几句: 关于pd12导出图像, 首先ctrl+A全选 然后:edit->Export Image-->emf格式为默认,实则任选就OK了: 下午时隔4个月再次画ER图,相对的感觉要 ...

  8. 【转】Oracle在线重定义DBMS_REDEFINITION 普通表—分区表

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

  9. cmds在线重定义增加列

    --输出信息采用缩排或换行格式化 EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', T ...

最新文章

  1. codeforce843B Interactive LowerBound
  2. 高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...
  3. [html] HTML5的video怎么取消自动播放?
  4. Mr.J--Vue之v-for全解析
  5. atom上网本 安装linux,拆东墙补西墙?多数Atom上网本或将无法安装Windows 7
  6. winform自定义分页控件
  7. python保存后不运行_Python后台执行不启用缓存
  8. wp手机能装linux系统吗,老机焕新生!Lumia 950XL也能跑Win10
  9. 安装使用cuteFTP注意事项
  10. 系统日志查看journalctl命令详解
  11. 图像处理中二次曲线拟合
  12. 基于mochiweb的chatty聊天室1
  13. k8s-滚动更新与健康检查
  14. Leetcode 838. 推多米诺 C++
  15. centos怎么用命令关机_CentOS 6.5下关机与重启指令大全【原创】
  16. 2021-09-23 什么是图灵测试
  17. MySQL(17) 通过Docker搭建主从同步
  18. 终于搞清楚了,关于核心线程会不会回收
  19. 使用Javascript制作声音按钮 1
  20. 关于Java自己记不住和不知道的知识点

热门文章

  1. 输入输出,数据类型,运算符
  2. 5.Redis 发布订阅
  3. corosync/openais+pacemaker+drbd+web实现高可用群集
  4. (转)TinyXML Tutorial 中文指南
  5. c:forEach 取 map的值
  6. js页面排序-----基础篇
  7. 国内首本免费深度学习书籍!还有人没Get么?
  8. linux之find命令,Linux基础知识之find命令详解
  9. MySQL高级 - 索引的使用 - 覆盖索引
  10. ConcurrentHashMap的源码分析-put方法第三阶段