我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

获取导致导入失败的数据(四)

上一篇 / 下一篇  2008-05-19 21:07:00 / 个人分类:ORACLE

前不久从一个数据库执行导出操作时报错,通过直接路径方式跳过后,导入时候再次报错。推测是由于源数据库出现的异常导致表中数据超过表定义的精度。

由于源数据库中错误记录已经被删除,因此只能想办法从导出的dmp文件中获取错误记录。

导出、导入过程的描述可以参考:

EXP9R2上导出时报错ORA-3113ORA-24324http://yangtingkun.itpub.net/post/468/460647

EXP9R2上导出时报错ORA-3113ORA-24324(二):http://yangtingkun.itpub.net/post/468/460831

继续探讨导致SQLPLUS程序崩溃的原因。

获取导致导入失败的数据:http://yangtingkun.itpub.net/post/468/461401

获取导致导入失败的数据(二):http://yangtingkun.itpub.net/post/468/461600

获取导致导入失败的数据(三):http://yangtingkun.itpub.net/post/468/461660

BEFORE触发器修正数据错误:http://yangtingkun.itpub.net/post/468/461506

 

 

在上面一篇文章中,通过修改表结构和设置触发器,最终使得异常数据成功插入。不过在查询异常数据时,导致了sqlplus程序的崩溃:

SQL> SELECT * FROM
De+T#?P6j2u0  2  (
%J*DrxT/O8j7K0  3     SELECT ROWNUM RN, TRADE_RATE, ORDER_AMOUONT, SEND_AMOUNT, RECEIVE_AMOUNT,ITPUB个人空间EX ?3fIW6s2?
  4     UNIT_PRICE, MAX_PRICE, MIN_PRICE, PRICE_RATE
F1_@K3W&l5g(R;[ Hd6S0  5     FROM SHGOV_ORDER
9Ru_W"e[0  6     WHERE ROWNUM < 31324ITPUB个人空间'xD$J.{0?'mN
  7  )ITPUB个人空间o2?o7U-dj6Ep V6b#`
  8  WHERE RN > 31322;

        RN TRADE_RATE ORDER_AMOUONT SEND_AMOUNT RECEIVE_AMOUNT UNIT_PRICE  MAX_PRICE  MIN_PRICE PRICE_RATE
9QOM1E3|9[0---------- ---------- ------------- ----------- -------------- ---------- ---------- ---------- ----------
a#}Sv DM&L0     31323 -5.353E+19    -3.120E+77  -5.054E+29     -5.300E+35 -1.952E-15 3.3295E-31         -~ -5.156E+23

*** glibc detected *** sqlplus: free(): invalid next size (normal): 0x000000001ca94a40 ***ITPUB个人空间 G'VK*^[]7e,O
======= Backtrace: =========ITPUB个人空间l5T&H+SS
/lib64/libc.so.6[0x3c0a66e8a0]ITPUB个人空间+uU-~/}hy/s:zT!z:Nv
/lib64/libc.so.6(cfree+0x8c)[0x3c0a671fbc]
Tc2r8r So0sqlplus(safifre+0xc)[0x42c69c]ITPUB个人空间!L9_F nB!Ui
sqlplus[0x423675]ITPUB个人空间/BT5qGw^a3Qi d
sqlplus[0x4155fa]ITPUB个人空间5It_P3ee#Ijb/kN
sqlplus[0x413a7b]
o%TrJ9FPU,o0sqlplus[0x419bba]
'HB2eH2^0sqlplus[0x433596]
)ng]qU R K_ }DElq0sqlplus[0x43253b]
f L)K?GG0sqlplus[0x408433]ITPUB个人空间.KD8j:j2vh
sqlplus[0x40780e]ITPUB个人空间'q/Mf%xP K-d X
/lib64/libc.so.6(__libc_start_main+0xf4)[0x3c0a61d8a4]ITPUB个人空间pWV-y%_
sqlplus[0x40773a]
U,RE C8`,]E x;z/v0======= Memory map: ========ITPUB个人空间Gw%p$LjN4p&N)\
00400000-00494000 r-xp 00000000 08:02 10031306                           /opt/oracle/product/9.2/bin/sqlplus
jdxM/DA000594000-0059b000 rwxp 00094000 08:02 10031306                           /opt/oracle/product/9.2/bin/sqlplusITPUB个人空间l~q"Z1ua(]_9NWL+f_
1ca33000-1cb16000 rwxp 1ca33000 00:00 0ITPUB个人空间 U1oZo~+W#g"k
3c0a200000-3c0a21a000 r-xp 00000000 08:02 3365501                        /lib64/ld-2.5.soITPUB个人空间fYLPiTQ U
3c0a419000-3c0a41a000 r-xp 00019000 08:02 3365501                        /lib64/ld-2.5.soITPUB个人空间 w0iv$S8X
3c0a41a000-3c0a41b000 rwxp0001a000 08:02 3365501                        /lib64/ld-2.5.soITPUB个人空间*B,}d+}8M[%H
3c0a600000-3c0a744000 r-xp 00000000 08:02 3365502                        /lib64/libc-2.5.so
2D[k`k/Z#U1L03c0a744000-3c0a944000 ---p 00144000 08:02 3365502                        /lib64/libc-2.5.so
,_-G yMO8R~`03c0a944000-3c0a948000 r-xp 00144000 08:02 3365502                        /lib64/libc-2.5.soITPUB个人空间tc'k/Q1W5?$@
3c0a948000-3c0a949000 rwxp 00148000 08:02 3365502                        /lib64/libc-2.5.soITPUB个人空间(W'L-]@k%eG\I4Q
3c0a949000-3c0a94e000 rwxp3c0a949000 00:00 0ITPUB个人空间WQ/},J#] k N!\v!k4ty
3c0aa00000-3c0aa82000 r-xp 00000000 08:02 3365504                        /lib64/libm-2.5.so
5\*D Si_ q D03c0aa82000-3c0ac81000 ---p 00082000 08:02 3365504                        /lib64/libm-2.5.soITPUB个人空间|`8m-y0sn_Fj
3c0ac81000-3c0ac82000 r-xp 00081000 08:02 3365504                        /lib64/libm-2.5.soITPUB个人空间1\d0fyn
3c0ac82000-3c0ac83000 rwxp 00082000 08:02 3365504                        /lib64/libm-2.5.so
"e|K%B)Q E8I~!Vb03c0ae00000-3c0ae02000 r-xp 00000000 08:02 3365505                        /lib64/libdl-2.5.soITPUB个人空间uP8S#Flu RA6H6S
3c0ae02000-3c0b002000 ---p 00002000 08:02 3365505                        /lib64/libdl-2.5.so
p;@FO'X%|0~j F03c0b002000-3c0b003000 r-xp 00002000 08:02 3365505                        /lib64/libdl-2.5.so
K_,O*Bne0El03c0b003000-3c0b004000 rwxp 00003000 08:02 3365505                        /lib64/libdl-2.5.soITPUB个人空间0e3^&K%Xh)c4imNA;kMm
3c0b200000-3c0b215000 r-xp 00000000 08:02 3365398                        /lib64/libpthread-2.5.so
SHZ o([h6}'F03c0b215000-3c0b414000 ---p 00015000 08:02 3365398                        /lib64/libpthread-2.5.soITPUB个人空间f RnS/Z4QB\
3c0b414000-3c0b415000 r-xp 00014000 08:02 3365398                        /lib64/libpthread-2.5.so
,I/T.k+G7HS"|K$K v5C03c0b415000-3c0b416000 rwxp 00015000 08:02 3365398                        /lib64/libpthread-2.5.soITPUB个人空间'k9I#}q,i1V
3c0b416000-3c0b41a000 rwxp3c0b416000 00:00 0ITPUB个人空间/LJ7F)F%|*L%h
3c0ca00000-3c0ca0d000 r-xp 00000000 08:02 3365507                        /lib64/libgcc_s-4.1.1-20070105.so.1ITPUB个人空间Z-e1h5S ku5{Z$I
3c0ca0d000-3c0cc0c000 ---p 0000d000 08:02 3365507                        /lib64/libgcc_s-4.1.1-20070105.so.1
8Qe*ekZGK9}c G03c0cc0c000-3c0cc0d000 rwxp0000c000 08:02 3365507                        /lib64/libgcc_s-4.1.1-20070105.so.1
)EPfj3?]03c11a00000-3c11a14000 r-xp 00000000 08:02 3365523                        /lib64/libnsl-2.5.so
!b kUhnz"~7{%W03c11a14000-3c11c13000 ---p 00014000 08:02 3365523                        /lib64/libnsl-2.5.soITPUB个人空间9H-wSpd7n~
3c11c13000-3c11c14000 r-xp 00013000 08:02 3365523                        /lib64/libnsl-2.5.so
j%H#_M#t{M03c11c14000-3c11c15000 rwxp 00014000 08:02 3365523                        /lib64/libnsl-2.5.soITPUB个人空间Nu M&b2iID
3c11c15000-3c11c17000 rwxp3c11c15000 00:00 0
q A@qW,v02aaaaaaab000-2aaaaaaad000 rwxp 2aaaaaaab000 00:00 0
\g-fL/kVL6U/ul02aaaaaaad000-2aaaab5fd000 r-xp 00000000 08:02 10162165                   /opt/oracle/product/9.2/lib/libclntsh.so.9.0ITPUB个人空间}8Kbu%Y R3z
2aaaab5fd000-2aaaab6fd000 ---p 00b50000 08:02 10162165                   /opt/oracle/product/9.2/lib/libclntsh.so.9.0ITPUB个人空间/_*@Q/eR*H/~'@R
2aaaab6fd000-2aaaab75c000 rwxp 00b50000 08:02 10162165                   /opt/oracle/product/9.2/lib/libclntsh.so.9.0
yzO|iU1LdL@[02aaaab75c000-2aaaab76f000 rwxp 2aaaab75c000 00:00 0ITPUB个人空间 _?])X-gE7D
2aaaab76f000-2aaaab771000 r-xp 00000000 08:02 10162044                   /opt/oracle/product/9.2/lib/libwtc9.so
*G9RQY8tU2pO0E uu02aaaab771000-2aaaab870000 ---p 00002000 08:02 10162044                   /opt/oracle/product/9.2/lib/libwtc9.so
/pxL7x`V*yJP02aaaab870000-2aaaab871000 rwxp 00001000 08:02 10162044                   /opt/oracle/product/9.2/lib/libwtc9.soITPUB个人空间,`f(J{n&f*Q
2aaaab871000-2aaaab894000 rwxp 2aaaab871000 00:00 0ITPUB个人空间.j ySSO jX] A1O
2aaaab895000-2aaaab8bf000 rwxp 2aaaab895000 00:00 0
BZx(RFl^02aaaab8e2000-2aaaab8ec000 r-xp 00000000 08:02 3365244                    /lib64/libnss_files-2.5.so
4PP-n#e fK-zkB02aaaab8ec000-2aaaabaeb000 ---p0000a000 08:02 3365244                    /lib64/libnss_files-2.5.so
"kS1J!Qbk02aaaabaeb000-2aaaabaec000 r-xp 00009000 08:02 3365244                    /lib64/libnss_files-2.5.so
CMM^'`#}02aaaabaec000-2aaaabaed000 rwxp0000a000 08:02 3365244                    /lib64/libnss_files-2.5.soITPUB个人空间-A(C/?G.hBt3R
2aaaac000000-2aaaac021000 rwxp 2aaaac000000 00:00 0
P:^;e y.}TD@ F02aaaac021000-2aaab0000000 ---p 2aaaac021000 00:00 0
8S^1k7uL5`r07fff2465d000-7fff24673000 rwxp 7fff2465d000 00:00 0                      [stack]
0KPj~fQ-b0ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vdso]
G[:VoO-H&_.Cda0Aborted

显然导致错误的原因是由于数据的异常,导致了Oracle在处理数据的时候,出现了内存冲突的问题,最终导致sqlplus程序的结束。参照上一篇文章,如果将这些异常的“数值”转化为字符串,并安装字符串类型来访问,并不会造成问题,而如果直接根据数值类型来访问这些异常的“数值”,就导致了问题的产生。

不过,如果因为数据异常就导致如此严重的程序崩溃,是否Oracle也太不健壮了,如果sqlplus给出错误信息,似乎比直接程序崩溃更合理一些。

根据这个信息查询metalink,发现了部分类似的情况,Oracle认为这并非是个bug,而是由于没有设置LD_ASSUME_KERNEL参数导致的。类似的描述可以参考:Doc ID: Note:352493.1

不过尝试了设置LD_ASSUME_KERNEL,发现这个方法似乎没有什么效果,依然造成了sqlplus程序的崩溃。

尝试了不同平台上的SQLPLUS客户端,发现表现也不相同。

10.2.0.3版本为例,linux 64-X86平台上的错误和上面的一致。

Solaris Sparc64则出现了下面的错误:

$ sqlplus test/test@172.25.198.230/bjtest

SQL*Plus: Release 10.2.0.3.0 - Production on星期三319 23:01:53 2008

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


N`]1w*P*VbD0
连接到:ITPUB个人空间)U zMC-ns }C
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
?/Y9H yU0Q2Z8u0With the Partitioning, OLAP and Oracle Data Mining optionsITPUB个人空间8} e0i_!l[T(HVg
JServer Release 9.2.0.4.0 - Production

SQL> SELECT * FROMITPUB个人空间O%s!ksn%o
  2  (ITPUB个人空间*K/aYhuW3D0t l
  3     SELECT ROWNUM RN, TRADE_RATE, ORDER_AMOUONT, SEND_AMOUNT, RECEIVE_AMOUNT,
&hF"L"x#Tg{1f0  4     UNIT_PRICE, MAX_PRICE, MIN_PRICE, PRICE_RATEITPUB个人空间;Y~?6eL[/zL
  5     FROM SHGOV_ORDERITPUB个人空间V N6@)` p
  6     WHERE ROWNUM < 31324
!\9ItuvageNR_f q0  7  )ITPUB个人空间[S.oI\c
  8  WHERE RN > 31322;

Segmentation Fault - core dumped

而对于Windows平台下的32sqlplus,似乎并没有引起任何的异常:

SQL> conn test/test@172.25.198.230/bjtestITPUB个人空间.JG.I K+Bd-s l { v
已连接。
K$GP3tbK6sD-c7T0SQL> SELECT * FROMITPUB个人空间Q5]LQ(A/v A r
  2  (
KhQ {/W0  3   SELECT ROWNUM RN, TRADE_RATE, ORDER_AMOUONT, SEND_AMOUNT, RECEIVE_AMOUNT,ITPUB个人空间'Th hg[$P
  4   UNIT_PRICE, MAX_PRICE, MIN_PRICE, PRICE_RATEITPUB个人空间?*VO5P/o]x }H%c
  5   FROM SHGOV_ORDERITPUB个人空间Jw(W!B4AF_zA
  6   WHERE ROWNUM < 31324
+v7{8B6\ bO0  7  )
H{v}`(m0  8  WHERE RN > 31322;

        RN TRADE_RATE ORDER_AMOUONT SEND_AMOUNT RECEIVE_AMOUNT UNIT_PRICE  MAX_PRICE  MIN_PRICE PRICE_RATEITPUB个人空间 ~7M%^ WL1m0| W;Gu
---------- ---------- ------------- ----------- -------------- ---------- ---------- ---------- ----ITPUB个人空间3l+u9Sp p)yW!swtz
     31323 -5.353E+19    -3.120E+77  -5.054E+29     -5.300E+35 -1.952E-15 3.3295E-31         -~ -5.156E+2

而且无论是windows下的sqlplusw工具,还是命令行sqlplus命令,都不会报错。看来似乎sqlplus客户端的保护代码还是windows环境下更好一些。

再次查询metalink,发现如果设置环境变量MALLOC_CHECK_=1,则sqlplus仍然会报错,但是不会导致程序的崩溃。

[oracle@bjtest ~]$ export MALLOC_CHECK_=1ITPUB个人空间I$zI:_;P8v R`
[oracle@bjtest ~]$ sqlplus test/testITPUB个人空间 }r:p6[ Hj
malloc: using debugging hooks

SQL*Plus: Release 9.2.0.4.0 - Production on星期一519 23:17:20 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

malloc: using debugging hooks

连接到:ITPUB个人空间/YD8C[ BQg1~
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
!~t v0iMx&^0With the Partitioning, OLAP and Oracle Data Mining options
b v%g lr5s ]ku0JServer Release 9.2.0.4.0 - Production

SQL> SET PAGES 100 LINES 120
,n_yr5^.u0SQL> SELECT * FROM
h)Ikghc0  2  (ITPUB个人空间7Ad'B)G2b~ C2i``'t
  3     SELECT ROWNUM RN, TRADE_RATE, ORDER_AMOUONT, SEND_AMOUNT, RECEIVE_AMOUNT,
ir)i$vY\ry0  4     UNIT_PRICE, MAX_PRICE, MIN_PRICE, PRICE_RATE
%f9u$tQLw A S}3]0  5     FROM SHGOV_ORDERITPUB个人空间&xpd;SfX
  6     WHERE ROWNUM < 31324
?[N\D,L+u&U0  7  )
6Gi g@ Y*i`/?|0  8  WHERE RN > 31322;

        RN TRADE_RATE ORDER_AMOUONT SEND_AMOUNT RECEIVE_AMOUNT UNIT_PRICE  MAX_PRICE  MIN_PRICE PRICE_RATE
8W#a4rK~"b0---------- ---------- ------------- ----------- -------------- ---------- ---------- ---------- ----------ITPUB个人空间Z,j5z$LU H D
     31323 -5.353E+19    -3.120E+77  -5.054E+29     -5.300E+35 -1.952E-15 3.3295E-31         -~ -5.156E+23

*** glibc detected *** sqlplus: free(): invalid next size (normal): 0x000000000457fd70 ***
'|i)?+t!yw_0*** glibc detected *** sqlplus: free(): invalid pointer: 0x000000000457fdd0 ***
4Gxfl J3L0g0SQL> SELECT * FROM DUAL;

D
t.mG:\9|r1}\0-
M.A*N}V8A0X

更多的相关描述可以参考:Bug No. 6074363

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar