oracle DCD

November 12th, 2008

Goto comments

Leave a comment DCD是Dead Connection Detection的缩写,用于检查死掉但没有断开的session。

在server端的sqlnet.ora文件中设置SQLNET.EXPIRE_TIME这一参数可以启用这一功能

SQLNET.EXPIRE_TIME = 20

可以设置为任意数值,单位为分钟。

当新连接建立的时候,会读取sqlnet.ora中的这一设定,当20分钟间隔到达时,对inactive的session发送”probe” SQL*NET packet来确认client是否活着。如果已经死掉,那么相对应的resource会被自动清除。

DCD可以用于防止防火墙的timeout。

如果client和server中间有防火墙,防火墙设有timeout参数,例如设置为一个小时,当一个小时中client和server间没有数据传输的时候,防火墙会断开连接。开启DCD后,通过设置SQLNET.EXPIRE_TIME的值小于防火墙的timeout参数可以避免这一情况。“probe” package确保防火墙不会断开idle的session。

但是最近我遇到一种情况就是当client发出一个大的查询,在server端是active的状态,但是timeout时间段没有数据传输回client端,比方说做一个大的hash join,group by,或者sort。 这种情况下,一开始我猜想server认为其是active的状态,不会发送packet到client端,而防火墙认为两者间没有网络传输,到了timeout的时间直接就切断了连接(后来证明该猜想是不正确的)。server trace到的一些异常信息为:

WAIT #1: nam=’enqueue’ ela= 1533 p1=1347616774 p2=1 p3=2

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 67 p1=1413697536 p2=0 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 2 p1=1413697536 p2=1 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 21 p1=1413697536 p2=0 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 1 p1=1413697536 p2=1 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 14 p1=1413697536 p2=0 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 1 p1=1413697536 p2=1 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 15 p1=1413697536 p2=0 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 1 p1=1413697536 p2=1 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 16 p1=1413697536 p2=0 p3=0

WAIT #1: nam=’SQL*Net break/reset to client’ ela= 1 p1=1413697536 p2=1 p3=0

FATAL ERROR IN TWO-TASK SERVER: error = 12152

*** 2008-11-10 21:56:38.738

ksedmp: internal or fatal error

ORA-01013: user requested cancel of current operation

我想到的解决办法大致有以下几种:

1. 修改Query的执行计划,使其结果能够立即输出,在我遇到的case中,我使用nest loop来代替hash join,这样的话能够确保timeout时间内有数据传输,并且修改计划后大大加快了执行速度。对于group by和sort的情况可以把数据pull到client上做group或者sort的操作。

2. split query使其能够在timeout时间段内完成。

3. 在server端直接跑出结果,然后从client端直接抓取结果集。

4. 修改防火墙timeout参数,使其大于query的执行时间

经过后来的一些实验,证明开始的猜想是不正确的。实验中expired_time设置为20分钟,下面是truss server process的结果

truss command: “truss -r all -w all -aefd -o dcd_truss.log -p “

head -100 dcd_truss.log

Base time stamp: 1227249877.0673 [ Thu Nov 20 23:44:37 GMT 2008 ]

16244: psargs: oracleGBCUST9 (DESCRIPTION=(LOCAL=NO)(SDU=8192))

16244: read(15, 0×103803DC6, 2064) (sleeping…)

16244: 1168.4591 Received signal #14, SIGALRM, in read() [caught]

16244: 1168.4594 read(15, 0×103803DC6, 2064) Err#91 ERESTART

16244: 1168.4596 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4597 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4598 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4599 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB138, 0×00000000) = 0

16244: 1168.4600 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4601 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4602 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB498, 0×00000000) = 0

16244: 1168.4603 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4604 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB7B8, 0×00000000) = 0

16244: 1168.4605 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 1168.4606 setcontext(0xFFFFFFFF7FFFB6C0)

16244: read(15, 0×103803DC6, 2064) (sleeping…)

16244: 2368.4691 Received signal #14, SIGALRM, in read() [caught]

16244: 2368.4694 read(15, 0×103803DC6, 2064) Err#91 ERESTART

16244: 2368.4696 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4697 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4698 getpid() = 16244 [1]

16244: 2368.4700 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10 - this indicates a write of DCD package

16244: 2368.4704 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4705 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB138, 0×00000000) = 0

16244: 2368.4706 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4707 lwp_sigmask(SIG_SETMASK, 0×9FBFF057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4708 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB498, 0×00000000) = 0

16244: 2368.4710 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4711 setitimer(ITIMER_REAL, 0xFFFFFFFF7FFFB7B8, 0×00000000) = 0

16244: 2368.4712 lwp_sigmask(SIG_SETMASK, 0×9FBFD057, 0×0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

16244: 2368.4713 setcontext(0xFFFFFFFF7FFFB6C0)

而从这以后,都是每20分钟写一次DCD package

16244: 2368.4700 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 3568.4800 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 4768.4900 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 5968.5000 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 7168.5101 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 8368.5201 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 9568.5303 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 10768.5402 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 11968.5501 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 13168.5502 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 14368.5601 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 15568.5700 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 16768.5804 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 17968.5901 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 19168.6102 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

16244: 20368.6201 write(15, “\0\n\0\006\0\0\0\0\0″, 10) = 10

从结果中看出,第一次1168s(加上开启session和truss之间大约32s的延迟,1200 seconds=20 minutes)的时候并没有写DCD package,而是在2368秒,也就是40分钟的时候第一次写DCD package,也就是说expired_time只有小于FW timeout的二分之一的时候才会发生作用。当FW timeout设定为30分钟,而DCD expired time设置为20分钟时,仍然会有timeout出现,将FW timeout时间从30分钟改为1个小时,该问题被彻底解决。

检测DCD是否打开和运行正常最好的方法就是 产生一个服务跟踪文件, 查找 DCD探测包.

要产生一个服务跟踪文件, 在sqlnet.ora文件中设置TRACE_LEVEL_SERVER=16,

TACE_DIRECTORY_SERVER=;

跟踪文件svr_;

.trc文件会在那个目录下产生.

oracle dcd设置,oracle DCD相关推荐

  1. oracle窗口设置,ORACLE安装DISPLAY变量设置 go with

    安装oracle时,如果不是以oracle用户登录图形界面,而是在root用户下su 到oracle,安装时会报错 无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色.请 ...

  2. oracle 审计设置,oracle数据库审计设置

    --开启oracle审计 su - oracle sqlplus / as sysdba SQL> show parameter audit --看到有下面的内容表示审计没有开启 audit_s ...

  3. oracle dcd设置,Oracle配置DCD避免会话被防火墙强制断开

    今天有客户反馈应用测试连接Oracle数据库的会话半小时左右未做操作就会被中断,报错ORA-3113,询问数据库是否有这样的超时设置,能否取消掉这个限制? 登上环境查看监听日志发现连接的IP和数据库I ...

  4. oracle dcd设置,Oracle DCD配置缓解12170问题

    Oracle Net是负责实现从客户端到服务器的重要组件.在连接和保持通信过程中,Oracle Net都是担负着重要的职责.在实际运维环境中,一些连接和通信故障,都需要对于Oracle Net进行相应 ...

  5. oracle dcd设置,Oracle DCD 测试

    官方文档摘要: When the timer expires, SQL*Net on the server sends a "probe" packet to the client ...

  6. oracle分类账设置,Oracle EBS R12 总帐和子分类账关系详解[转载]

    子模块和GL之间关联的变化 12i在功能模块上的变化很多,比如,基本每个模块都启用了MOAC特性,新增加了子帐模块,税模块等等很多新的模 块,OPM库存和离散库存集成了.不过这些变化中,大部分不是我们 ...

  7. oracle 审计设置,oracle审计简单设置

    数据库审计 参数:audit_trail SQL> show parameter audit NAME                                 TYPE        V ...

  8. oracle分类账设置,Oracle EBS R12 总账与子分类账的关系

    子模块和GL之间关联的变化 R12在功能模块上的变化很多,比如,基本每个模块都启用了MOAC特性,新增加了子帐模块,税模块等等很多新的模块,OPM库存和离散库存集成了.不过这些变化中,大部分不是我们需 ...

  9. oracle分类账设置,Oracle EBS R12 总帐和子分类账关系详解

    子模块和GL之间关联的变化 12i在功能模块上的变化很多,比如,基本每个模块都启用了MOAC特性,新增加了子帐模块,税模块等等很多新的模块,OPM库存和离散库存集成了.不过这些变化中,大部分不是我们需 ...

最新文章

  1. lvm自动扩容到固定分区脚本
  2. MATALO OPENCART 自适应主题模板 ABC-0679-02
  3. 天龙八部3d最新服务器,天龙八部3DIOS正版服务器整合互通公告
  4. Oracle导入导出数据
  5. 设计模式:备忘录模式(Memento)
  6. Object-C中的字符串对象1-不可变字符串
  7. 苹果应用审核走进中国!
  8. Vc数据库编程基础1
  9. 火山安卓简单分组列表框
  10. 软件测试【个人简历】展示模板
  11. PDF版建筑地面工程施工质量验收规范GB50209-2010附条文说明
  12. 【久远讲算法】栈——后进先出的数据结构
  13. 【破解三网】iphone5 国行 A1429
  14. 【HDLBits刷题笔记】Exams/ece241 2013 q7
  15. r矢量球坐标系旋度_球面,柱面坐标系下的散度与旋度
  16. 泉州信息工程学院 计算机考试,泉州信息工程学院教务网络管理系统成绩查询、网上选课查分登录入口...
  17. Logistic Regression逻辑回归函数Python实现
  18. cadence SPB17.4 - allegro - allegro_free_viewer
  19. 开发用于互操作性的应用程序_云标准:确保云应用互操作性的工具
  20. message:Error app.json app.json 未找到 public

热门文章

  1. 栈,实现递归的数据结构
  2. 通过ssh远程登录linux的原理过程和配置免密登录
  3. Android Binder(C语言版本)
  4. 安装支付系统PaySystem随笔
  5. C专家编程 第7章 对内存的思考 7.3 虚拟内存
  6. 三、线性规划 单纯形法
  7. java recordset 记录数_Recordset (ADO/WFC 语法)
  8. 前端学习笔记之cloneNode()
  9. 智能中医诊疗系统php代码,中医体质辨识与调理师-平安四众 - 中医体质辨识与调理【中医体质辨识与调理师】...
  10. 年少青春聊作狂,且作豪歌志四方