当前位置:  数据库>oracle

Oracle在线重定义

    来源: 互联网  发布时间:2017-06-20

    本文导语: 在线重定义[@more@]Oracle9i之前,表数据的整理是通过 alter table XXX move [tablespace XX]进行的。如果表非常大,IO又不快的时候,move的过程可能相当漫长,不能算是HA特性。因此在HA的在线维护中,基本不会利用move来重组大型表,而且mo...

在线重定义[@more@]Oracle9i之前,表数据的整理是通过 alter table XXX move [tablespace XX]进行的。如果表非常大,IO又不快的时候,move的过程可能相当漫长,不能算是HA特性。因此在HA的在线维护中,基本不会利用move来重组大型表,而且move后的表需要重建索引。而在9i引入的dbms_redefinition。该过程的内部原理其实就是采用了MV的机制,类似在原表建立一个prebuilt的MV然后一直增量刷新到数据差别最小。Oracle在很小的停顿中,完成最后一点的增量同步,达到完全同步后,把原表与新表换个名字,由于换名操作仅仅是数据字典,所以最终切换时间非常短。

--首先建立一个用来测试外键约束的表test_refed

SQL> create table test_refed(id number primary key);

Table created.

SQL> insert into test_refed select rownum from dba_objects where rownum commit;

Commit complete.

--创建我们准备修改表定义的表test,未分区

SQL> create table test(id number,fid number);

Table created.

SQL> insert into test select rownum,rownum from dba_objects where rownum commit;

Commit complete.

--添加主键约束以及外键约束,并在外键上建立索引

SQL> alter table test add constraint pk_test primary key(id);

Table altered.

SQL> alter table test add constraint fk_test_refed_id foreign key(fid) references test_refed(id);

Table altered.

SQL> create index idx_test_fid on test(fid);

Index created.

--创建基于test表的触发器

SQL> create trigger tr_test
 2 before insert on test for each row
 3 begin
 4 null;
 5 end;
 6 /

Trigger created.

--准备工作:调用dbms_redefinition.can_redef_table来验证boylook.test是否可以在线重定义。一般情况没有主键等会报错。
SQL> begin
 2 dbms_redefinition.can_redef_table('BOYLOOK','TEST');
 3 end;
 4 /

PL/SQL procedure successfully completed.

--创建需要重新定义的过渡表inter_test,这是一个分区表,以后将把原表所有数据在线转移到该表当中。注意到,该表比原表test还多一个字段c

SQL> create table inter_test(id number,fid number,c number)
 2 partition by range(id)
 3 (partition p1 values less than(400),
 4 partition p2 values less than(800),
 5 partition p3 values less than(maxvalue));

Table created.

SQL> alter table inter_test add constraint pk_inter_test primary key(id);

Table altered.

--执行在线重定义
注:调用这个存储过程需要create/alter/drop/lock/select any table权限

SQL> exec dbms_redefinition.start_redef_table('BOYLOOK','TEST','INTER_TEST','id id,fid fid,0 c');

PL/SQL procedure successfully completed.

--验证数据是否刷了过去
SQL> select count(*) from inter_test;

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

--继续对原表test进行操作
SQL> insert into test select rownum+1000,rownum+1000 from dba_objects where rownum commit;

Commit complete.

SQL> select count(*) from test;

 COUNT(*)
----------
 1024

SQL> select count(*) from inter_test;

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

--执行表同步
注:这一步不是必须的,但是对于比较大的表,中间运行增量同步有助于减少切换时间。

SQL> exec dbms_redefinition.sync_interim_table('BOYLOOK','TEST','INTER_TEST');

PL/SQL procedure successfully completed.

--我们发现数据同步的过来
SQL> select count(*) from inter_test;

 COUNT(*)
----------
 1024

--将原表test的约束,索引,触发器迁移过来
注:这里最好要检查一下授权。检查test以前的权限,并给中间表inter_test赋予同样的权限。否则原表的权限不会转移到新表
SQL> alter table inter_test add constraint fk_inter_refed_id foreign key(fid) references test_refed(id);

Table altered.

SQL> create index idx_inter_test_fid on inter_test(fid);

Index created.

SQL> create or replace trigger tr_inter_test
 2 before insert on inter_test for each row
 3 begin
 4 null;
 5 end;
 6 /

Trigger created.

--执行重定义完成的过程。Oracle完成了表test到表inter_test的换名工作,只是所有的约束,索引或触发器名称还是保持着原来表上面的名称

SQL> exec dbms_redefinition.finish_redef_table('BOYLOOK','TEST','INTER_TEST');

PL/SQL procedure successfully completed.

SQL> desc test;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
FID NUMBER
C NUMBER

SQL> desc inter_test;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
FID NUMBER

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

TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
TEST P1
TEST P2
TEST P3

SQL> select table_name,constraint_name,status from user_constraints where table_name in('TEST','INTER_TEST');

TABLE_NAME CONSTRAINT_NAME STATUS
------------------------------ ------------------------------ --------
INTER_TEST PK_TEST ENABLED
INTER_TEST FK_TEST_REFED_ID DISABLED
TEST PK_INTER_TEST ENABLED
TEST FK_INTER_REFED_ID ENABLED

SQL> select table_name,index_name from user_indexes where table_name in('TEST','INTER_TEST');

TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
TEST PK_INTER_TEST
TEST IDX_INTER_TEST_FID
INTER_TEST PK_TEST
INTER_TEST IDX_TEST_FID

SQL> select table_name,trigger_name from user_triggers where table_name in('TEST','INTER_TEST');

TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
TEST TR_INTER_TEST
INTER_TEST TR_TEST

SQL> select * from test where rownum drop table inter_test cascade constraints purge;

Table dropped.


    
 
 

您可能感兴趣的文章:

  • oracle异常(预定义异常,自定义异常)应用介绍
  • Oracle将查询的结果放入一张自定义表中并再查询数据
  • Oracle中用GROUPING SETS分组自定义汇总
  • Oracle返回表类型的自定义函数
  • 深入ORACLE变量的定义与使用的详解
  • Oracle中归档模式的定义简述
  • Oracle定义DES加密解密及MD5加密函数示例
  • Oracle10g 预定义主要角色
  • Oracle定义联合数组及使用技巧
  • 杀掉oracle在线用户脚本分享
  • shell如何获取oracle错误码 在线等
  • Oracle与JSDK4.0环境变量冲突,如何解决(在线等待)?
  • 请问,我如何在unix下用c/c++连结数据(oracle)??在线等待!!!!
  • 在线等待:用子线程与ORACLE数据库建立连接的问题。
  • 寻求在Linux 8.0上安装Oracle 9i的安装文档,分不够,可以再加,在线等待。。。
  • 安装ORACLE时的安装界面显示一堆乱码如何解决(我很菜的,分100可再加)---在线
  • 请教: Oracle数据库,谢谢!!!!在线
  • Linux下安装oracle的问题,在线急等,高手帮忙 !!!
  • solaris9下怎么查看oracle服务是否启动,以及怎么启动,在线等待。
  • FC6下安装Oracle9i错误,请高手指教 在线等 解决即结贴
  • oracle9i在linux9上安装的权限问题!在线等候!
  • ubuntu系统中运行java程序调用oracle 的sqlplus,为什么找不到sqlplus呢?在线等
  • 急!!!linux9下安装oracle9i在configuration Tool过程出现错误,在线等待,解决立即给分!
  • ORACLE数据库在线备份原理祥述
  • 取Oracle数据库中的中文数据乱码的问题!!急:在线等待
  • linux 环境下 odbc程序 往oracle数据库insert 中文 乱码问题,请教高手,急!!!!在线等~~
  • linux(redhat9)下安装oracle9。新手问题(急,在线等)
  • jsp显示oracle中varchar2类型字段 在线等待
  • jsp访问oracle超出打开游标的最大数是什么原因?急,在线给分。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3