课程内容
目的:
展示悬挂,循环,崩溃的诊断过程
描述状态对象的目的
解释,确定和诊断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. 查询相关数据字典表和视图