公司新上架一台服务到机房,硬件是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</a> (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进程杀死.

2.为什么我们系统物理内存有60G,还会耗尽Lowmem?

目前系统内存详细情况如下,红色字体为NORMAL ZONE(也叫做LOWMEM区)

oracle@dzjg:~> free -lm
                total       used       free     shared    buffers     cached
Mem:         62174        479      61695          0         49        299
Low:           181        108         73
High:        61992        370      61622
-/+ buffers/cache:        130      62044
Swap:         8189          0       8189
oracle@dzjg:~> cat /proc/meminfo
MemTotal:     63666656 kB
MemFree:      63093160 kB
Buffers:         69124 kB
Cached:         352836 kB
SwapCached:          0 kB
Active:         173088 kB
Inactive:       299200 kB
HighTotal:    63480528 kB
HighFree:     63044476 kB
LowTotal:       186128 kB
LowFree:         48684 kB
SwapTotal:     8385920 kB

可以看到lowmem total为181MB严重小于880MB,出现这个现象的原因是32位系统使用一种PAE kernel的技术(内存扩展)来管理主机所有的物理内存,而PAE Kernel的管理工作需要消耗一部分lowmem内存,通常为每16G就要消耗128MB的lowmem。而我们的主机物理内存高至60G从而导致lowmem耗尽。

解释:Physical Address Extension(PAE,中文译名:物理地址扩展)技术最初是为了弥补32位地址在PC服务器应用上的不足而推出的。我们知道,传统的IA32架构只有32位位,这样,系统就能够容纳2^36=64GB的内存。

综上所述,建议如下解决办法,供参考:

办法1:升级到64位系统,这是最好的方法,因为此时所有的内存都属low memory,如此时提示out of memory,则真的是low memory耗尽,真的out of memory了。

办法2:拔内存,使主机物理内存将至8G左右,从而降低PAE Kernel消耗过多的Lowmem.;

办法3:升级系统内核到2.6以上版本(或者重新编译系统内核参数增加lowmem的值)---谨慎使用。

一则 ORA-00471 处理方法的更多相关文章

  1. Oracle的tnsnames.ora配置(PLSQL Developer)

    首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...

  2. 转载《Oracle的tnsnames.ora配置(PLSQL Developer)》

    源地址:https://www.cnblogs.com/qq3245792286/p/6212617.html. 首先打开tnsnames.ora的存放目录,一般为D:\app\Administrat ...

  3. service name和SID的区别

    数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID)  在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instan ...

  4. Oracle 11g RAC OCR 与 db_unique_name 配置关系 说明

    一. 问题一 在做RAC standby 的alert log里发现如下错误: SUCCESS: diskgroup DATA was mounted ERROR: failed toestablis ...

  5. Linux服务器中安装Oracle

    笔者手动安装成功 一,oracle安装前的准备与配置 1,修改stsctl.conf文件 Linux是为小文件设计的,Oracle数据库安装需要占用较多资源,要把各项参数调大. 使用vi编辑/etc/ ...

  6. 如何找回Oracle所有用户丢失的密码

    如何找回Oracle所有用户丢失的密码: 方法一:1.以操作系统验证的方式登录 SQL>conn / as sysdba; 2.查看系统中的用户名. SQL>select USERNAME ...

  7. Oracle的网络监听配置

    listener.ora.tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,都是放在$ORACLE_HOME\network\admin目录下.其中li ...

  8. PLSQL:orecal,tnsname简介

    导入ORACLE遇到很多问题,学了好多,其中很长时间花在网络配置上,刚开始学,具体原因不知道,先把搜集到的好文章存下来,以后慢慢研究. 监听配置文件             为了使得外部进程 如 CA ...

  9. 数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID)

    数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instanc ...

  10. Oracle 数据库名、实例名、Oracle_SID

    本文参考自ORACLE 数据库名.实例名.ORACLE_SID的区别,纯属读书笔记,加深记忆 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instance_name).在 ...

随机推荐

  1. 【转】论文、会议、期刊评价|Indicate paper, conference, Journal

    转自“浙江大学计算机学院软硬件协同设计实验室”:http://multicore.zju.edu.cn/fatlab/Indicate-paper.htm 1           体系结构领域,排名为 ...

  2. C#设置窗体最大化且不遮挡任务栏的方法

    C#设置窗体最大化示例: 也可将方法内的内容放到主窗体首次加载load方法中. /// <summary> /// 设置窗体最大化(不遮挡任务栏)但此方法在宽屏中不能显示全屏/// < ...

  3. 转 fiddler教程

    Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...

  4. springMVC框架下JQuery传递并解析Json数据

    springMVC框架下JQuery传递并解析Json数据

  5. Agg学习笔记

    很久前就听一大牛说起Agg,据说是一个架构极度牛B的2D引擎,沉寂了许久,最后花了两周时间走马观花地把它过了一遍.果然如那大牛所言,这家伙简直就是巧夺天工的艺术品.今天稍稍瞄了一下Google扔出来的 ...

  6. Block动画 和 Spring动画

    Block动画: @interface BlockViewController () @property (weak, nonatomic) IBOutlet UIView *playView; @e ...

  7. Minimum Window Substring @LeetCode

    不好做的一道题,发现String Algorithm可以出很多很难的题,特别是多指针,DP,数学推导的题.参考了许多资料: http://leetcode.com/2010/11/finding-mi ...

  8. JAVA爬虫 WebCollector

    JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...

  9. 位操作 写读同步(无线) (语音1760 1700) ( 无线24l01)

    ************************************************************************** * 函数原型: unsigned char ISD ...

  10. 自定义安装Apache+php+mysql网站服务器环境

    自定义安装Apache+php+mysql 这种方式是比较麻烦的安装方式,需要具有一定的对Apache了解的基础上才能安装,安装顺序就是先安装Apache软件,然后安装php,最后安装mysql.这里 ...