天天看点

使用10046事件跟踪sql定位错误一例

修改一个表时,发生如下错误:

SQL> update emp set ename='adsf';

update emp set ename='adsf'

       *

ERROR at line 1:

ORA-12096: error in materialized view log on "SCOTT"."EMP"

ORA-00942: table or view does not exist

这个提示看上去不太直观,好像是提示在物化视图日志不存在,查看一下该用户下的表:

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

ASDF                           TABLE

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

EMPLOYEES                      TABLE

LOB_TEST                       TABLE

MLOG$_BONUS                    TABLE

MLOG$_SALGRADE                 TABLE

MLOG$_T1                       TABLE

MV_T                           TABLE

PLAN_TABLE                     TABLE

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

RUPD$_BONUS                    TABLE

RUPD$_DEPT                     TABLE

RUPD$_EMP                      TABLE

RUPD$_SALGRADE                 TABLE

RUPD$_T1                       TABLE

SALES_COMPOSITE                TABLE

SALES_HASH                     TABLE

SALES_RANGE                    TABLE

SALGRADE                       TABLE

T                              TABLE

T1                             TABLE

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

TTT                            TABLE

T_T                            TABLE

V_EMP                          VIEW

V_T                            TABLE

26 rows selected.

并没有物化视图日志表MLOG$_EMP,估计有可能是在删除物化视图日志表时,直接使用了drop table MLOG$_EMP,而没有使用DROP MATERIALIZED VIEW LOG ON EMP,这就导致oracle在更新emp表时,试图去更改物化视图日志表,但发现物化视图日志表已经被删除,于是报错。为了证明上述猜想,用10046事件进行trace,得到如下trace内容:

=====================

PARSING IN CURSOR #1 len=27 dep=0 uid=21 ct=6 lid=21 tim=1198342181468910 hv=4011695554 ad='58aec934'

update emp set ename='adsf'

END OF STMT

PARSE #1:c=10000,e=2463,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=4,tim=1198342181468899

BINDS #1:

=====================

PARSE ERROR #2:len=168 dep=1 uid=0 ct=2 lid=0 tim=1198342181470293 err=942

INSERT INTO "SCOTT"."MLOG$_EMP" (dmltype$$,old_new$$,snaptime$$,change_vector$$) VALUES (:d,:o,to_date('4000-01-01:00:00:00','YYYY-MM-DD:HH24:MI:SS'),:c)

EXEC #1:c=0,e=3846,p=0,cr=3,cu=4,mis=0,r=0,dep=0,og=4,tim=1198342181472888

ERROR #1:err=12096 tim=2451155094

WAIT #1: nam='log file sync' ela= 34783 p1=750 p2=0 p3=0

WAIT #1: nam='SQL*Net break/reset to client' ela= 19 p1=1650815232 p2=1 p3=0

WAIT #1: nam='SQL*Net break/reset to client' ela= 135 p1=1650815232 p2=0 p3=0

WAIT #1: nam='SQL*Net message to client' ela= 2 p1=1650815232 p2=1 p3=0

*** 2008-11-19 08:52:04.253

WAIT #1: nam='SQL*Net message from client' ela= 322645203 p1=1650815232 p2=1 p3=0

STAT #1 id=1 cnt=0 pid=0 pos=1 bj=0 p='UPDATE  (cr=0 r=0 w=0 time=0 us)'

=====================

可以看出,红色字体部分正是导致出错的sql。

执行DROP MATERIALIZED VIEW LOG ON EMP,再进行update。

SQL> drop MATERIALIZED VIEW LOG ON emp;

Materialized view log dropped.

SQL> update emp set ename='adsf';

17 rows updated.

更新成功。

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

转载于:http://blog.itpub.net/10972173/viewspace-497869/