我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

Oracle11新特性——在线操作功能增强(六)

上一篇 / 下一篇  2007-10-05 00:00:00 / 个人分类:ORACLE

打算写一系列的文章介绍11g的新特性和变化。

11g中在线处理功能得到了很大增强,其中包括在线修改表结构,在线创建或重建索引,建立不可见索引,表增加非空字段,在线DDL以及对象依赖性细化等。

这一篇介绍Oracle11g在线重定义功能对物化视图日志的支持。

Oracle11新特性——在线操作功能增强(一):http://yangtingkun.itpub.net/post/468/400430

Oracle11新特性——在线操作功能增强(二):http://yangtingkun.itpub.net/post/468/401293

Oracle11新特性——在线操作功能增强(三):http://yangtingkun.itpub.net/post/468/401641

Oracle11新特性——在线操作功能增强(四):http://yangtingkun.itpub.net/post/468/402220

Oracle11新特性——在线操作功能增强(五):http://yangtingkun.itpub.net/post/468/402802

ITPUB个人空间!^1s]3nA:i Sp#P6h

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> BEGINITPUB个人空间 G_v-Y~Wv2oM
2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');
1Y;vl%js;_-T03 END;
%YK;z3M][04 /

PL/SQL 过程已成功完成。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> BEGINITPUB个人空间J+z)HbObW
2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');
(Pi8Cy-CF+uXn03 END;
U/dws{6A/k X04 /ITPUB个人空间#K^8G-^g#WRrr
BEGIN
jL5[ANIL0*
1 行出现错误:ITPUB个人空间{ m&dV*pmnD[
ORA-12091:
不能联机重新定义具有实体化视图的表
"YANGTK"."T"
4`&i:FM c$v ]#Q0ORA-06512:
"SYS.DBMS_REDEFINITION", line 137
%v}c;L#G K![(h0ORA-06512:
"SYS.DBMS_REDEFINITION", line 1478
TC@3h!L"J0ORA-06512:
line 2

ITPUB个人空间m k Bi)\(QM5S
SQL> SELECT * FROM V$VERSION;

BANNERITPUB个人空间f7A7x)~Nz9Y
----------------------------------------------------------------ITPUB个人空间!?;lR:q!Z9c'j6]
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
"WJj_$B(V0PL/SQL Release 10.2.0.1.0 - ProductionITPUB个人空间wmr%[/v'o(Ev;m
CORE 10.2.0.1.0 ProductionITPUB个人空间U Cij!m9w&N i[1g
TNS for 32-bit Windows: Version 10.2.0.1.0 - ProductionITPUB个人空间_ \k@w%iz
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
/vp0s@ ah7e02 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');ITPUB个人空间6d]id8[a%X X Q
3 END;ITPUB个人空间*a4?*d!\(R,[3z d l
4 /

PL/SQL 过程已成功完成。

SQL> SELECT * FROM V$VERSION;

BANNERITPUB个人空间a6Yz8P:@:xEH
-------------------------------------------------------------------------
M? Y!i-V0Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 -
Production PL/SQL Release 11.1.0.6.0 - Production
*JA:V$S`UL0CORE 11.1.0.6.0 Production
.dX&PR@0TNS for Linux: Version 11.1.0.6.0 - ProductionITPUB个人空间L)jT\@;SE
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(*)
.B u@^Z%Z6I0----------ITPUB个人空间/ex)G:vQ+z
23

SQL> SELECT COUNT(*) FROM MV_T;

COUNT(*)ITPUB个人空间;B h,} RZ_
----------ITPUB个人空间m-NOgC6LK
24

SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID)ITPUB个人空间(Eb7WDn,o
2 PARTITIONS 4
t wZL-P5|1CZ4F6y;olQ03 AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2;

表已创建。

SQL> BEGINITPUB个人空间5Th!RK,x7b+i i;F
2 DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER');ITPUB个人空间[C*q(xykw h
3 END;
*LzI*? X,j(E]04 /

PL/SQL 过程已成功完成。

SQL> VAR V_NUM NUMBERITPUB个人空间t0w0XW5\#B?
SQL> BEGINITPUB个人空间-^vWCp7nt6H-@0j k
2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER', COPY_MVLOG => TRUE, NUM_ERRORS =ITPUB个人空间6D`z%} gc
> :V_NUM);
Ne2np*]03 END;
Q7gy)x SF%{J04 /

PL/SQL 过程已成功完成。

SQL> PRINT :V_NUM

V_NUMITPUB个人空间k6d T0Z5z
----------
Xv)}Il\00

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
$Z'vw.n M[L0----------
U9QLo|j023

SQL> SELECT COUNT(*) FROM T_INTER;

COUNT(*)
L#Ao#r wZG i[_;O0----------ITPUB个人空间,aauDpn c
23

SQL> DELETE T WHERE ID = 2;

已删除 1 行。

SQL> COMMIT;

提交完成。

SQL> BEGIN
AM.{3F0x02 DBMS_REDEFINITION.SYNC_INTERIM_TABLE(USER, 'T', 'T_INTER');
Zr(~F$Vp)M F03 END;
[6dn[I8ba3R04 /

PL/SQL 过程已成功完成。

SQL> SELECT COUNT(*) FROM T_INTER;

COUNT(*)
3Py6y8Gh a$w0----------
o"GR6S1|$~Fe0N022

SQL> BEGINITPUB个人空间 C hh5b GCT
2 DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER');
$?8y-L5\F;wz03 END;
%P|1m$P0V.D6X04 /

PL/SQL 过程已成功完成。

SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T';

TABLE_NAME PARTITION_NAMEITPUB个人空间E%r,z8a,Em7iyt3I
------------------------------ ------------------------------ITPUB个人空间!U {%CxTy|z
T SYS_P45
8}9\lc.~7\h0T SYS_P46ITPUB个人空间\6pQ/U)l[
T SYS_P47
NE{1x ?U9s:O1}X0T SYS_P48

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')ITPUB个人空间'B+zF&BB(yQ]&R
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;

* 1 行出现错误:ITPUB个人空间Yo4b,@#L7z"fL
ORA-12034: "YANGTK"."T"
上的实体化视图日志比上次刷新后的内容新

o:C xz7k$oD}0ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2537ITPUB个人空间R!l jh7b+BW
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2743ITPUB个人空间k!p`/Lt.c#I|c
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2712ITPUB个人空间kYa#[7Cp
ORA-06512:
line 1

ITPUB个人空间4hJ-Q'n}
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过程也添加了对物化视图日志拷贝的功能。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar