[转帖]一次ORA-3136的处理
https://oracleblog.org/working-case/deal-with-ora3136/
最近收到一个告警,用户说数据库无法连接,但是从监控上看,oracle的后台进程已经侦听进程还是在的,没有任何的alert。
登录数据库,已经恢复正常,但是在数据库的alertlog中发现大量的ora-3136的报错:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Thu Feb 17 09:07:31 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:31 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:31 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
Thu Feb 17 09:07:32 2011
WARNING: inbound connection timed out (ORA-3136)
|
时间大约是在9点开始,到9点07分结束,历时7分钟,之后就自动恢复了,后续没有报错。
而ora-3136的这个报错,在大部分情况下,我们是可以忽略的,因为这个报错一般是由于客户端由于梅雨正确的密码,连接超时导致。举个很简单的例子,我们用sqlplus user/password@tnsname,但是输入的密码是错误的,oracle提示:ORA-01017: invalid username/password; logon denied,之后,什么都别做,连接挂在那里,等一分钟之后,就可以在alertlog中看到这个报错了。
因此,ora-3136报错的一种可能性是客户端使用率错误的密码登录,但是之后没有退出连接。
但是ora-3136的报错不仅仅是这一种可能,另外还有当收到来自恶意客户端的连接,如Dos攻击,另外,还有当数据库负载比较重的时候,也会有这样的报错。具体可见metalink 《Troubleshooting ORA – 3136 WARNING Inbound Connection Timed Out [ID 465043.1]》里面说的3种可能性:
|
1
2
3
4
5
|
There can be three main reasons for this error -
1. Server gets a connection request from a malicious client which is not supposed to connect to the database , in which case the error thrown is the correct behavior. You can get the client address for which the error was thrown via sqlnet log file.
2. The server receives a valid client connection request but the client takes a long time to authenticate more than the default 60 seconds.
3. The DB server is heavily loaded due to which it cannot finish the client logon within the timeout specified.
|
根据我的理解,总之,在oracle的侦听接受到一个来自客户端的请求,当fork到服务器进程的时候,如果在这个过程中发现意外,如密码错误,如数据库负载太重,都会参数ora-3136的报错。
由于在alertlog中除了ora-3136之外没有别的什么信息,于是拉了一份故障时间点左右的awr report来看,发现了比较严重的问题:
1.shared pool撑的比较大:
2.library cache命中率低:
3.等待事件中library cache的latch严重:
4. SQL的绑定变量使用的很糟糕,几乎没有绑定变量,某些语句类似的可以找到5000多个,仅仅是查询条件中的值不同:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> select substr(SQL_TEXT,1,80),count(*) from v$sqlarea group by substr(SQL_TEXT,1,80) order by 2
2 /
SUBSTR(SQL_TEXT,1,80) COUNT(*)
---------------------------------------------------------------------------------- ----------
......
SELECT a.costareacode AS costareacode,a.costmethod AS costmethod,a.itemcostpric 2056
SELECT a.taxgroupcode AS taxgroupcode FROM item a WHERE 1=1 and a.itemid=10 2233
select a.sourceorderdetailid ,a.orderid,a.orderdetailid,a.baseqty,a.orderqty, 2307
SELECT a.creditdays AS creditdays,a.relationid AS relationid,a.creditlevelcode 2329
Select count(*) as count from orderdetail where 1=1 and orderdetailid = 11047 2629
select nvl(sum(a.balanceamt-a.allocamt),0) as canuseamt from zmclrebatebalanc 4576
SELECT a.optionvalue AS optionvalue FROM orgoption a WHERE 1=1 and a.orgid= 5458
597 rows selected.
SQL>
|
ok,到这里,我们从awrreport中可以暂时的理出一条线索:sql没有很好的绑定变量->需要大量的library cache内存->申请内存的时候,可能机器负载高,导致ora3136的报错。
我们继续结合系统层面的NMON数据来看系统当时的负载情况:
1.八点半到九点多的那段时间CPU中的IO较高:
2. 八点半到九点多那段时间的hdisk0很忙,几乎到100%:
由于hdisk0和hdisk1是属于local disk,hdisk4和hdisk5是san storage。而local disk除了用于本地的一些文件系统的使用,还有用于swap空间。我们继续去看page in和page out的情况。
3. 八点半到九点多那段时间有大量的page in:
因此,我们再次可以进一步的推论:由于需要大量的library cache,数据库向内存申请空间,由于空间不够,或者配置的原因,申请的空间需要向swap空间发生置换,因此发生page in,而在swap空间中的library cache又远远比不上在物理内存内的效率,且hdisk0的繁忙程度为100%。
综上,造成上述的故障:SQL没有很好的绑定变量->需要大量的library cache->申请library cache内存的时候,与swap发生置换,page in增高->hdisk0繁忙100%->整体系统负载高->fork服务器进程失败->ora-3136报错。
因为该机器的物理内存有40G,而我们配置的SGA+PGA还不到20G,有这样大的pipo,我们怀疑是不是有些aix的配置没有正确,同时我们也希望设置lock_sga的参数,把sga锁在物理内存中。检查后,果然发现了些问题:
|
1
2
3
|
AIXTHREAD_SCOPE没有设置成S:如果使用默认的值P,oracle的进程将会map到内核进程的pool中,当oracle处于一个等待事件时,该进程就会被swap出去,此时oracle进程将会置于到另一个内核进程上。oracle使用进程ID来提交等待的进程,所以保持同一个进程ID很重要。如果将AIXTHREAD_SCOPE设置成S,oracle进程就能静态的map到内核进程,而不会改变进程ID。
lru_file_repage 没有设置成0:用于限制page。告诉VMM,page仅用于文件型页面,而不是计算型页面(sga是计算型页面)。
v_pinshm没有设置成1。如果该值设置成1,那么aix的VMM将不会pin住share memory页面,因此oracle instance将不能用到large page。因此该值也应该设置成1来配合使用lock_sga。
|
上述问题,在测试机上修改设置后,进行一星期的测试,在生产系统上修改。
[转帖]一次ORA-3136的处理的更多相关文章
- [转帖] SQLNET.ORA的处理.
被一个客户端连接远程数据库阻塞超时的问题困扰了好久,最后终于找到了答案 https://blog.csdn.net/herobox/article/details/16985097 Oracle ...
- [转帖]sqlnet.ora常用参数
sqlnet.ora常用参数 注﹕在修改sqlnet.ora文件之后重新启动监听﹐修改才能生效﹗﹗﹗ oracle网络设置主要包括三个文件,sqlnet.ora\ lisnter.ora\ tnsna ...
- [转帖]Oracle 使用sqlnet.ora/trigger限制/允许某IP或IP段访问指定用户
Oracle 使用sqlnet.ora/trigger限制/允许某IP或IP段访问指定用户 原创 Oracle 作者:maohaiqing0304 时间:2016-05-03 17:05:46 17 ...
- oracle instant client,tnsping,tnsnames.ora和ORACLE_HOME
前段时间要远程连接oracle数据库,可是又不想在自己电脑上完整安装oracleclient,于是到oracle官网下载了轻量级clientinstant client. 这玩意没有图形界面,全靠sq ...
- ORA-12541:TNS:no listener 客户端tnsnames.ora配置,以及服务端listener.ora配置
需求:客户端(192.168.25.1)需要访问服务端(192.168.7.215)的Oracle库ORCL. 步骤一:配置客户端tnsnames.ora 步骤二:配置服务端listener.ora ...
- Oracle的tnsnames.ora配置(PLSQL Developer)
首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...
- Oracle RAC客户端tnsnames.ora相关配置及测试
1.Oracle RAC服务端/etc/hosts部分内容如下 2.查看服务端的local_listener和remote_listener参数 3.客户端tnsnames.ora配置参考 3.1 1 ...
- nginx负载均衡基于ip_hash的session粘帖
nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...
- oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件
总结: 1 .三个配置文件都是放在$ORACLE_HOME\network\admin目录下. 2 .sqlnet.ora确定解析方式 3 .listener.ora上设SID_NAME,通常用于JD ...
- oracle客户端安装配置 tnsnames.ora文件
Oracle客户端tnsnames.ora连接配置 Oracle90的在C:\Oracle\ora90\network\ADMIN下面 Oracel10g的在D:\oracle\product\10. ...
随机推荐
- IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等
IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等 前面介绍到了用packr打包javafx17为exe多平台分发,比较复杂,这篇则介绍用idea直接打包exe,比较简单,但 ...
- 【wing】一款轻量快捷的团队开发工具
导航 开源地址:[Github] & [Gitee] 新手使用 更多命令 开发指南 说明 wing是一个代码同步管理工具类似repo,具有以下特性: 支持Winddows .Linux .Ma ...
- Mybatis之TypeHandler使用教程
引言 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...
- C++面试复习总结
C++面试 本人20年3到4月内面了近十家公司,整理一下C++客户端问的多的基础问题 另:操作系统面试总结,OpenGL面试总结,计算机网络面试总结 代码到可执行程序 预处理:条件编译,头文件包含,宏 ...
- CUDA个人入坟笔记
CUDA是建立在NVIDIA的GPUs上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地解决比较复杂的计算难题.近年来,GPU最成功的一个应用就是深度学习领 ...
- 想快速重构智慧园区5A系统,这份方案推荐给你
摘要:近年来,园区的数字化一直在演进,从OA.CA.BA.SA.FA等单一系统的信息化建设,到以应用为主导的大系统集成,再到以云.大数据为基础的数据开放平台构建,继而进入全量数据融合.数字技术泛在的智 ...
- 详解CNN实现中文文本分类过程
摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...
- storybook 编写stories的story基础语法
编写 stories story 用于展示组件某个状态,每个组件可以包含任意多个 story,用来测试组件的各种场景.根据默认配置,只需要在组件的文件夹中,以 **.component.stories ...
- Solon2 开发之IoC,九、自定义注解开发汇总
1.定义构建能力注解,比如@Controller 注解类: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Docum ...
- 将MyBatis Mapper xml 放到 jar 包外面
在不改程序的情况下,修改 sql 时,需要将 Mapper 中的 XML 文件 放到外面 mybatis: mapper-locations: classpath:mapper/*.xml #J ...