yangtingkun
===========================================================
ORA-600(kkzgavupd_agg.2)错误
===========================================================

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 过程已成功完成。

这个物化视图并不算太复杂,虽然包含了ROLLUPGROUPING,但是完全满足聚集类型物化视图快速刷新的条件,不过虽然物化视图的建立没有报错,对于基表数据插入也没有问题,但是在处理删除的时候,物化视图快速刷新报错,而完全刷新没有任何问题。

执行下面的过程需要首先建立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行。

在介绍聚集类型物化视图的快速刷新一文中已经提到了,其实单表的包含MAXMIN的物化视图是可以支持任意的DML的,Oracle在这里的说明有误,具体可以参考:http://yangtingkun.itpub.net/post/468/16456

不过就算Oracle不支持查询这种物化视图刷新,也应该给出相应的错误信息,而不是直接报一个ORA-600的错误。

而且用kkzgavupd_agg.2作为关键字在METALINKGOOGLE中都查询不到任何结果,看来这个错误很偏,几乎没有什么人碰到过。

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

yangtingkun 发表于:2008.04.12 23:07 ::分类: ( ORACLE , Bug ) ::阅读:(451次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...