记一次特殊的“ORA-04030”故障处理

604327e235e74b50cb1407cd79f0dc58.png
黄宸宁

云和恩墨高级技术专家

担任 Oracle 技术高级工程师职务,Oracle 10g/11g OCM。拥有长达10年的 Oracle 技术服务工作经验,多年在通讯行业和电力行业担任技术服务顾问。个人博客:http://www.cddba.com/

本文整理来自6月23日晚8点云和恩墨大讲堂专家黄宸宁的分享:一次特殊的 ORA-04030 故障处理。循序渐进通过逐步剖析原理过程,解开其原理背后的工作机制,巧妙的处理故障;分享的不是一次简单的故障处理,而是如何利用原理知识,扩展到故障处理当中。

【案例背景】

2015年7月19日客户现场人员在通过 PLSQLDeveloper 工具在创建索引时报 ORA-04030 错误,导致索引创建失败;但是通过 splplus 重新执行创建索引语句成功。

故障发生后,云和恩墨工程师协助进行故障排查工作,在 sqlplus 中重新执行创建索引语句成功。

经进一步分析,故障原因是由于数据库监听是通过 crs 进行启动,所以继承了 root 用户的 ulimit 限制,在 root 的 ulimit 限制中 data(kbytes) 的限制为 131072kb,即每个通过监听连接的进程能分配的内存资源不能超过 131072kb,所以在通过 PLSQL Developer 工具连接数据库(需要通过 Oracle 的监听建立连接)创建索引时,该操作申请的内存资源达到该限定时就会报 ORA-04030 的错误。

为什么会出现这种告警呢?

首先,了解下 ORA-04030 错误的原因。

ORA-04030 错误引起的原因大概有以下几种情况:

1)是否有足够的可用内存?

查看系统内存使用情况

990c71345033a91ab0d30f992a87f2d0.png
 

查看当时出故障的服务器资源,可用看到剩余内存还有7.7G左右,说明在操作系统层面还有足够的可用内存。

2)是否设置了Oracle 的限制?

查看 Oracle 中与 PGA 相关的设置:

a3503d6b3c65139f5b2877e93d62b35e.png

2ba203ab9aa17dfe8c43016b15247998.png

 从上面的内容可以看到 PGA 设置的大小为 8400M,根据单个会话使用 PGA 的期望尺寸(也可以认为是实际分配的最大尺寸)计算公式是:min(5%*pga_aggregate_target,50%*_pga_max_size,_smm_max_size),可以简单计算下 min(5%*8400M,50%1680M,840M)=420M(其中_pga_max_size 的单位为 bytes,_smm_max_size 的单位为 kb),即单个会话能使用 PGA 的期望尺寸为 420M,那报错的会话是否超过了该限制喃?

查看 ORA-04030 报错的 trace 文件:

be0dd4dd365505ad35a388a1327dabf6.png

362e6b5f5d1dab356361b59b3c6baf3e.png
680e3e75f34f95d9e7a3294b5b253917.png

从以上 trace 文件中可以看到,报错的进程实际分配的进程只有111MB,远远未达到420M,说明并非是由于 Oracle 自身的限制引起的 ORA-04030 报错。

3)哪个进程需要的内存过多?

上一个是否是由于 Oracle 自身限制引起的解释中,已经可以从 trace 文件中看到,消耗最多内存的进程就是报 ORA-04030 的进程,消耗的内存为110M,并未发现其他更消耗内存的进程。

4)是否设置了操作系统限制?

查看操作系统限制,Oracle 用户的限制

c2f6285ebce79138b3fa1f72eb86d446.png

http://www.cddba.com/root 用户的限制:

9cdff99da523d3183f10bde02d5ab677.png

从上面 root 和 Oracle 的 limit 限制来看,root 用户的 data(kbytes) 的限定值得关注,该属性的意义是 soft data segmentsize in blocks(进程数据段大小限制)。

现在做一个反向测试:利用 SQL*PLUS 工具创建索引,创建成功。

问题来了,为何 sqlplus 会成功,PLSQL Developer 却会失败?

通过 PLSQLDeveloper 工具创建索引时报 ORA-04030 错误,但是通过 SQLPLUS 创建却能成功,两者除了使用的工具不同(PLSQL Developer 和 sqlplus),还有就是连接的方式不同(PLSQL Developer 是通过监听程序建立的进程连接;sqlplus 是在数据库服务器上直接创建创建的连接,绕过了监听程序建立的进程)。

从连接工具和方式的不同得到了不一样的结果,如何来验证到底是连接工具的问题或则是连接方式的引起的报错?

由于 PLSQLDeveloper 只能通过监听的连接方式进行连接,但是 sqlplus 可以通过监听或则直接连接两种方式进行,所以先对连接方式进行测试。

通过 sqlplus 以 tnsnames.ora 标签名的方式通过监听进行连接,并执行创建索引报错的语句,发现错误依然存在,但是如果不通过监听而直接连接是不会报错的,说明跟是否通过监听进行连接有很大的关系。

为何会受监听的影响?

在 Oracle RAC 环境中,由于 crs 的启停是通过 root 用户进行的。

c9ee15c4a3fdfcd0f996aaf48ef86de1.png

所以在 crs 会继承 root 用户的 limit 属性,当通过 crs 或则 srvctl 命令启动监听时,也会继承 root 用户相应的 limit 属性,即 data(kbytes)为131072。如何验证该推断?

现在通过监听的形式进行连接

6f441c71f04f3248523f6cd1ead8840a.png

通过 dbx 工具查看该进程的 limit 信息

56c7c1f21f5774903a65cc8d93dd83f9.png

从上面的内容可以看到 data 属性的 limit 值为134217728bytes 即131072kbytes 与 root 的 data(kbytes) 131072 值完全吻合(stack 的33554432bytes 即32768也与 root 的 stack(kbytes) 32768一致),说明是通过监听建立连接进程的 limit 继承于 root 用户。

使用不同监听进行连接

bd2228c3ec00d15a0e57caa7890dddd9.png

跟踪这个服务器进程

abd6a02ffd2d69d07a98c6e83ea6a1d4.png

从上面内容可以看到,如果不通过监听连接数据库创建的进程,它的 data 限制为 unlimited 的即无限制。

最后查看 crs 中监听的启动日志:

(/u01/oracle/product/10.2.0/db_1/log/gisdata2/racg 中的日志文件 ora.gisdata2.LISTENER_GISDATA2.lsnr.log):

1b0eeaa3e44c2b1c5207b4bb1da312b5.png

从以上内容可以看到监听是由 crs(或则是 srvctl 命令)启动的以及监听的运行时间:

268d96481cd82014c9df29497b8ad1b1.png

监听启动的时间也与日志中的时间对应。

那为什么 CRS 的使用会使用 ROOT 用户的 limit 限制呢?

首先,得明白在 Linux 中,每触发任何一个事件时,系统都会为它定义一个进程,并且给予一个 ID,即 PID,同时会根据触发这个进程的用户与相关属性关系,给这个 PID 设置有效的权限。

f270d688b84ab5edadba27d49506cb41.png

从上面可以知道,系统启动以后,CRS 会自动启动,启动主要由 /etc/init.d 的几个脚本完成。而这些脚本的执行用户和用户组是 root,也就是说当 CRS 启动时,Linux 系统会根据 UID/GID 来判断资源属性和环境变量,那么这个进程所衍生的进程,也会沿用这些属性。

由此可以得到结论,由于监听是通过 crs 进行的启动,继承了 root 用户的 limit 限制,每个会话所能持有的内存大小最大不能超过128M,当通过监听进行数据库连接时,由监听创建的用户进程也将继承该 limit 限制,所以当通过 PLSQL Developer 连接数据库(包括 sqlplus等工具需要通过监听建立用户进程的情况),在创建索引过程中,当所请求的内存达到或非常接近该限制时,就会由于无法进一步申请更多的内存资源,抛出 ORA-04030 错误。

提示:

如果是在 Linux 系统中,可以通过 cat /proc/PID/limits 的方法进行查看单个进程的 limit 属性值,其中 PID 为要查看进程的进程号。

这次的案例分析过程完毕,我们可以得出一些建议:

以 ORA-04030 此案例延伸扩展,为避免该错误可参考以下建议:

1)在安装 Oracle 软件创建数据库之前应该对主机层面的内核参数、limit 限制等进行规范的修改,以避免类似问题的发生。

2)配置合理的内存,例如物理内存和交换空间

3)使用自动 PGA 内存管理可降低 ORA-04030 错误的概率

如何加入云和恩墨大讲堂微信群

搜索盖国强(Eygle)微信号:eeygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。

68a9b74067e1e365a118e789b58ca10a.png

云和恩墨

数据驱动,成就未来。整合业界顶尖的技术与合作伙伴资源,围绕数据及相关领域,提供解决方案和专业服务。

IT基础架构

zData一体机 - 分布式存储解决方案

数据架构

Oracle DB2 MySQL NoSQL

专项服务:架构 / 安全 / 高可用 / 容灾 / 优化 / SQL 质量管控

运维服务:运维服务  | 代维服务

人才培养:个人认证 | 企业内训

软件产品:SQL审核 - Z3 | 监控 - Zone | 数据恢复 - ODU

应用架构

应用软件开发:数据建模 | SQL审核和优化 | 中间件服务

业务架构

电子渠道(网络销售)分析系统 | 数据治理

恩墨学院

恩墨学院是云和恩墨(北京)信息技术有限公司旗下的培训事业部,创业数年专注于数据库认证、技能培训,以专业的讲师塑造品牌,以专业的训练保证就业,目前已经发展成为国内数据库领域培训领导品牌。

68c5d1f0a4c1a19669bb878fd0f26bee.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值