阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ORA-01410故障解决实例

116次阅读
没有评论

共计 2155 个字符,预计需要花费 6 分钟才能阅读完成。

在一个表上建索引时,报 ORA-01410 错误,我们查询这个表来重现这个错误:

Connected to: 
Oracle9i Enterprise Edition Release 9.2.0.6.0 – 64bit Production 
With the Partitioning option 
JServer Release 9.2.0.6.0 – Production 
 
SQL> set timing on 
SQL> set time on 
14:20:03 SQL> select /*+ full(a) no_index(a) */ count(*) from crm.cust_order a; 
select /*+ full(a) no_index(a) */ count(*) from crm.cust_order a 
                                                    * 
ERROR at line 1: 
ORA-01410: invalid ROWID 

ORA-01410 错误通常见于通过索引访问表,而索引或表由逻辑上的损坏。而这里显示没有通过索引访问表?那问题出在哪里呢?在这种情况下,这个错误与 ORA-08103 极其类似,

14:27:00 SQL> alter session set max_dump_file_size=unlimited; 
 
Session altered. 
 
Elapsed: 00:00:00.01 
14:27:18 SQL> alter session set db_file_multiblock_read_count=1; 
 
Session altered. 
 
Elapsed: 00:00:00.00 
14:27:18 SQL> alter session set events ‘immediate trace name trace_buffer_on level 1048576’; 
 
Session altered. 
 
Elapsed: 00:00:00.00 
14:27:18 SQL> alter session set events ‘10200 trace name context forever, level 1’; 
 
Session altered. 
 
Elapsed: 00:00:00.00 
14:27:18 SQL> select /*+ full(a) no_index(a) */ count(*) from crm.cust_order a; 
ERROR at line 1: 
ORA-01410: invalid ROWID 
 
Elapsed: 00:05:50.82 
14:33:09 SQL> 14:33:09 SQL> alter session set events ‘immediate trace name trace_buffer_off’; 
 
Session altered. 

在 trace 文件的最后,我们可以看到:

Consistent read started for block 10 : 2489c394 
  env: (scn: 0x0a0d.690ff414  xid: 0x0000.000.00000000  uba: 0x00000000.0000.00  statement num=0  parent xid: xid: 0x0000.000.000000 
00  scn: 0x0000.00000000 0sch: scn: 0x0000.00000000) 

这里只有”start“,而没有 finish,表明在读 2489c394 这个块出了问题。
用 ODU 工具的 rdba 查看文件号和坏号:

ODU> rdba 2489c394 
 
  rdba  : 0x2489c394=613008276 
  rfile# : 146 
  block# : 639892 

通过”alter sytem dump datafile 146 block 639892”命令发现块中的 object_id 与 CUST_ORDER 表的 data object id 不同,看起来这就是问题所在(此处不再列出数据)。
看起来有坏块了。不过这个库是个查询库,把表 TRUNCATE 之后重新从生产库同步过来,发现问题仍然存在,甚至把表 DROP 之后重建也是如此,均是发生在 146/639892 这个块上。

而 TRUNCATE/DROP 表都不能解决问题,显然这个块还在内存中,看起来需要刷新 buffer cache 了:

14:37:07 SQL> alter session set events ‘immediate trace name flush_cache level 1’; 
Session altered. 

刷新 buffer cache 后,问题解决。

总结:这个问题,与 ORA-8103 类似,都是出现了逻辑坏块, 只不过这次的坏块是发生在内存中的块。至于坏块是怎么进入到内存中,为什么在重建表后还在内存中,这就是个谜了,或者是 ORACLE 的 BUG,或者跟用的同步软件 DSG 有关。在这个案例中,块的 object_id 与段的实际的 data object id 不一致。而 object_id 不一致有时也会报 ORA-600 错误。

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/137544.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2155字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中