一、定义
1、crash
在Oracle数据库环境中,“crash”(崩溃)指的是数据库实例或进程由于内部错误或操作系统违规而意外停止运行的情况。这种情况通常由以下原因引起:
- 内部错误:这些是Oracle软件内部发现的错误,通常以"ORA-00600"错误代码形式出现。这些错误通常指示软件中存在未预料到的问题,可能是由于软件缺陷或其他异常情况导致。
- 操作系统错误:这指的是数据库进程由于操作系统级别的异常而停止运行。例如,在UNIX系统中可能遇到的"segmentation violation"(段违规)或"bus errors"(总线错误),在Windows系统中可能遇到的"access violation"(访问违规)等。这些错误通常表明进程尝试访问不允许或不存在的内存区域。
崩溃可能导致数据库服务中断,需要管理员介入进行恢复操作。恢复过程可能包括重启数据库、检查和修复数据文件、分析和解决导致崩溃的根本原因等步骤。
2、Hang
在Oracle数据库环境中,“hang”(挂起)指的是数据库进程因等待某个永远不会发生的事件而停止响应。挂起可能会导致数据库操作无法完成,影响数据库的正常运行。挂起情况通常表现为:
- CPU使用率极低:在挂起情况下,受影响的进程或实例几乎不使用CPU资源,因为它们在等待某个条件满足,而这个条件实际上永远不会发生。
- 无活动:数据库管理员可能会发现,尽管系统中存在活跃的会话和进程,但实际上没有任何数据库操作在进行,或者特定操作无法完成。
挂起的原因可能多种多样,比如:
- 死锁:两个或多个进程互相等待对方释放资源,导致它们都无法继续执行。
- 资源竞争:大量进程竞争有限的资源(如锁、latch等),导致一些进程长时间等待。
- 配置问题:数据库或系统的配置不当,导致进程无法获取所需资源。
为了诊断和解决挂起问题,数据库管理员可以使用多种工具和方法,包括: - 状态转储(State Dumps):通过生成和分析进程状态转储或系统状态转储,管理员可以查看进程在挂起时的状态,包括它们正在等待的事件。
- 动态性能视图:Oracle提供了多个动态性能视图,如
V$SESSION_WAIT、V$LOCK、V$LATCH等,通过查询这些视图,可以获取有关当前数据库活动和等待事件的信息。 - HANGANALYZE事件:这是一个诊断工具,用于分析数据库挂起情况,可以帮助识别等待链和可能导致挂起的进程。
3、Loop Situations
在Oracle数据库环境中,“Loop Situations”(循环情况)指的是数据库进程陷入了重复执行某些操作的无限循环中,而这些操作实际上并不会导致进程状态的任何进展。这种情况通常表现为高CPU使用率,因为进程在不断执行操作而没有停止或等待的迹象。
循环情况可能由多种原因引起,包括但不限于:
- 程序逻辑错误:应用程序或数据库触发器中的逻辑错误可能导致无限循环。
- 配置问题:错误的数据库或系统配置可能导致进程在尝试完成任务时陷入循环。
- 资源争用:在某些情况下,进程可能在尝试获取无法获得的资源时陷入循环,尽管这更常见于挂起情况。
与挂起情况不同,循环情况通常表现为持续的高CPU使用率,这是因为进程在不断地执行操作。
为了诊断和解决循环情况,可以采取以下方法:
- 系统状态转储(System State Dumps):通过生成系统状态转储,管理员可以查看所有进程的当前状态和它们正在执行的操作,这有助于识别处于循环中的进程。
- 跟踪和分析:启用SQL跟踪或事件跟踪,以收集导致循环的操作的详细信息。
- 查看动态性能视图:查询如
V$SESSION和V$SESSION_WAIT等动态性能视图,可以帮助识别正在执行的操作和可能的循环。
解决循环情况可能需要修改引起循环的应用程序代码、调整数据库配置或优化数据库操作。
二、诊断文件
Oracle数据库在诊断问题时会生成和使用多种诊断文件。这些文件对于理解和解决数据库运行中遇到的问题至关重要。以下是一些主要的诊断文件,以及它们的生成方式和使用方法:
- Alert.log文件
- 生成方式:Oracle自动在背景进程中生成和更新这个文件,记录数据库启动、关闭、检查点、错误(如ORA-错误)等重要事件。
- 使用方法:定期检查alert.log文件对于及时发现和诊断数据库问题是非常有用的。例如,如果数据库意外崩溃,可以查看alert.log文件中的最后几条记录来获取线索。
- Trace文件
- 生成方式:当Oracle进程遇到错误(如ORA-600内部错误)时,Oracle会自动生成trace文件。管理员也可以手动触发跟踪来收集特定事件或操作的详细信息。
- 使用方法:Trace文件包含了错误发生时的详细上下文信息,包括执行路径、变量值和堆栈跟踪。通过分析这些信息,可以更准确地定位问题的根源。
- Core Dump文件(UNIX/Linux)
- 生成方式:当数据库进程由于严重错误而异常终止时,操作系统可能会生成core dump文件。这个文件包含了进程终止时的内存映像。
- 使用方法:Core dump文件通常需要使用特定的调试工具(如gdb)来分析。它可以提供导致进程崩溃的深入信息,但需要相当的专业知识来解读。
- System Log文件
- 生成方式:这不是Oracle直接生成的文件,而是操作系统记录的系统事件日志,如/var/log/messages(在Linux上)。
- 使用方法:检查系统日志文件有助于识别数据库问题是否由操作系统级别的事件(如硬件故障、网络问题等)引起。
三、Hang Situations
1、挂起情况的定义
挂起是指进程由于等待一个不会发生的事件而停止进展。这可能导致数据库操作无法完成,影响数据库的正常使用。
2、诊断工具和方法
查找挂起原因的方法通常涉及以下步骤和工具,以诊断和解决Oracle数据库的挂起问题:
- 检查Alert.log文件:
- 首先查看数据库的alert.log文件,这个文件记录了数据库的重要事件和错误信息,可能包含导致挂起的线索。
- 使用动态性能视图:
- V$SESSION_WAIT:查找当前等待事件的会话。这可以帮助识别正在等待的资源或事件。
- V$LOCK:识别锁争用情况,查看是否有会话被其他会话持有的锁阻塞。
- V$LATCH和V$LATCHHOLDER:查找闩锁(latch)的争用情况,了解是否有进程因等待闩锁而挂起。
- 生成和分析系统状态转储(System State Dump):
- 如果挂起问题无法通过查看动态性能视图解决,可以考虑生成系统状态转储。通过执行如下命令:
ALTER SESSION SET EVENTS immediate trace name SYSTEMSTATE level 10;。这将生成一个详细的系统状态报告,包括所有活动会话和进程的状态信息。
- 如果挂起问题无法通过查看动态性能视图解决,可以考虑生成系统状态转储。通过执行如下命令:
- 使用HANGANALYZE事件:
- HANGANALYZE是一个诊断工具,用于分析和诊断挂起情况。通过设置事件来触发HANGANALYZE,如:
ALTER SESSION SET EVENTS immediate trace name HANGANALYZE level 3;。根据设置的级别,HANGANALYZE可以提供关于挂起链和死锁的信息。
- HANGANALYZE是一个诊断工具,用于分析和诊断挂起情况。通过设置事件来触发HANGANALYZE,如:
- 查询V$SESSION视图:
- 查询
V$SESSION视图来查找长时间运行的会话或者查看会话的状态,判断是否有会话处于等待状态,并分析它们等待的资源。
- 查询
- 跟踪特定会话:
- 对疑似导致挂起的会话开启SQL跟踪,以收集更多执行细节。使用
DBMS_MONITOR.SESSION_TRACE_ENABLE过程或ALTER SESSION SET SQL_TRACE = TRUE;命令。
- 对疑似导致挂起的会话开启SQL跟踪,以收集更多执行细节。使用
- 查看操作系统和硬件日志:
- 检查操作系统和硬件日志可能提供关于系统层面问题的线索,如I/O性能瓶颈、网络问题或硬件故障。
3、hanganlyze分析
HANGANALYZE是Oracle提供的一个强大工具,用于分析和诊断数据库挂起(hang)情况。当数据库出现挂起时,HANGANALYZE可以帮助识别挂起的进程及其等待的资源,从而找到导致挂起的根本原因。
- 触发HANGANALYZE:
-
可以通过执行如下命令来触发HANGANALYZE:
ORADEBUG SETMYPID ORADEBUG HANGANALYZE 3 -
这里的数字3是分析级别,不同的级别会产生不同详细程度的输出。级别3通常用于分析挂起情况
- 查找Open Chains:
- HANGANALYZE的输出中,首先查找"Open chains found"部分。这部分显示了挂起链,即一系列相互等待的进程。
- 分析Wait Chains:
- 每个挂起链会以
Chain # :开始,后面列出了参与挂起的进程及其等待事件。通过分析这些等待事件,可以找到可能的挂起原因。
- 查看Node States:
- HANGANALYZE输出中的"Node states"部分列出了各个进程(节点)的状态,如LEAF(叶节点,即等待链的末端)、IGN(忽略)、NLEAF(非叶节点,即等待链中的中间节点)等。
4、如何阅读HANGANALYZE日志:
- 关注等待事件:查找等待时间最长的事件,这些通常是导致挂起的直接原因。
- 识别死锁:如果发现等待链中的进程相互等待对方释放资源,这可能是死锁的迹象。
- 分析资源争用:如果多个进程等待同一资源,这可能是资源争用问题。
- 检查IGN和LEAF节点:IGN(Ignore)节点可能不是挂起问题的直接原因,而LEAF(叶节点)可能是分析的重点,因为它们直接参与等待事件。
Chain 1:
<session_id/session_serial#/process_id/os_process_id/wait_event> :
<13/158/0x826dbecc/19623/No Wait>
5、System State Dump
阅读和分析System State Dump(系统状态转储)是一项高级技能,需要对Oracle内部结构有深入的理解。System State Dump提供了数据库实例在特定时刻的详细快照,包括所有进程的状态、等待事件、锁和闩锁(latch)信息等。以下是分析System State Dump的一些基本步骤和要点:
1. 寻找错误和异常
- 首先,检查转储文件的开头部分,通常会列出生成转储的原因,比如特定的错误代码(如ORA-600)。
- 在整个转储中搜索"error"或"exception"等关键词,以找到可能的问题点。
2. 分析进程和会话信息
- System State Dump中会包含所有进程(包括前台和后台进程)的信息。每个进程会有一个Process State Object部分,显示该进程的状态和它正在执行的操作。
- 查找与问题相关的进程或会话ID(如果已知),并专注于这些部分的信息。
3. 查看等待事件
- 转储中会包含等待事件(wait events)信息,这对于识别性能瓶颈和资源争用非常重要。
- 关注"waiting for"或类似的字样,以确定进程正在等待的资源或事件。
4. 锁和闩锁信息
- 分析与锁(locks)和闩锁(latches)相关的信息,这些通常是数据库挂起和性能问题的常见原因。
- 查找"enqueue"和"latch"等关键词,以识别可能的争用和死锁情况。
5. 使用Oracle提供的工具和脚本
- Oracle提供了一些工具和脚本,如Trace Analyzer和ORADEBUG,可以帮助分析转储文件。
- 这些工具可能会自动识别问题并提供更易于理解的分析结果。
四、Looping
1、循环情况的定义
循环情况是指进程等待某个不会发生的事件,如试图获取一个由另一个状态对象持有的资源,导致进程无限重复某些操作。
2、诊断工具和方法
- 生成多个状态转储(state dumps)和错误堆栈(error stacks)。
- 使用
V$SESSION_WAIT、V$LOCK、V$LATCH和V$LATCHHOLDER等动态性能视图来查看等待事件和相关锁信息。 - 在频繁间隔内获取多个系统状态转储,以观察进程状态的变化。
- 通过
oradebug命令附加到特定进程,生成进程状态转储。 - 使用
ass.awk脚本分析系统状态转储,识别重复的等待事件和可能导致循环的锁。
3、Error Stacks分析
Error Stacks(错误堆栈)日志是Oracle数据库在遇到错误时生成的详细诊断信息,它们记录了错误发生时的函数调用序列。这些信息对于诊断和解决数据库问题非常有价值。
- 定位错误代码和错误消息
- 错误堆栈通常以ORA-错误代码开始,后跟具体的错误消息。这提供了问题的初步描述。例如,
ORA-00600: internal error code, arguments: [...]。
- 分析错误参数
- 对于内部错误(如ORA-00600或ORA-07445),紧随错误代码的参数提供了关于错误上下文的额外信息。
- 查看函数调用序列
- 错误堆栈包含了错误发生时的函数调用序列。这是一系列函数或过程名称,显示了错误发生时执行的路径。这些信息从底部向上阅读最为直观,因为它从触发错误的最初函数开始,一直到错误被捕获并报告的地方。
- 识别关键函数和模块
- 在函数调用序列中,尝试识别任何已知的函数或模块名称。这可能会帮助你理解错误发生的上下文,比如是在执行特定类型的操作时(如访问表、执行事务)遇到问题。
4、ass.awk
- 准备System State Dump文件:
确保你有一个需要分析的System State Dump文件。这个文件通常是在数据库遇到问题时,通过Oracle诊断命令生成的。 - 运行
ass.awk脚本:
在命令行中,使用AWK命令运行ass.awk脚本并将系统状态转储文件作为输入。命令格式如下:
这个命令会将分析结果输出到awk -f ass.awk system_state_dump_file > analysis_output.txtanalysis_output.txt文件中。 - 查找等待事件和锁:
ass.awk输出会组织和高亮显示等待事件和锁争用信息,这对于识别性能瓶颈和死锁问题非常有用。 - 识别热点函数和模块:
分析输出中会包含函数调用的信息,帮助你识别可能的问题区域或热点代码路径。 - 检查进程和会话信息:
五、State Objects
1、定义
状态对象是Oracle数据库中的一种内部结构,用于表示和管理数据库中的不同实体的状态。这些对象存储在系统全局区(SGA)中,对于数据库的运行和管理至关重要
2、类型
在Oracle数据库中,状态对象(State Objects)是内存中的结构,用于表示和管理数据库实体的状态和信息。这些对象对于数据库的运行、管理和诊断非常关键。以下是一些主要类型的状态对象及它们承载的信息和状态概述:
- 进程状态对象(Process State Objects)
包含关于数据库进程的信息,如进程ID、进程类型(前台进程、后台进程等)、执行的SQL语句、等待事件和锁信息。进程状态对象有助于管理和监控数据库进程的运行状态。 - 会话状态对象(Session State Objects)
话状态对象包含关于用户会话的信息,例如会话ID、登录用户、当前执行的操作、会话的资源使用情况、事务状态和等待事件。会话状态对象对于理解用户会话的行为和性能问题诊断至关重要。 - 事务状态对象(Transaction State Objects)
务状态对象存储了关于数据库事务的信息,如事务ID、事务开始和结束的时间戳、事务涉及的数据锁、回滚段信息等。这些对象对于管理数据库事务和诊断事务相关问题非常有用。 - 锁状态对象(Lock State Objects)
锁状态对象表示数据库中的锁,包括锁的类型(如行锁、表锁等)、锁的状态(等待、持有)、锁的持有者和等待锁的会话。锁状态对象对于识别和解决锁争用和死锁问题非常重要。 - 闩锁状态对象(Latch State Objects)
闩锁(Latch)是一种轻量级的同步机制,用于保护数据库的内部数据结构。闩锁状态对象包含闩锁的名称、状态(如是否被持有)、持有者信息。这些对象对于分析数据库的并发控制和性能调优非常有用。 - 缓冲区句柄状态对象(Buffer Handle State Objects)
缓冲区句柄状态对象与数据库缓冲区缓存中的数据块相关,包括数据块的地址、数据块的状态(脏、干净、固定、未固定)等。这些对象对于理解数据库的I/O性能和缓存管理策略非常重要。
3、查看状态对象信息
查看Oracle数据库中的状态对象信息通常涉及到分析诊断文件,如系统状态转储(System State Dumps)和进程状态转储(Process State Dumps),以及查询动态性能视图(Dynamic Performance Views)。以下是几种方法来查看状态对象信息:
- 系统状态转储(System State Dump)
系统状态转储提供了数据库实例在特定时刻的全面快照,包括所有活动状态对象的信息。要生成系统状态转储,可以使用以下命令:
ALTER SESSION SET EVENTS immediate trace name SYSTEMSTATE level 10;
或者使用oradebug命令:
ORADEBUG DUMP SYSTEMSTATE 10
转储文件将被写入数据库的诊断目录中。在这个文件中,你可以查看到进程、会话、锁和其他状态对象的详细信息。
- 进程状态转储(Process State Dump)
进程状态转储提供了单个进程的详细信息。要生成进程状态转储,可以使用以下命令:
ALTER SESSION SET EVENTS immediate trace name PROCESSSTATE level 10;
或者使用oradebug命令:
ORADEBUG SETORAPID <进程ID>
ORADEBUG DUMP PROCESSSTATE 10
这将生成包含特定进程状态信息的转储文件,包括该进程相关的会话和事务信息。
- 查询动态性能视图
Oracle提供了一系列动态性能视图(V$视图),用于监控和诊断数据库运行时的状态。以下是一些常用的视图:
- V$PROCESS:显示数据库进程的信息。
- V$SESSION:显示当前活动会话的信息。
- V$LOCK:显示数据库中当前锁的信息。
- V$LATCH:显示闩锁的信息。
- V$TRANSACTION:显示当前活动事务的信息。
通过查询这些视图,可以获得关于状态对象的实时信息。例如,要查看所有活动会话的信息,可以执行:
SELECT SID, SERIAL#, USERNAME, STATUS FROM V$SESSION;




