一则数据库无法重启的案例分析(r8笔记第96天)
今天一个开发的同事找到我,说有个问题想咨询一下我,突然想起他昨天让我帮他处理一个工单,他这么一问我才想起来还没做,结果他说是另外一件事,说有个开 发测试的环境,数据库报04031的错误,想让我帮忙看看是怎么回事,这种问题刚好就找对了。首先开发测试环境,访问量不高,业务量不大,环境也要简单很 多,出现这个问题,让我能够唯一觉得可能的原因就是sga设置太小了。当然带着这个想法也让另外一个同事去现场看看问题,如果问题确实要复杂一些,那我们 再采取其它的措施,当然解决不了问题也没关系,权当是给新同事的一次历练吧。
然后很快从同事那里得到了反馈,说调整了sga为200M之后数据库貌似起不来了。如果是这样的情况,也是意料之中,报错信息是:
ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory
对于ORA-27102的错误,其实也是一个经典的错误了。这个报错主要和内核参数的设置相关,shmall和shmmax,可以参考ID 301830.1
其实27102的错误如果系统级的报错是
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
那么和内核参数shmall和shmmax关联要大一些,而目前的是 Linux-x86_64 Error: 12: Cannot allocate memory其实另有原因,但是当时也没有多想。
就让同事继续提供free -m的结果
[oracle@dev_mobileBI dbs]$ free -m
total used free shared buffers cached
Mem: 5709 4762 946 0 39 3365
内核参数的值如下:
kernel.shmmax = 2147483648
kernel.shmall = 536870912
其实这个时候看,剩余内存还多,shmmax尽管有些小,但是完全是可以支持200M的SGA的。
所以这个内核参数的修改也是一种方式,但不是解决这个问题的根本。
我们就回到了参数文件上,这个时候和同事重新审视这个文件,把SGA改为原值,仍然启动失败,报27012的错误。
这个时候感觉问题就比较蹊跷,数据库停了之后重启竟然就报错,其它参数的设置都恢复了原来的值还是启动报错。
这个时候感觉是参数文件哪里出现了问题,所幸这个环境的定制参数也不多,我们可以理一理创建数据库的一个环节,手工建库,其实在10g中只要保留4个参数 就可以了,11g3个,即db_name,control_files,sga_target(或者其他的内存组件参数),所以就把参数文件改为最简单的 方式,启动到nomount,就可以了。
从这个情况可以推理出来应该是在当前的参数文件中存在着一些参数的限制导致启动失败。
参数文件的设置大体是下面的样子:
mbidev.__oracle_base='/home/U01/app/oracle'#ORACLE_BASE set from environment
*.audit_file_dest='/home/U01/app/oracle/admin/mbidev/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/home/U01/app/oracle/oradata/mbidev/control01.ctl',/oradata/mbidev/control03.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='mbidev'
*.db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=10737418240
*.diagnostic_dest='/home/U01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=mbidevXDB)'
*.lock_sga=TRUE
*.open_cursors=300
*.pre_page_sga=TRUE
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
所以检查了一圈,印象中也没有很特别的参数,所以就采用了排除法,先从自己熟悉的参数开始缩减,排除了domain,remote_login_password,compatible,audit的参数
那么接下来就是不大熟悉的参数了,有两个pre_page_sga和lock_sga,经过排除,发现最后的症结在于参数lock_sga
如果去掉这个参数设置,数据库就能够正常启动,经过验证,发现默认值为false
这个时候,我们不能太偏离问题的方向,我们需要调整SGA,这个时候问题已经解决了,我们先处理SGA的部分,至于lock_sga的部分可以暂时放一放回头再来深究为什么有这种情况。
所以调整SGA之后,发现内核参数shmmax,shmall还是有一些问题,经过调整,就达到了开发同学的预期目标。
我们再来看一下lock_sga的奇怪问题,这个参数默认值为false,如果设置为true,可以保证整个sga被锁定在物理内存中,可以防止sga被换出到swap中,还有辅助的参数pre_page_sga来保证在数据库初始化的时候把sga都放入内存中。
而为什么这个参数设置为true,会有27102的错误呢,其实和系统的资源配置有关。可以通过ulimit -a查看相关的信息
默认locked memory为32KB,肯定无法满足,所以我们需要设置memlock
$ ulimit -a|grep lock
max locked memory (kbytes, -l) unlimited
file locks (-x) unlimited
比如对oracle用户设置较高的资源使用权限。
oracle soft memlock unlimited
oracle hard memlock unlimited
这个时候设置lock_sga和pre_page_sga为true,启动就没有任何问题了,不过确实能够明显感受到启动的时候还是很迟缓的。这两个参数在有些优化场景中还是有一席之地,但是相对来说使用范围还是有限。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python opencv图像处理基础总结(六) 直线检测 圆检测 轮廓发现
- 简单又强大的pandas爬虫 利用pandas库的read_html()方法爬取网页表格型数据
- python pyecharts数据可视化 折线图 箱形图
- Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息
- python 办公自动化系列 (1) 从22053条数据中统计断网次数并计算平均断网时间
- Python数据可视化 热力图
- python 中文情感分析 Snownlp库的使用
- Python数据分析实战(1) 成都土地市场分析
- 51单片机学习(1) LED点亮、闪烁以及流水灯实现
- python pyecharts地理数据可视化 绘制地理图表
- Python 爬虫+tkinter界面 实现历史天气查询
- python opencv+pytesseract 验证码识别
- python+opencv 实现图像人脸检测及视频中的人脸检测
- 手搓一个分布式大气监测系统(五)基于物联网开发平台的云架构延伸
- 关于Python的前后、单双下划线作用,看完这篇文章,吊打面试官!