Oracle的在线重定义功能就是利用了物化视图的功能,通过物化视图日志的记录功能,来同步目标表和基表的数据。因此,在11g以前,建立了物化视图日志的表是无法进行在线重定义操作的:

SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A; 表已创建。 SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME); 索引已创建。 SQL> ALTER TABLE T ADD CONSTRAINTS PK_T PRIMARY KEY (ID); 表已更改。 SQL> BEGIN 2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T'); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> CREATE MATERIALIZED VIEW LOG ON T; 实体化视图日志已创建。 SQL> BEGIN 2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T'); 3 END; 4 / BEGIN *第 1 行出现错误: ORA-12091: 不能联机重新定义具有实体化视图的表 "YANGTK"."T" ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137 ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1478 ORA-06512: 在 line 2 SQL> SELECT * FROM V$VERSION; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production

在11g中,Oracle会利用现有的物化视图日志来完成在线重定义的功能。同时,物化视图日志也可以作为表的从属信息同步到目标上。不过在同步完成后,需要物化视图执行完全刷新。

SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A; 表已创建。 SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME); 索引已创建。 SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID); 表已更改。 SQL> CREATE MATERIALIZED VIEW LOG ON T; 实体化视图日志已创建。 SQL> BEGIN 2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T'); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> SELECT * FROM V$VERSION; BANNER ------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production PL/SQL Release 11.1.0.6.0 - Production CORE 11.1.0.6.0 Production TNS for Linux: Version 11.1.0.6.0 - Production NLSRTL Version 11.1.0.6.0 - Production

最后简单给出11g中包含物化视图日志的在线重定义操作步骤:

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS SELECT * FROM T; 实体化视图已创建。 SQL> DELETE T WHERE ID = 1; 已删除 1 行。 SQL> COMMIT; 提交完成。 SQL> SELECT COUNT(*) FROM T; COUNT(*) ---------- 23 SQL> SELECT COUNT(*) FROM MV_T; COUNT(*) ---------- 24 SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID) 2 PARTITIONS 4 3 AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2; 表已创建。 SQL> BEGIN 2 DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER'); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> VAR V_NUM NUMBER SQL> BEGIN 2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER', COPY_MVLOG => TRUE, NUM_ERRORS = > :V_NUM); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> PRINT :V_NUM V_NUM ---------- 0 SQL> SELECT COUNT(*) FROM T; COUNT(*) ---------- 23 SQL> SELECT COUNT(*) FROM T_INTER; COUNT(*) ---------- 23 SQL> DELETE T WHERE ID = 2; 已删除 1 行。 SQL> COMMIT; 提交完成。 SQL> BEGIN 2 DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, 'T', 'T_INTER'); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> SELECT COUNT(*) FROM T_INTER; COUNT(*) ---------- 22 SQL> BEGIN 2 DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER'); 3 END; 4 / PL/SQL 过程已成功完成。 SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T'; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ T SYS_P45 T SYS_P46 T SYS_P47 T SYS_P48 SQL> EXEC DBMS_MVIEW.REFRESH('MV_T') BEGIN DBMS_MVIEW.REFRESH('MV_T'); END; *第 1 行出现错误: ORA-12034: "YANGTK"."T" 上的实体化视图日志比上次刷新后的内容新 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2537 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2743 ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2712 ORA-06512: 在 line 1 SQL> EXEC DBMS_MVIEW.REFRESH('MV_T', 'C') PL/SQL 过程已成功完成。 SQL> DELETE T WHERE ID = 3; 已删除 1 行。 SQL> COMMIT; 提交完成。 SQL> EXEC DBMS_MVIEW.REFRESH('MV_T') PL/SQL 过程已成功完成。 SQL> SELECT * FROM MV_T WHERE ID = 3; 未选定行

11g在线重定义对物化视图日志进行了支持,同时COPY_TABLE_DEPENDENTS过程也添加了对物化视图日志拷贝的功能。

1

Oracle11g新特性:在线操作功能增强-Oracle11g在线重定义功能对物化视图... (转载)相关推荐

  1. 在线重定义生产环境大表分区的惨烈踩雷记录

    精彩预告:第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市朝阳区东三环中路61号富力万丽酒店盛大开启.本次大会邀请互联网领先企业的数据库专家,国产数据库的领军人物,云技术等领域的知名 ...

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

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

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

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

  4. Oracle11g新特性简介

    转 Oracle 11g 新特性简介https://blog.csdn.net/tianlesoftware/article/details/5134819  Oracle 11g于2007年7月11 ...

  5. oracle11g 新特性

    一.新特性提纲 1.数据库管理部分 ◆数据库重演(Database Replay)  这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测 ...

  6. oracle 分区表 变大,Oracle11G新特性:分区表分区默认segment大小64k变为8M

    Oracle11G新特性:分区表分区默认segment大小64k变为8M 2017-02-08 在oracle11.2创建分区表,每个分区默认大小为8M,是由_partition_large_exte ...

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

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

  8. animate inater插件_Indesign十款功能增强插件合集(Indesign功能增强插件)V1.0 正式版...

    Indesign十款功能增强插件合集(Indesign功能增强插件)是一款非常优秀好用的针对Indesign用户推出的增强部分功能的插件.小编带来的这款Indesign十款功能增强插件合集功能强大全面 ...

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

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

最新文章

  1. 设计模式11-桥接模式
  2. nginx 下配置使用Thinkphp5解决跨目录活动并且设置网站根目录
  3. php strpo函数,php strpos函数有什么用
  4. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp
  5. python下载哪个版本好-究竟哪个版本的Python是最快的?
  6. [iView warn]: please transfer a valid prop path to form item
  7. 计算机硬盘的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 酱茄社区论坛圈子小程序pro更新与WordPress开源版小程序下载
  9. SciPy安装超时(timed out)
  10. QT设置背景图片的3种方式 区别——设置样式表styleSheet
  11. 银河麒麟系统PDF转Word
  12. 怎么将多张图片打印在一张A4纸上?
  13. 砼匠商砼ERP大屏展示效果图
  14. 【第二届青训营-寒假前端场】- 「WebGL基础」笔记
  15. 驾驶证到期换证(SH)
  16. linux静态链接库添加,c-静态链接库时,出现链接器错误:找不到-...
  17. 4.编写一个程序来计算10000以内的素数之和并输出
  18. Linux命令之挂载文件系统mount
  19. performSelector 的使用
  20. 云南初中计算机考试试题,云南省初中学业水平考试信息技术复习+练习题

热门文章

  1. scala定义函数(六)
  2. vue函数如何调用其他函数?_编程|如何简单理解函数的传参、返回、调用
  3. nginx 和tomcat,apache的区别于联系。
  4. mysql meb安装_用meb搭建MySQL Master/Slave
  5. java 创建动态int数组_在Scala中创建动态增长数组的最佳方法是什么?
  6. [Unity脚本运行时更新]C#7.3新特性
  7. oracle不连续得时间如何分组,Oracle按不同时间分组统计的sql
  8. 使用BaaS更快地构建Xamarin应用程序
  9. 使C#代码现代化——第三部分:值
  10. 使用HP Vertica进行.NET编程