oracle的诊断文件的学习
诊断文件概览
甲骨文数据库包括一个故障可诊断性基础设施,用于预防、检测、诊断和解决数据库问题。问题包括代码错误、元数据损坏和客户数据损坏等关键错误。
先进的故障诊断性基础设施的目标如下:
-
主动检测问题
-
在检测到问题后限制损坏和中断
-
缩短问题诊断和解决时间
-
通过启用跟踪文件进行分区来提高可管理性,允许用户定义每块大小和要保留的最大块数,并在达到用户指定的磁盘空间限制后禁用跟踪
-
简化客户与甲骨文支持的互动
诊断文件包括:自动诊断存储库,警报日志,ddl日志,追踪文件,垃圾文件。
自动诊断存储库(ADR)是一个基于文件的存储库,用于存储数据库诊断数据,如跟踪文件、警报日志、DDL日志和健康监控报告。
子目录名称 | 存储内容描述 |
---|---|
alert | 存储警报日志(Alert Log),记录数据库启动 / 关闭、错误、参数变更等关键事件 |
cdump | 核心转储文件(Core Dump),包含实例崩溃时的内存状态,用于故障分析 |
hm | 健康监控(Health Monitor)报告,记录数据库健康检查结果和建议 |
incident | 事件(Incident)相关数据,每个事件对应一个唯一编号,包含跟踪文件、堆栈信息等 |
lck | 锁相关诊断文件,记录实例间资源锁定冲突信息(RAC 环境) |
log | 工具日志(如 RMAN、SQL*Loader),记录工具执行过程中的详细日志 |
metadata | ADR 自身的元数据,用于管理诊断数据的索引和关联关系 |
trace | 跟踪文件(Trace File),包含 SQL 执行跟踪、后台进程日志、参数调试信息等 |
oracle数据库实例ADR的目录结构
也可以通过输入命令查看其结构
警报日志
每个数据库都有一个警报日志,这是一个包含数据库消息和错误的时间顺序日志的XML文件。
警报日志内容包括以下内容:
-
所有内部错误(
ORA-600
)、块损坏错误(ORA-1578
)和死锁错误(ORA-60
) -
管理操作,如SQL*Plus命令
STARTUP
、SHUTDOWN
、ARCHIVE LOG
和RECOVER
-
与共享服务器和调度程序功能相关的几个消息和错误
-
自动刷新实体化视图期间的错误
# 以Oracle用户身份执行
adrci
# 查看当前ADR Home
show home
# 设置ADR Home(若未自动定位)
set home /u01/app/oracle/diag/rdbms/zjr/zjr
# 查看警报日志(支持时间过滤、错误类型筛选)
show alert
# 查看最近50条错误记录
show alert -tail 50 -level ERROR
# 按时间范围查询(如2025-07-05)
show alert -between "2025-07-05 00:00:00" "2025-07-05 23:59:59"
# 定位特定错误(如ORA-1578)
show alert -message "ORA-1578"
DDL日志
DDL日志的格式和基本行为与警报日志相同,但仅包含DDL语句和详细信息。数据库将DDL信息写入自己的文件中,以减少警报日志中的杂乱。
DDL日志记录是DDL文本,可选用补充信息进行增强。每个DDL语句都存在一个日志记录。DDL日志存储在ADR主目录的log/ddl
子目录中。
追踪文件
跟踪文件是包含用于调查问题的诊断数据的文件。此外,跟踪文件可以为调整应用程序或实例提供指导。
类型 | 生成者 | 典型内容 | 关键用途 |
---|---|---|---|
后台进程跟踪文件 | DBWR、LGWR、ARCH 等后台进程 | 进程状态变更、I/O 操作细节、错误堆栈(如 DBWR 的块写入失败) | 诊断实例挂起、归档失败等基础设施问题 |
服务器进程跟踪文件 | 用户会话对应的服务器进程 | SQL 执行计划、绑定变量值、等待事件(如闩锁等待)、事务回滚细节 | 优化慢 SQL、分析会话阻塞 |
SQL 跟踪文件 | 基于 SQL_TRACE 参数或 DBMS_MONITOR | 包含完整的 SQL 执行轨迹,记录每个操作的 CPU 时间、磁盘读写、递归 SQL | SQL 性能调优、执行计划验证 |
内部错误跟踪文件 | 数据库遇到 ORA-600 等错误时 | 错误参数、内存结构转储、调用栈信息(如 [kdsfdpDelete] 错误的内存地址) | 分析核心错误的根本原因 |
RMAN 跟踪文件 | RMAN 备份恢复工具 | 备份集创建过程、增量备份差异计算、恢复操作步骤(如数据文件还原路径) | 排查备份失败、恢复时间过长问题 |
网络跟踪文件 | Net8 网络进程(如 TNListener) | 连接请求处理、数据包传输细节、TCP/IP 错误(如连接超时、校验和错误) |
诊断垃圾
诊断转储文件是一种特殊类型的跟踪文件,其中包含有关状态或结构的详细时间点信息。
跟踪往往是诊断数据的连续输出。相比之下,转储通常是响应事件的一次性诊断数据输出。
事件(Incident)与跟踪转储的核心关系
在 Oracle 诊断体系中,事件(Incident) 是故障的基本单元,而跟踪转储(Trace Dump) 是事件的核心诊断数据载体,两者关系遵循以下逻辑:
- 事件触发转储生成:当数据库检测到错误(如 ORA-600)或异常时,自动创建事件,并生成对应的跟踪转储文件;
- 转储文件的事件绑定:每个转储文件均包含事件编号(Incident ID),确保诊断数据与事件的唯一关联;
- 多级转储机制:复杂事件可能生成多个转储(如堆转储、系统状态转储),通过
dump_id
区分同一事件下的不同转储内容。
转储类型 | 生成场景 | 关键诊断价值 |
---|---|---|
事件基础转储 | 事件创建时自动生成,记录错误基本信息 | 错误代码、参数、时间戳、进程环境 |
堆转储 | 进程内存堆(Heap)异常时生成,如内存 corruption | 分析内存结构损坏、指针错误 |
系统状态转储 | 数据库挂起或死锁时生成,记录全局资源状态 | 闩锁持有情况、等待链、资源竞争关系 |
SQL 跟踪转储 | 关联到特定 SQL 的执行跟踪,包含执行计划和统计信息 | SQL 性能瓶颈定位、执行计划异常分析 |
PGA 转储 | 进程全局区(PGA)内存转储,用于分析排序、哈希等操作的内存使用 | 诊断 PGA 内存泄漏、排序溢出问题 |
具体流程