在9204上快速刷新一个物化视图出现这个错误。
直接看例子吧:
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH ROWID, SEQUENCE (ID) INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> INSERT INTO T VALUES (1);
已创建 1 行。
SQL> INSERT INTO T VALUES (2);
已创建 1 行。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
2 AS SELECT ID, MIN(ID), COUNT(ID), COUNT(*), GROUPING(ID)
3 FROM T GROUP BY ROLLUP(ID);
实体化视图已创建。
SQL> INSERT INTO T VALUES (3);
已创建 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> DELETE T WHERE ID = 3;
已删除 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;
*
第 1 行出现错误:
ORA-00600: 内部错误代码,参数: [kkzgavupd_agg.2], [], [], [], [], [], [], []
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832
ORA-06512: 在line 1
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T', 'C')
PL/SQL 过程已成功完成。
这个物化视图并不算太复杂,虽然包含了ROLLUP和GROUPING,但是完全满足聚集类型物化视图快速刷新的条件,不过虽然物化视图的建立没有报错,对于基表数据插入也没有问题,但是在处理删除的时候,物化视图快速刷新报错,而完全刷新没有任何问题。
执行下面的过程需要首先建立MV_CAPABILITIES_TABLE表,方法是调用$ORACLE_HOME/rdbms/admin/utlxmv.sql。
SQL> BEGIN
2 DBMS_MVIEW.EXPLAIN_MVIEW('SELECT ID, MIN(ID), COUNT(ID), COUNT(*), GROUPING(ID)
3 FROM T GROUP BY ROLLUP(ID)');
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> SELECT CAPABILITY_NAME, POSSIBLE, RELATED_TEXT, MSGTXT FROM MV_CAPABILITIES_TABLE
2 WHERE CAPABILITY_NAME LIKE 'REFRESH%';
CAPABILITY_NAME P RELATED_TEXT MSGTXT
------------------------------ - ------------- --------------------------------------------
REFRESH_COMPLETE Y
REFRESH_FAST Y
REFRESH_FAST_AFTER_INSERT Y
REFRESH_FAST_AFTER_ONETAB_DML N MIN(ID) 实体化视图使用了 MIN 或 MAX 聚集函数
REFRESH_FAST_AFTER_ANY_DML N 查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因
REFRESH_FAST_PCT N PCT 不可能在实体化视图中的任何从表上
已选择6行。
在介绍聚集类型物化视图的快速刷新一文中已经提到了,其实单表的包含MAX和MIN的物化视图是可以支持任意的DML的,Oracle在这里的说明有误,具体可以参考:http://yangtingkun.itpub.net/post/468/16456
不过就算Oracle不支持查询这种物化视图刷新,也应该给出相应的错误信息,而不是直接报一个ORA-600的错误。
而且用kkzgavupd_agg.2作为关键字在METALINK和GOOGLE中都查询不到任何结果,看来这个错误很偏,几乎没有什么人碰到过。
SQL> DROP MATERIALIZED VIEW MV_T;
实体化视图已删除。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
2 AS SELECT ID, MIN(ID), COUNT(ID), COUNT(*), GROUPING_ID(ID)
3 FROM T GROUP BY ROLLUP(ID);
实体化视图已创建。
SQL> INSERT INTO T VALUES (3);
已创建 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> DELETE T WHERE ID = 3;
已删除 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;
*
第 1 行出现错误:
ORA-00600: 内部错误代码,参数: [kkzgavupd_agg.2], [], [], [], [], [], [], []
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832
ORA-06512: 在line 1
SQL> SELECT * FROM V$VERSION;
BANNER
---------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
尝试改变写法,仍然以这个600错误告终。下面看看Oracle的高版本是否解决了这个问题:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH ROWID, SEQUENCE (ID) INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> INSERT INTO T VALUES (1);
已创建 1 行。
SQL> INSERT INTO T VALUES (2);
已创建 1 行。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
2 AS SELECT ID, MIN(ID), COUNT(ID), COUNT(*), GROUPING(ID)
3 FROM T GROUP BY ROLLUP(ID);
实体化视图已创建。
SQL> INSERT INTO T VALUES (3);
已创建 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> DELETE T WHERE ID = 3;
已删除 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;
*
第 1 行出现错误:
ORA-12008: 实体化视图的刷新路径中存在错误
ORA-00600: 内部错误代码, 参数: [kkzgavupd_agg.2], [], [], [], [], [], [], []
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2254
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2460
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2429
ORA-06512: 在 line 1
10G中问题研究,最后看看11g是否解决了这个bug:
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH ROWID, SEQUENCE (ID) INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> INSERT INTO T VALUES (1);
已创建 1 行。
SQL> INSERT INTO T VALUES (2);
已创建 1 行。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
2 AS SELECT ID, MIN(ID), COUNT(ID), COUNT(*), GROUPING(ID)
3 FROM T GROUP BY ROLLUP(ID);
实体化视图已创建。
SQL> INSERT INTO T VALUES (3);
已创建 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> DELETE T WHERE ID = 3;
已删除 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 过程已成功完成。
SQL> SELECT * FROM V$VERSION;
BANNER
------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Solaris: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
11g终于解决了这个bug,最后检查一下物化视图刷新后数据是否正确:
SQL> SELECT * FROM T;
ID
----------
1
2
SQL> SELECT * FROM MV_T;
ID MIN(ID) COUNT(ID) COUNT(*) GROUPING(ID)
---------- ---------- ---------- ---------- ------------
1 1 1 1 0
2 2 1 1 0
1 2 2 1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-235584/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-235584/