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

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-235584/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-235584/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值