案例:troubleshooting ORA-00600: internal error code, arguments: [25015] when drop tablespace

本案例来自北区某客户,数据库版本信息为AIX 7.1 RAC 11.2.0.4,在删除一个2T的空间时,报错ORA-00600。

看到ORA-00600,通常先去逛一下mos,发现25015没有查到任何相关文档,google也找了一圈也没有找到,没办法只能靠自己了。

通常ORA-00600的第一个Argument都有特殊的含义,要么是函数,要么是数字。通过第一个参数都可以缩小排查范围,例如本例的25015。

这属于一个表空间相关的报错,本身就要drop tablespace,这次这个信息有点鸡肋。

那么后面的Argument是什么意思呢?需要猜测了,第一反应就是肯定有一个是TS#。

运气不错,第二个参数一查就是要删除的表空间号。9和30暂时猜不出是啥意思,这个时候需要用到10046了,10046是分析此类问题的最大利器。

可以看到在连续的两个update file$和ts$后,开始读写控制文件之后报出了ORA-00600: internal error code, arguments: [25015], [13], [9], [30], [], [], [], [], [], [], [], []。这里猜测会不会是控制文件记录和数据字典记录不一致了呢?

发现果然不一致,正好file$少了一条记录并且file#是30,那么该600错误的第四个参数30的含义应该就是文件号,应该是有人去手动delete了file$删除了file$的记录。

知道原因的话处理起来就舒服多了,一般思路有四种。

  1. 闪回查询:通过闪回查询把删除的记录找回来,很不幸ORA-01555出现了。
  2. logminer:通过logminer找回delete file$的数据,但是并不知道是啥时候删除的。
  3. bbed:通过修改行头flag标识撤销delete操作,dump了block发现delete的行已经被覆盖了,因为客户又新建了100多个数据文件。
  4. 构造file#=30的记录插入file$,看来也只能用这种方法了。

看了一下file$的定义,构造一条记录太简单了,找一个同表空间的数据文件记录,修改一下file#、relfile#、crscnwrp、crscnbas即可,create scn在控制文件中也有记录,所以可以轻松的构造一条file#=30的记录插入到file$中。

操作步骤大致如下:

修改完成之后,为了保险起见,手动刷新两个节点的shared pool和db cache。

再次尝试删除成功。

强烈建议在不熟悉的情况下,不要轻易修改oracle的字典基表。本案例就是由于人为delete了file$记录引发的。

此条目发表在Oracle, Oracle troubleshooting分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注