一则数据库无法重启的案例分析

简介:   今天一个开发的同事找到我,说有个问题想咨询一下我,突然想起他昨天让我帮他处理一个工单,他这么一问我才想起来还没做,结果他说是另外一件事,说有个开发测试的环境,数据库报04031的错误,想让我帮忙看看是怎么回事,这种问题刚好就找对了。
  今天一个开发的同事找到我,说有个问题想咨询一下我,突然想起他昨天让我帮他处理一个工单,他这么一问我才想起来还没做,结果他说是另外一件事,说有个开发测试的环境,数据库报04031的错误,想让我帮忙看看是怎么回事,这种问题刚好就找对了。首先开发测试环境,访问量不高,业务量不大,环境也要简单很多,出现这个问题,让我能够唯一觉得可能的原因就是sga设置太小了。当然带着这个想法也让另外一个同事去现场看看问题,如果问题确实要复杂一些,那我们再采取其它的措施,当然解决不了问题也没关系,权当是给新同事的一次历练吧。
   然后很快从同事那里得到了反馈,说调整了sga为200M之后数据库貌似起不来了。如果是这样的情况,也是意料之中,报错信息是:

ORA-27102: out of memory
Linux-x86_64 Error: 12: Cannot allocate memory

对于ORA-27102的错误,其实也是一个经典的错误了。这个报错主要和内核参数的设置相关, shmallshmmax,可以参考 ID 301830.1
其实27102的错误如果系统级的报错是

ORA-27102: out of memory

Linux-x86_64 Error: 28: No space left on device

那么和内核参数 shmallshmmax关联要大一些,而目前的是 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,启动就没有任何问题了,不过确实能够明显感受到启动的时候还是很迟缓的。这两个参数在有些优化场景中还是有一席之地,但是相对来说使用范围还是有限。

目录
打赏
0
0
0
0
16
分享
相关文章
服务器数据恢复—云服务器上mysql数据库数据恢复案例
某ECS网站服务器,linux操作系统+mysql数据库。mysql数据库采用innodb作为默认存储引擎。 在执行数据库版本更新测试时,操作人员误误将在本来应该在测试库执行的sql脚本在生产库上执行,导致生产库上部分表被truncate,还有部分表中少量数据被delete。
68 25
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
2600 万表流计算分析如何做到? 时序数据库 TDengine 助力数百家超市智能化转型
在生鲜超市的高效运营中,实时数据分析至关重要。万象云鼎的“云鲜生”通过智能秤+网关+软件系统的组合,实现了销售数据的精准管理与优化。而在数据处理方面,TDengine 的流计算能力成为了这一方案的核心支撑。本文详细分享了“云鲜生”如何利用 TDengine 高效存储和分析海量销售数据,在优化超市运营、提升用户体验的同时,解决高基数分组、高并发查询等技术挑战。
27 1
虚拟化数据恢复—误还原快照导致虚拟机上数据库丢失的数据恢复案例
虚拟化数据恢复环境&故障: vmfs文件系统,存储的数据是SqlServer数据库及其他办公文件。 工作人员误将快照还原,导致了SqlServer数据库数据的丢失,需要恢复原来的SqlServer数据库文件。
66 22
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
瑶池数据库大讲堂|PolarDB HTAP:为在线业务插上实时分析的翅膀
瑶池数据库大讲堂介绍PolarDB HTAP,为在线业务提供实时分析能力。内容涵盖MySQL在线业务的分析需求与现有解决方案、PolarDB HTAP架构优化、针对分析型负载的优化(如向量化执行、多核并行处理)及近期性能改进和用户体验提升。通过这些优化,PolarDB HTAP实现了高效的数据处理和查询加速,帮助用户更好地应对复杂业务场景。
SqlServer数据恢复—SqlServer数据库所在分区损坏的数据恢复案例
一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer数据库数据。
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库

热门文章

最新文章