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

来源:互联网 发布:手机金属探测器软件 编辑:程序博客网 时间:2024/04/27 00:02

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> BEGIN2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');3 END;4 /PL/SQL 过程已成功完成。SQL> CREATE MATERIALIZED VIEW LOG ON T;实体化视图日志已创建。SQL> BEGIN2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');3 END;4 /BEGIN*1 行出现错误:ORA-12091: 不能联机重新定义具有实体化视图的表 "YANGTK"."T"ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1478ORA-06512: 在 line 2SQL> SELECT * FROM V$VERSION;BANNER---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 ProductionTNS for 32-bit Windows: Version 10.2.0.1.0 - ProductionNLSRTL 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> BEGIN2 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 - ProductionCORE 11.1.0.6.0 ProductionTNS for Linux: Version 11.1.0.6.0 - ProductionNLSRTL 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(*)---------- 23SQL> SELECT COUNT(*) FROM MV_T;COUNT(*)---------- 24SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID)2 PARTITIONS 43 AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2;表已创建。SQL> BEGIN2 DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER');3 END;4 /PL/SQL 过程已成功完成。SQL> VAR V_NUM NUMBERSQL> BEGIN2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER', COPY_MVLOG => TRUE, NUM_ERRORS => :V_NUM);3 END;4 /PL/SQL 过程已成功完成。SQL> PRINT :V_NUMV_NUM---------- 0SQL> SELECT COUNT(*) FROM T;COUNT(*)---------- 23SQL> SELECT COUNT(*) FROM T_INTER;COUNT(*)---------- 23SQL> DELETE T WHERE ID = 2;已删除 1 行。SQL> COMMIT;提交完成。SQL> BEGIN2 DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, 'T', 'T_INTER');3 END;4 /PL/SQL 过程已成功完成。SQL> SELECT COUNT(*) FROM T_INTER;COUNT(*)---------- 22SQL> BEGIN2 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_P45T SYS_P46T SYS_P47T SYS_P48SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;*1 行出现错误:ORA-12034: "YANGTK"."T" 上的实体化视图日志比上次刷新后的内容新ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2537ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2743ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2712ORA-06512: 在 line 1SQL> 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过程也添加了对物化视图日志拷贝的功能。

原创粉丝点击