暂无图片
分享
林少杰
2020-02-12
ORA-07445 [_wordcopy_fwd_dest_aligned()+251] [SIGSEGV]错误

一个数据库前台进程在执行update操作期间出现ORA-7445[_wordcopy_fwd_dest_aligned]后挂起,等待事件为ON CPU。阻塞了其他进程,kill该进程后恢复。

收藏
分享
12条回答
默认
最新
林少杰
上传附件:tltdbonl_ora_28429.trc
暂无图片 评论
暂无图片 有用 0
林少杰
暂无图片 评论
暂无图片 有用 0
章芋文

上传下这个trace文件。
/oracle/app/diag/rdbms/tltdbonl/tltdbonl/incident/incdir_147734/tltdbonl_ora_28429_i147734.trc

暂无图片 评论
暂无图片 有用 0
章芋文

应该是数据异常致的报错,找应用确认下如下几个绑定变量的值。

update acct set balance=balance+:1 ,drbal=drbal+:2 ,crbal=crbal+:3 ,lastday=:4 ,updatetime=sysdate where acctno=:5

然后查询下如下SQL:

select balance,drbal,crbal,lastday from acct where acctno=:5 select balance+:1 ,drbal+:2 ,crbal+:3 ,lastday ,updatetime where acctno=:5
暂无图片 评论
暂无图片 有用 0
林少杰

因为日志记录内容的原因,可能会找不到相关变量值。能否提供一个相关例子?

暂无图片 评论
暂无图片 有用 0
章芋文

trace中找到了
----- Bind Info (kkscoacd) -----
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=852 siz=224 off=0
kxsbbbfp=7f402b5146f0 bln=22 avl=03 flg=05
value= -10000000
Bind#1
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=852 siz=0 off=24
kxsbbbfp=7f402b514708 bln=22 avl=02 flg=01
value=10000000
Bind#2
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=852 siz=0 off=48
kxsbbbfp=7f402b514720 bln=22 avl=01 flg=01
value=0
Bind#3
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000000 frm=01 csi=852 siz=0 off=72
kxsbbbfp=7f402b514738 bln=22 avl=05 flg=01
value=20200212
Bind#4
oacdty=01 mxl=128(40) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=852 siz=0 off=96
kxsbbbfp=7f402b514750 bln=128 avl=20 flg=01
value= “20191100000000754498”

暂无图片 评论
暂无图片 有用 0
林少杰

SQL> select balance,drbal,crbal,lastday from tltdbuser.acct where acctno=‘20191100000000754498’;

BALANCE DRBAL CRBAL LASTDAY


     0 1.3001E+11 1.3001E+11   20200212

SQL> select balance-10000000 ,drbal+10000000 ,crbal+0 ,lastday ,updatetime from tltdbuser.acct where acctno=‘20191100000000754498’;

BALANCE-10000000 DRBAL+10000000 CRBAL+0 LASTDAY UPDATETIME


   -10000000     1.3002E+11 1.3001E+11   20200212 12-FEB-20 07.38.48.000000 PM
暂无图片 评论
暂无图片 有用 0
章芋文

:1=-10000000
set balance=balance+:1
这里处理下吧

暂无图片 评论
暂无图片 有用 0
林少杰

variable x number;
SQL> exec :x := -10000000;

PL/SQL procedure successfully completed.

SQL> select balance,drbal,crbal,lastday from tltdbuser.acct where acctno=‘20191100000000754498’;

BALANCE DRBAL CRBAL LASTDAY


     0 1.3015E+11 1.3015E+11   20200213

SQL> select balance+:x ,drbal+10000000 ,crbal+0 ,lastday ,updatetime from tltdbuser.acct where acctno=‘20191100000000754498’;

BALANCE+:X DRBAL+10000000 CRBAL+0 LASTDAY UPDATETIME


-10000000 1.3016E+11 1.3015E+11 20200213 13-FEB-20 09.06.00.000000 AM

暂无图片 评论
暂无图片 有用 0
林少杰

value= “20191100000000754498” ,这种有双引号的变量值是正常的吗。

暂无图片 评论
暂无图片 有用 0
林少杰

按照调用堆栈,一个个查找与ORA-7445相关的bug,目前查到一个关于upduaw的,不知道能否关联到一起:
Bug 17809973 - ORA-7445 [upduaw] (文档 ID 17809973.8)-----
Symptoms:
Related To:
Process May Dump (ORA-7445) / Abend / Abort
Dump in or under upduaw
Optimizer
Triggers
_optimizer_unnest_disjunctive_subq
Description
ORA-7445 for DML statement when a target of the DML operation has a correlation
in disjunctive subquery with “_optimizer_unnest_disjunctive_subq”=TRUE

Rediscovery Notes
The target of the DML has a trigger

Workaround
Run with “_optimizer_unnest_disjunctive_subq”=FALSE

在这个ACCT表上存在两个触发器:
TRIGGERUPDATEDIARY — before insert or update on acct for each row 这个是按规则去操作其他表的,其中有
update设置 acctno=:new.acctno的内容;
ADDACCT — AFTER INSERT on ACCTPROP for each row 这个只是插入,应该无关。

暂无图片 评论
暂无图片 有用 0
林少杰
问题已关闭: 没有解决方案
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
附件列表
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏