ITPUB??ì3
ITPUB论坛 » Oracle数据库管理 » 一次ora-01438错误的处理

离线 l_niu
海之鱼


精华贴数 5
个人空间 50
技术积分 3783 (345)
社区积分 11676 (118)
注册日期 2002-7-15
论坛徽章:12
现任管理团队成员2008北京奥运纪念徽章:跆拳道    
      

发表于 2008-3-19 10:16 
一次ora-01438错误的处理

昨天数据库出了个问题,俺这个非专业摸索了半天,终于解决了,把过程罗列出来,希望有人能用得上。
一、问题概述
在进行数据库例行维护时,遇到数据库正常导出,但导入时遇到有张表不能导入的问题。这张表存储工艺路线,大约共有160万条记录。表的不能导入影响一部分功能的实现,各单位反映强烈。
数据库系统:oracle 10.2.0.1 64bit for linux
操作系统:redhat 4 64bit
二、初步分析
首先排除是系统bug所带来的问题,因为前期导入导出未发现问题;另外由于是对同一数据库进行的导入导出,也排除了字符集问题。
单独再次导入此表,出现错误如下;
[oracle@zhx25 ~]$ imp system/ceshi fromuser=dba_mgr touser=dba_mgr tables=t_routdef ignore=y file=1.dmp

Import: Release 10.2.0.1.0 - Production on Tue Mar 18 14:19:49 2008

Copyright (c) 1982, 2005, Oracle.All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path
import done in ZHS16GBK character set and ZHS16GBK NCHAR character set
. importing DBA_MGR's objects into DBA_MGR
. . importing table "T_ROUTDEF"
IMP-00058: ORACLE error 1438 encountered
ORA-01438: value larger than specified precision allowed for this column
IMP-00028: partial import of previous table rolled back: 20501 rows rolled back

解决方向:有可能是数据中存在问题,很有可能是输入一些特殊字符,这些字符和ORACLE自身使用的通配符一致,所以导致系统不能识别。
三、问题解决
1、对问题进行跟踪
对系统设置1438 errorstack跟踪:
SQL> alter system set events='1438 trace name Errorstack forever,level 10';
System altered
然后重新执行IMP
2、查看UDUMP下日志,如下:
/opt/oracle/admin/orcl/udump/orcl_ora_32355.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
ORACLE_HOME = /opt/oracle/product/10.2.0
System name:Linux
Node name:zhx25.cccc.com
Release:2.6.9-22.ELsmp
Version:#1 SMP Mon Sep 19 18:00:54 EDT 2005
Machine:x86_64
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 17
Unix process pid: 32355, image: oracle@zhx25.cccc.com (TNS V1-V3)

*** SERVICE NAMESYS$USERS) 2008-03-18 17:11:02.014
*** SESSION ID135.949) 2008-03-18 17:11:02.014
*** 2008-03-18 17:11:02.014
ksedmp: internal or fatal error
ORA-01438: value larger than specified precision allowed for this column
Current SQL statement for this session:
INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T_ROUTDEF" ("PRTNO", "SEQNO", "SEQDESC", "PRTEFLAG", "SEQCC", "SEQNXTNO", "SEQDEPT", "WKCCODE", "WKCALTCODE", "SEQSETHR", "LAB_SEQSETHR", "SEQRUNHR", "LAB_SEQRUNHR", "SEQQUEHR", "LAB_SEQQUEHR", "SEQTRANHR", "LAB_SEQTRANHR", "SEQNOQLTRAT", "SEQCHGDAT", "SEQCHGRSN", "SEQCHGCTLR", "MACHCODE", "MACHALTCODE", "RESCODE", "KEYSEQ", "SEQCRYLOT", "INITOVERRATE", "COMWORK", "SEQLOTFLAG", "SEQEFDAT", "SEQIEFDAT", "SEQEFLOTNO", "SEQIEFLOTNO", "SEQECONO", "PRTSEQCST", "SEQSELFCST", "INVYORN", "SEQQTY", "SEQNOTE", "NOPRTAVELZ", "OUTSEQFLAG", "WXCST", "SEQGSCHGCTLR", "SEQGSCHGDAT", "SEQSHCTL", "SEQSHDAT", "SEQSHSIGN", "PRICE", "ACCNO", "ROUSTAT", "FIXMFLAG", "BANCL" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23, :24, :25, :26, :27, :28, :29, :30, :31, :32, :33, :34, :35, :36, :37, :38, :39, :40, :41, :42, :43, :44, :45, :46, :47, :48, :49, :50, :51, :52)
----- Call Stack Trace -----
calling
call
entry
argument values in hex

location
type
point
(? means dubious value)


…………


oacdef = 6a9477a0
Offsi = 48, Offsi = 1440


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a9477d0
Offsi = 48, Offsi = 1472


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a947800
Offsi = 48, Offsi = 1504


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a947830
Offsi = 48, Offsi = 1536


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a947860
Offsi = 48, Offsi = 1568


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a947890
Offsi = 48, Offsi = 1600


Opcode = 2
Bind Twotask Scalar Sql In (may be out) Copy


oacdef = 6a9478c0
Offsi = 48, Offsi = 1632

kkscoacd

Bind#0


oacdty=01 mxl=32(24) mxlc=00 mal=00 scl=00 pre=00


oacflg=03 fl2=1000010 frm=01 csi=852 siz=3344 off=0


kxsbbbfp=2a974dc398
bln=32
avl=23
flg=05


value="?




Bind#1


oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00


oacflg=03 fl2=1000000 frm=00 csi=00 siz=0 off=32


kxsbbbfp=2a974dc3b8
bln=22 avl=22 flg=01


value=###


An invalid number has been seen.Memory contents are :

Dump of memory from 0x0000002A974CDE88 to 0x0000002A974CDE9E
2A974CDE80 3331312E 0406C102 [.113....]
2A974CDE90 C9BBC6C8 52024D01 30310248 00003304[.....M.RH.10.3..]

Bind#2


oacdty=01 mxl=32(30) mxlc=00 mal=00 scl=00 pre=00


oacflg=03 fl2=1000010 frm=01 csi=852 siz=0 off=56


kxsbbbfp=2a974dc3d0
bln=32
avl=00
flg=01


Bind#3


oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00


oacflg=03 fl2=1000010 frm=01 csi=852 siz=0 off=88


kxsbbbfp=2a974dc3f0
bln=32
avl=01
flg=01


value="M"

…………
从跟踪文件可以看到,问题是系统认为地址为2A974CDE88的数值非法,在导入会提示ora-1438错误。本值在数据库中定义为number(8)类型,但从结果来看,系统把这个值当成了number(24)类型,并且由于格式不对,不能取出值。
3、找到DMP中相关数据
winhex打开dmp文件,搜索十六进制串“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”(对trace文件中的值要进行顺序调整),结果如下图:

4、对导出数据进行更改
由于“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”不是一个有效的number类型,需要对它进行调整。调整如下,只要确保调整的值是number类型的即可。

5、对数据库相关数据项的类型进行调整
把数据项的类型由number(*)改为number(38)
6、重新进行数据导入
[oracle@zhx25 ~]$ imp system/ceshi fromuser=dba_mgr touser=dba_mgr tables=t_routdef ignore=y file=1.dmp

Import: Release 10.2.0.1.0 - Production on Tue Mar 18 14:19:49 2008

Copyright (c) 1982, 2005, Oracle.
All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path
import done in ZHS16GBK character set and ZHS16GBK NCHAR character set
. importing DBA_MGR's objects into DBA_MGR
. . importing table
"T_ROUTDEF"
1646404

导入成功。


[ 本帖最后由 l_niu 于 2008-3-19 10:21 编辑 ]


__________________
每天要保持积极向上的心情!  You can win if you want!
只看该作者    顶部
离线 john_77
一般会员



精华贴数 0
个人空间 0
技术积分 615 (2957)
社区积分 10 (10095)
注册日期 2003-8-4
论坛徽章:4
授权会员     
      

发表于 2008-3-19 11:00 
学习了,以后说不定用的上


只看该作者    顶部
离线 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 12890 (83)
社区积分 1197 (775)
注册日期 2007-2-21
论坛徽章:37
现任管理团队成员地主之星蓝锆石萤石祖母绿海蓝宝石
紫水晶红宝石九尾狐狸紫蜘蛛玉石琵琶蓝色妖姬

发表于 2008-4-2 14:59 
3、找到DMP中相关数据
用winhex打开dmp文件,搜索十六进制串“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”

请教下楼主,这步是怎么得来的,从哪里看出要搜出这些字符串


__________________
慢和等待都是现象,不是原因,不能把现象当原因
只看该作者    顶部
离线 zuohao_lu
haorman



精华贴数 0
个人空间 530
技术积分 2927 (486)
社区积分 4844 (268)
注册日期 2007-11-13
论坛徽章:19
生肖徽章2007版:鼠     
      

发表于 2008-4-2 15:35 
收藏下.


只看该作者    顶部
离线 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 12890 (83)
社区积分 1197 (775)
注册日期 2007-2-21
论坛徽章:37
现任管理团队成员地主之星蓝锆石萤石祖母绿海蓝宝石
紫水晶红宝石九尾狐狸紫蜘蛛玉石琵琶蓝色妖姬

发表于 2008-4-2 15:47 
顶下


__________________
慢和等待都是现象,不是原因,不能把现象当原因
只看该作者    顶部
离线 l_niu
海之鱼


精华贴数 5
个人空间 50
技术积分 3783 (345)
社区积分 11676 (118)
注册日期 2002-7-15
论坛徽章:12
现任管理团队成员2008北京奥运纪念徽章:跆拳道    
      

发表于 2008-4-2 22:30 


QUOTE:
原帖由 棉花糖ONE 于 2008-4-2 14:59 发表
3、找到DMP中相关数据
用winhex打开dmp文件,搜索十六进制串“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”

请教下楼主,这步是怎么得来的,从哪里看出要搜出这些字符串

在udump文件中可找到下图的内容,画圈的就是这些字串,其中value=###的就是不能正确识别的数据项

[ 本帖最后由 l_niu 于 2008-4-2 22:32 编辑 ]




l_niu 上传了这个附件:
2008-4-2 22:30
未命名.GIF (7.07 KB)
 

__________________
每天要保持积极向上的心情!  You can win if you want!
只看该作者    顶部
离线 zergduan
生命如屎,臭而软弱~


来自 Beijing Massage Center
精华贴数 0
个人空间 120
技术积分 4720 (267)
社区积分 1 (36994)
注册日期 2005-5-16
论坛徽章:15
ITPUB元老2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:赛艇2008北京奥运纪念徽章:皮划艇激流回旋  
      

发表于 2008-4-2 22:49 
佩服~


__________________
只看该作者    顶部
离线 zergduan
生命如屎,臭而软弱~


来自 Beijing Massage Center
精华贴数 0
个人空间 120
技术积分 4720 (267)
社区积分 1 (36994)
注册日期 2005-5-16
论坛徽章:15
ITPUB元老2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:赛艇2008北京奥运纪念徽章:皮划艇激流回旋  
      

发表于 2008-4-2 23:01 
lz,说实话我一点都没看懂....
1.从跟踪文件可以看到,问题是系统认为地址为2A974CDE88的数值非法,在导入会提示ora-1438错误。本值在数据库中定义为number(8)类型,但从结果来看,系统把这个值当成了number(24)类型,并且由于格式不对,不能取出值。
能给讲讲,你怎么看出oracle把这个值当成了number(24)了么?
2.在udump文件中可找到下图的内容,画圈的就是这些字串,其中value=###的就是不能正确识别的数据项
你花圈的地方怎么就算出十六进制串“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”
了?

看着跟天书一样...


__________________
只看该作者    顶部
离线 bluemoon0083
大表哥


精华贴数 1
个人空间 0
技术积分 6202 (195)
社区积分 67 (3964)
注册日期 2005-12-29
论坛徽章:12
会员2007贡献徽章授权会员生肖徽章2007版:猪生肖徽章2007版:牛生肖徽章2007版:猴生肖徽章2007版:鸡
生肖徽章2007版:鼠ITPUB新首页上线纪念徽章生肖徽章:虎数据库板块每日发贴之星  

发表于 2008-4-2 23:19 
有些问题不懂问下哈

3、找到DMP中相关数据
用winhex打开dmp文件,搜索十六进制串“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”(对trace文件中的值要进行顺序调整)

--这里的值为什么是反过来的?dump出来的东西都要反过来看吗?

4、对导出数据进行更改
由于“2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF”不是一个有效的number类型,需要对它进行调整。调整如下,只要确保调整的值是number类型的即可。

--这里如何修改,修改后的值是什么样子的?另外修改完之后就用winhex保存一下就可以了就能直接imp成功了?

--另外发生这样的情况一般说明是dmp文件corrupt了?你这个情况就是坏了那一个地方,改一下就行了,如果很多地方都是value=###,这个时候应该就不适合手工来改了?


__________________
最近花太多的时间在linux上了,现正式回归oracle!
偶是新手,正在学习oracle+linux,如有说错的地方请批评指正!
只看该作者    顶部
离线 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 12890 (83)
社区积分 1197 (775)
注册日期 2007-2-21
论坛徽章:37
现任管理团队成员地主之星蓝锆石萤石祖母绿海蓝宝石
紫水晶红宝石九尾狐狸紫蜘蛛玉石琵琶蓝色妖姬

发表于 2008-4-2 23:26 
value=###这个我也trace到了,但是后面的2E313133 02C10604 C8C6BBC9 014D0252 48023130 0433F3FF 这些怎么得到的,以及最后是如何改的,希望楼主能说下更具体的过程,还有改了后这个column的数据应该是会没了吧


__________________
慢和等待都是现象,不是原因,不能把现象当原因
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问