日期:2014-05-16  浏览次数:20473 次

ORA-00471 处理方法笔记
  公司新上架一台服务到机房,硬件是IBM X3850 X5,硬件配置算是好的,内存有128GB。SA安装好系统--(版本sule 32bit)后通知我可以安装数据库了。忙活半天,安装好Oracle 9204后,准备建表空间导入数据。因为数据量比较大,我打算建立一个10G的数据文件用来存储这写数据。打入创建表空间的命令后,没过多久数据库出现宕机现象。后来我又重新操作一遍还是故障依旧。以下是日志信息:

  alert.log:

  Errors in file /u01/oracle/admin/orcl/bdump/orcl_pmon_13918.trc:

  ORA-00471: DBWR process terminated with error

  Wed Aug 21 15:56:16 2013

  PMON: terminating instance due to error 471

  Instance terminated by PMON, pid = 13918

  trace file:

  /u01/oracle/admin/orcl/bdump/orcl_pmon_13918.trc

  Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

  With the Partitioning, OLAP and Oracle Data Mining options

  JServer Release 9.2.0.4.0 - Production

  ORACLE_HOME = /u01/oracle/product/9.2.0

  System name: Linux

  Node name: dbprod

  Release: 2.6.27.19-5-pae

  Version: #1 SMP 2009-02-28 04:40:21 +0100

  Machine: i686

  Instance name: orcl

  Redo thread mounted by this instance: 1

  Oracle process number: 2

  Unix process pid: 13918, image: oracle@dbprod (PMON)

  *** 2013-08-21 15:56:16.296

  *** SESSION ID:(1.1) 2013-08-21 15:56:16.277

  error 471 detected in background process

  ORA-00471: DBWR process terminated with error

  /var/log/messages:

  Aug 21 14:01:14 dzjg kernel: lowmem_reserve[]: 0 872 62301 62301

  Aug 21 14:01:14 dzjg kernel: Node 0 Normal free:3704kB min:3744kB low:4680kB high:5616kB active:3096kB inactive:3092kB present:893200kB

  …

  …

  Aug 21 14:01:14 dzjg kernel: Out of memory: kill process 12867 (oracle) score 414016 or a child

  Aug 21 14:01:14 dzjg kernel: Killed process 12867 (oracle)

  初步判断是系统内存不够,但是通过free -m查看系统有60G的内存。通过上网查阅相关文档对故障分析如下:

  1.出现故障的原因:

  在32位CPU下寻址范围是有限的,Linux内核定义了下面三个区域:

  # DMA: 0x00000000 - 0x00999999 (0 - 16 MB)

  # LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB

  # HighMem: 0x038000000 - (由服务器硬件决定 )

  在 32位系统中,内存被分为 以上3 个区域,DMA zone,Normal zone(也叫做LowMem)和 HighMem zone其中 DMA zone主要用于 DMA 传输数据,位于低地址空间,其服务对象为各种驱动程序,其大小为 16MB,其中 LowMem (也叫做Normal zone)是 kernel 可以直接访问的地址空间,其大小为 880 MB,基本上所有的内核数据都在这个区域,同时如果内核要访问更高地址空间的内容,均需要通过 Normal zone映射过去才可以。地址空间大于 880 MB 的为 HIghMem zone.

  截取的系统日志如下:

  Aug 21 14:01:14 dzjg kernel: lowmem_reserve[]: 0 872 62301 62301

  Aug 21 14:01:14 dzjg kernel: Node 0 Normal free:3704kB min:3744kB low:4680kB high:5616kB active:3096kB inactive:3092kB present:893200kB

  …

  …

  Aug 21 14:01:14 dzjg kernel: Out of memory: kill process 12867 (oracle) score 414016 or a child

  Aug 21 14:01:14 dzjg kernel: Killed process 12867 (oracle)

  我们可以看到normal zone free 3704KB < min 3744KB,内核申请最小的内存3744KB,此时系统空闲的lowmem 3704KB,不能满足需求。该问题是low memory耗尽,因为内核使用low memory来跟踪所有的内存分配。当low memory耗尽,不管high memory剩多少,会触发oom-killer机制(out of memory killer)杀死进程,以保持系统的正常运行。根据一些文档描述,OOM-Killer 在 2.4 与 2.6 上表现是不一样的。2.4的版本中是把新进来(新申请内存)的进程杀掉。而 2.6上是杀掉占用内存最厉害的进程(这是很危险的,很容易导致系统应用瘫痪)。我们目前的系统内核版本为2.6,从而导致系统将数据库LGWR进程杀死.