| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 记一次Oracle DBLink连接使用情况的排查 -> 正文阅读 |
|
[大数据]记一次Oracle DBLink连接使用情况的排查 |
背景项目中应用程序有连接池配置到我们自己的Oracle RAC(以下简称本地库)和友商的Oracle RAC(简称友商库),均为11G。另外由于历史原因有一些需求需要本地库与友商库联合查询,为了实现联合查询,本地库有创建dblink到友商库。熟悉的朋友应该都知道dblink之前是存在SCN暴增Bug的,所以在后期的开发中我们一直尽量替换掉原有使用dblink写法的代码,久而久之时至今日,已经不清楚到底哪些程序使用了DBlink。今天友商工程师反馈友商库中我们的sessions太多了,让排查一下。 ? 登录友商库排查针对友商库,我这里有查询用户,尝试查询下gv$session发现也有查询权限,排查开始! 先统计下友商数据库的连接数情况,发现节点1sessions 2300,节点2sessions 1100,节点1连接数确实比较高,而且分布不均匀。
再统计下连接数分布情况,发现sessions确实大多数来源于我的服务器。
但诡异的是,其中一多半sessions的machine都是本地库Oracle Rac两台主机,由于数据库不会主动访问友商库,这里判断这些sessions就是本地库到友商库的dblink连接,但具体dblink有哪些应用程序使用还不清楚。 考虑先查询一下session执行的sql:
然后拿sql去代码里搜索下看是否可以查到,由于我这里只有部分源码,搜索后无果。 摘录sql发给各组开发排查,无果。 求人不如靠自己啊,自己想办法查查来源吧! ? 关联本地库排查在gv$session中,process列对应着客户端操作系统的进程号。 这样我就可以使用以下sql在友商库里查询到客户端操作系统进程号(即本地库服务器执行dblink连接的操作系统进程号)
将查询出的所有进程号复制出来,在本地库新建一个临时表feng将结果导入。 接下来在本地库进行查询, 因为oracle中的所有进程都会记录在v$process中,v$process中的SPID即oracle服务器操作系统进程号,v$process中的ADDR与v$session中的PADDR为对应关系,尝试写sql进行关联查询
即通过在友商库查询到本地库使用dblink的进程号,然后用这些进程号在本地库的v$process中与SPID匹配,获取到ADDR,再用这些ADDR去v$session与PADDR匹配结果,最中可以获取到这些session的信息。 结果出来,查看machine列,发现这些session绝大多数的客户端主机都来源于应用集群XX,可以定位到dblink用法的代码是在这里了(由于process与session为1对多的关系,所以查询结果可能会有一些偏差,但查询结果里的machine95%以上的记录都指向某一集群,一定不完全是巧合)。 ? 验证既然要把问题抛给开发,那还是确定一下比较好。 尝试轮起上面定位的应用集群,发现每重启一个节点,友商库中的session就会降低一些,同时猜测dblink连接只有当使用时才会创建,应用启动时即连接池初始化时并不会创建大量dblink连接。全部重启后发现结果与猜测一致。目前可以确定为dblink的使用者为此应用集群XX,将分析结果转给开发进行接下来的代码排查与修改。 ? 连接数高的问题处理1. DBLink 不均衡处理问题前查看到所有dblink均连接到友商库的1节点,若将连接均衡到两个节点,则会降低1节点的连接数。 查看本地库dblink创建语句,发现没有添加loadbalance参数,遂重建dblink增加loadbalance参数,但经过观察问题未解决,dblink仍连接到友商库1节点,后续进行问题分析处理。 2. 调整连接池配置分析得知此应用集群业务量不高,原本连接池设置为初始化与最大空闲连接均为50,经过测试后,将连接池初始化与最大空闲连接数均调整为10。 3. 人为KILLED导致处理问题前经分析友商库中gv$session,发现有近一半dblink过去的连接状态都为KILLED,说明被手动杀过,经与友商工程师确认确实有人为杀过连接(杀连接的原因不得而知),但连接被杀掉后会重新发起新的连接,且被KILLED的连接并未真正释放,所以连接数也会增多一倍,经轮起应用集群后所有KILLED连接均已释放。 4. 依公司与客户规范,后期进行程序调整,不再使用DBLink? 遗留问题1. 为什么状态被标记为KILLED的session迟迟未释放? 2. DBLink Oracle Rac时如何均衡连接到两个节点? 我不是DBA,对Oracle了解也并不多,敬请指教,若有错误也请评论告知,多谢! ? 参考v$session字段解释: https://blog.csdn.net/herry1689/article/details/102454871
? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:16:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |