博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

善待自己,切莫活在过去

上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之。弗笑,不足以为道。是以建言有之,曰:明道若昧,进道若退,夷道若颡;上德若谷,广德若不足,建德若(女俞),质真芳渝;大白若辱,大方无隅,大器晚成,大音希 声,大象无形。道隐无名。夫唯道,善始且善成。 ---------出自《老子》第四十一章
  pvb1979.cublog.cn

关于作者
姓名:三国武将
职业:IT
年龄:属羊
位置:上海
个性介绍:生命是短暂的,博客是无限的。
不曾清贫难成人,不受打击老天真
|| << >> ||
我的分类


DSI401笔记--关于oracle的internal信息
课程内容
目的:
  展示悬挂,循环,崩溃的诊断过程
  描述状态对象的目的
  解释,确定和诊断heap冲突
  分析数据块和索引块的dumps
  确认回滚段错误并恢复
 DSI401e 摘要
源代码访问
  使用cscope
  错误,初始化参数,安装表和视图
  sql语句执行
诊断事件
  事件种类
  事件和spfile
  查找在源代码中的事件和dumps
使用DUL来抢救数据
 
重要的提醒

====第一章介绍了关于oracle的历史

第二章 crash,hang和循环情况
 
目的:
  完成该章内容后,能处理以下问题
   1。 分析由崩溃产生的trace文件和stack trace文件
   2。 描述状态dumps和他们在针对悬挂或死循环情况下的使用
   3。查询相关数据字典表和视图
 普遍故障
  1。一个实例或进程的崩溃
     a。 实例错误 (ora-600)
     b。 操作系统冲突
        segmentation violation,bus error(unix),access violation(NT)
     c。 等待一个不会发生的事件 的一个oracle进程
     d。 进程的循环,无限重复执行一些操作
  死循环和悬挂的不同之处是 loop你能看到100%的cpu使用和大量的活动。悬挂
你看到的0%的cpu和没有活动。
 
 诊断文件
  1。 alert.log文件
  2。trace 文件
  3。 应用程序的log文件,譬如sql*plus的trace文件
  4。 core dump 文件
  5。 系统的log 文件
 
alert.log文件
 每一个实例都创建一个alert.log文件,记录以下的信息
   1。诊断来自前台和后台进程的数据
   2。总结关于错误的信息和指向trace文件的详细信息
   3。从数据库创建开始的信息,在后台跟踪错误的时候可能会有用

trace文件
  1。每个服务进程,在遇到例外问题的时候,会写诊断数据到trace文件
  2。trace文件头包含以下信息
    a. OS 和版本
    b。oracle版本 和 安装选项
    c。实例名字
    d。进程id
  在trace文件中最重要的一种信息就是stack trace。
  stack trace描绘了在崩溃前,那些被崩溃进程的call的次序。
  使用一个连接源代码stack trace来理解难题
 
应用程序日志文件
 
系统日志文件
   a。 系统日志文件捕捉错误信息和OS层遇到的例外
   b。 如果一个硬件或OS问题被怀疑,这是很有用的
悬挂情况
   a。 进程等待不会发生的事件
   b。 有用的工具来诊断这些情况包括:
        多个状态dump
        v$session_wait,v$lock,v$latch,v$latchholder
        HANGANALYZE 事件
   c。 视图或状态dump来揭露导致hang的信息
 
hanganalyze事件
    a。hanganalyze事件在数据库悬挂事件或死锁情况下是很有用的。
    b。能被设置成在ORA-60(死锁)时候触发
    c。依靠level设置,hanganalyze要求各种进程去dump一个errorstack。
  
   悬挂分析 尽力通过简历等待链计算出谁正在等待谁,然后依靠level要求各种
进程去dump他们的errorstack。
   命令为
   alter session set events 'immediate trace name HANGANALYZE level 4';
====稍后做测试
循环
  a。当等待不会发生事情的进程会发生循环,譬如要求的资源被其他对象控制。
  b。在系统状态下,循环是作为一个等待事件
  c。找到这个事件可以使用视图
      v$session_wait,v$lock,v$latch,v$latchholder
  d。视图或dumps将揭露导致looping行为的信息
一个系统状态的dump在诊断looping情况时是很有用的。如下命令
  SQL> alter session set events 'immediate trace name systemstate level
10';
另外,对该进程使用ORADEBUG
  SQL> oradebug setospid <PID>    ----Set OS pid of process to debug
  SQL> oradebug dump systemstate 10   ----Invoke named dump
 你可以从v$session_wait来得到其他信息。
诊断循环情况
  为了确认循环问题:
 a。在频繁的时间间隔上做多个系统状态dumps。
 b。使用oradebug针对该进程做个stack trace。
 c。使用ass.awk来指定等待事件
 d。频繁的间隔查询相关数据字典视图,查找进程状态的变化
  使用ass.awk进程跟踪诊断工具来处理系统对象状态的输出如下。这个工具是一
个awk脚本来提取这些dumps的重要信息。注意反复试图要求这个行缓存锁定
333b5f30和336e6540。资源,锁定和状态部分说明一个典型的死锁情形。
性能缓慢
  a。 如果一个进程没有挂起也没有死循环,那么它可能就是缓慢,需要调优。
  b。 调优能在硬件,数据库,应用不同层面被执行
  c。 使用statpack来收集,自动化,存储和查看性能数据。
  d。 分析BSTAT/ESTAT和TKPROF输出,应用和数据库层面的理解是一个好的开始
点。
 unix上多次执行'ps -ef|grep <pid>',查看TIME字段的值。
   1。如果该值没有增加,那么进程不会获得任何CPU时间。
   2。如果值在增加,那么进程没有挂起。
  这是一个典型 的性能问题:这个进程的部件(应用,网络,数据库)需要被调优
。你应该搜索冲突,锁信息和磁盘IO。好的诊断工具就是STATSPACK或
BSTAT/ESTAT报告。statspack和UTLBSTAT/UTLESTAT调优工具在收集更多信息上是
不同的,它永久的存储执行数据到oracle表中,稍后作为报告和分析使用。收集
的数据能被报告提供来分析,包括"instance health and load"摘要,高耗资源
的SQL语句,和传统等待事件和初始化参数。诊断和性能调优问题不属于这章范畴
对象状态
  a。 状态对象是在SGA中的结构,和各种数据库的实体有关,如:
     1。后台和前台进程
     2。会话
     3。Latch 和 enqueues
     4。缓存句柄
  b。 有几种状态对象的类型,包括进程,会话和事务状态对象
  c。 使用PMON来清空故障占用的资源
  d。 状态对象能在system state和process state dumps中查看到。
 
处理状态对象
  1。每个oracle后台和前台进程有一个相关进程状态对象
  2。
状态对象:层次
          process
session       session      call
transaction
一个进程有一个会话,多个的情况发生在共享服务模式。一个会话有多个事务。

状态dump
 a。你能dump状态对象到trace文件来诊断问题
 b。有两类dump
    1。进程state dumps
    2。系统state dumps
 c。一个进程state dump是所有这个进程中的状态对象的dump
 d。一个系统state dump是在系统中所有进程的状态对象的dump
  如果你分析这个来自特定process的问题,那么一个进程state dump可以足够多
的来诊断一个问题。注意,然而,这个问题可能在其他地方也有,一个完整地系
统state dump(通常其中许多)被要求来分析找个冲突进程。
process state dumps的命令
  a。dump一个进程状态
     SQL> alter session set events 'immediate trace name processstate
level 10';
  b。 dump 一个错误的进程状态(from init.ora)
     <error#> "trace name processstate level 10"
  c。 dump目前正运行的进程状态
     SQL> oradebug setospid <process id>
     SQL> oradebug dump processstate 10
一个进程状态dump的例子
 process state
---------------
so:8004790c,  type:3 , owner: 8003cbb4, flag:INITA/-/-/0x00
  (session) trans:0 ,creator:8003cbb4,flag: (41) USR/- -/-/-/-
            DID: 0001-0008-00000005, short-term DID:0000-000-00000000
            txn branch:0
            oct:0,prv:0,user:0/SYS
   O/S info : user:dsi,term:pts/1,ospid:12129 ,machine:ccd-orsun3      
            program: svrmgrl@ccd-orsun3 (TNS V1-V3)
   last wait for 'SQL*NET message from client' seq=234 wait_time=-2
            driver id=62657100, #bytes=1, =0
---------------------------------------------------------------------
 commponent    definition
 SO     状态对象地址
 type   对象类型的索引入口,在下一行打印(进程,会话等等)       
 owner  拥有这个状态对象的状态对象地址
 flag   INIT:对象被初始化; FLST:在freelist ;CLN:对象被PMON释放
 DID    资源ID
 
系统状态dumps
  一个系统状态是实例中的所有进程的进程状态dump
系统状态dump的命令
  a。立即dump一个系统状态
   SQL> alter session set events 'immediate trace name systemstate level 10';
  b。dump一个error系统状态(来自init.ora)
   "<error#> trace name systemstate level 10"
  两种方式展示了如何调用系统状态dump。都需要一个用户会话。
读系统状态dump
 一个系统状态dump有3部分:
  a. 正常的trace文件头
  b. 系统全局信息
  c. 进程信息
 
系统状态dump中进程状态对象
 SYSTEM STATE
------------
System global information:
 ...............
PROCESS 41:
  ----------------------------------------
  SO: 340e609c, type: 1, owner: 0, pt: 0, flag: INIT/-/-/0x00
  (process) Oracle pid=41, calls cur/top: 0/3296c61c, flag: (0) -
            int error: 0, call error: 0, sess error: 0, txn error 0
  (post info) last post received: 0 0 0
              last post received-location: No post
              last process to post me: none
              last post sent: 0 0 0
              last post sent-location: No post
              last process posted by me: none
    (latch info) wait_event=0 bits=0
    Process Group: DEFAULT, pseudo proc: 34104cd8
    O/S info: user: oracle, term: UNKNOWN, ospid: 54384
    OSD pid info: 54384
以上引用的是一段process state object,第三行中的type是1,表示是进程(process),这里的owner是固定的

第四行:oracle的进程id是41,从v$process.pid字段可以找到。
在刮号中的flag标志值是0,
其他标志值有 0x01 --死进程并且将被清除
             0x02 --一个system进程
             0x04 --该进程是PMON
             0x08 --该进程是SMON
             0x10 --该进程PSEUDO进程,用于共享服务模式
             0x20 --oracle共享服务器
             0x40 --dispatch 进程
第五行:int error 在下次中断时发布的error code
        call error返回给用户的error代码 
        sess error当指定用户在会话创建的时候返回的oracle error
第6-11行:中间进程张贴信息被展示在此
第12行:被ksldmp dump 出的latch(闩)信息,包括等待事件和任何闩拥有的比特队列被展示。
第13-14行: 系统数据,有用户,进程id,unix 进程名字。
系统状态dump中的会话状态对象
SO: 3411cfb0, type: 3, owner: 340e609c, pt: 0, flag: INIT/-/-/0x00
    (session) trans: 0, creator: 340e609c, flag: (48000041) USR/- -/-/-/-/-/-
              DID: 0000-0000-00000000, short-term DID: 0000-0000-00000000
              txn branch: 0
              oct: 0, prv: 0, user: 31/STOREDBA
    O/S info: user: psistore, term: pts/8, ospid: 40154, machine: lshas34
              program: sqlplus@lshas34 (TNS V1-V3)
    waiting for 'SQL*Net message from client' blocking sess=0x0 seq=5663 wait_time=0
                driver id=54435000, #bytes=1, =0
上述资料的第一行:状态对象id和指定的拥有者。
第二行:事务SO的地址(trans),会话类型(flag),可能值如下
 0x0001--用户会话而不是递归会话
 0x0002--递归会话(通常internal)
 0x0008--从plsql中取消commit/rollback
 0x0010--由系统进程创建的用户会话
 0x0020--当UGA在SGA中分配时设置
 0x0040--登陆到oracle中的用户会话
 0x0080--由oracle共享服务创建的用户会话
   描述字母代码
 USR-用户会话
 BSY-会话忙,正在被call
 DED-会话被用户进程标志为死
 DEL-会话被删除(通过使用alter system kill)
 KIL-由于被KILL故被标志(通过使用alter system kill)
 
 
第3-4行:DID(resource id)和事务联系在这里显示
第5行:oct(oracle的命令种类),prv(用户权限),user(用户id/用户名)
第8行:资源等待,等待和睡眠时间被展示

呼叫状态对象
    SO: 3296c61c, type: 2, owner: 340e609c, pt: 0, flag: INIT/-/-/0x00
    (call) sess: cur 3411cfb0, rec 0, usr 3411cfb0; depth: 0
第一行: 状态对象ID,type是2(call),拥有进程的状态对象被显示。
第二行: sess 是目前用来呼叫会话状态对象的地址;rec是用来呼叫递归会话的地址;usr是用来呼叫的用户会话地址;depth是递归的层次。
 
 
数据字典视图
 以下视图在诊断挂起或循环情况下是很有用的
  a. v$session_wait,v$session_event
  b. v$latch,v$latchholder,v$latchname
  c. v$sysstat,v$lock
  d. x$kcbfwait (buffer waits),x$ksqst (enqueues)
总结
  在这课中,你将能学习如何
   a. 分析来自崩溃的trace file和stack trace
   b. 展示状态dumps和分析挂起或循环情况的方法
   c. 查询相关数据字典表和视图
 
 

发表于: 2006-06-28,修改于: 2006-06-28 16:09,已浏览489次,有评论0条 推荐 投诉


网友评论
 发表评论