ORA-00600和ORA-08103错误处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iamlaosong/article/details/82868016

iamlaosong

工作需要每月将总部下发的结算数据导入到表中,然后进行统计清分。每个月的数据量很大,累计下来后数据量更大。用sqlldr导入数据速度比较快。本次用sqlldr导入8月结算数据后,进行统计时报错:ORA-00600: internal error code, arguments: [kcbz_check_objd_typ_3], [0], [0], [1], [], [], [], []。这不是第一次碰到这样的问题了,其实就是表中数据损坏了。首先想到的解决办法是删除这个表,重新导入数据,结果往往是又碰到这个问题。后来想到这可能是某些存储区域有问题,也就不再删除坏表了,解决办法如下:

1、通过日志知道计算到哪一步,再根据这一步涉及到的表,统计一下相关表的记录数就可以定位到表了。语句select count(*) from emsapp_js_jk_bcf 遍历整个表,碰到坏块就会报错。也可以加上时间条件:select count(*)  from emsapp_js_jk_bcf t where t.jsrq>=to_date('20180801','yyyymmdd')。修改时间条件可以定位到到哪一天的数据坏了。

2、将坏表改名,再创建新表并复制前几个月的数据(前几个月是好的,还是可以复制的:create table emsapp_js_jk_bcf as
(select * from emsapp_js_jk_bcf_bad t where t.jsrq<to_date(
'20180801','yyyymmdd')))。虽然可以通过条件查询定位到哪一天的数据坏了,但是这样比较麻烦,重新导入一个月的数据就行了,反正是电脑干活,不知道累的,呵呵。

3、用脚本tab_impsuan.sh(导入某个表某些天的数据)导入8月份的数据。

4、重新统计,问题解决。

同样的错误,有时提示:ORA-08103: object no longer exists,试着定位到哪一天,发现最早到9月3日数据有误,但检查4号以的数据,同样有误,所以坏的不止一天,按照上面的解决办法,重新导入3号以后的数据。

还有一个发现,就是出现上述错误的表都是用sqlldr导入的数据,以前用Pro*C写的导入程序导入的数据(一条一条的插入),没有发生过这样的问题。

猜你喜欢

转载自blog.csdn.net/iamlaosong/article/details/82868016