62-Oracle ADR(Automatic Diagnostic Repository)
小伙伴有没有被alter、dump等各种日志、报警文件撑爆磁盘的经历。实例卡了崩了,满服务器翻alert.log、trace文件。现在可以直接adrci一条命令通吃所有组件日志。还有可以控制数据库抽风狂报ORA-600的时候,ADR自动限流,空间不再会被dump文件撑爆,现在即使实例崩了,还是adrci继续可用。不过XML格式的alert log,每次还是需要开ADRCI用show alert -p "message_text like '%ORA-%'"过滤错误。ips create package一键打包事件,官方支持更方便了。
一、ADR核心功能
- 集中存储跟踪文件(Trace)、警报日志(Alert Log)、核心转储(Core Dumps)、健康检查报告(Health Monitor Reports)、DDL日志等。
- 支持数据库、ASM、监听器、Clusterware等多组件,每个实例独立目录(ADR Home)。
- 问题(Problem):严重错误(如ORA-600)分配唯一问题键(Problem Key)。
- 事件(Incident):同一问题的每次发生生成带时间戳的事件,分配事件ID(Incident ID),自动触发告警至OEM。
- 洪水控制(Flood Control):限制高频事件的诊断数据生成,避免系统过载(如仅记录日志,不生成转储)。
- 基于文件系统存储,数据库不可用时仍可访问(如崩溃恢复场景)。
- 命令行工具adrci:查看日志、清理文件、打包事件数据。
- 动态视图V$DIAG_INFO:实时查询关键路径(如警报日志位置)。
二、技术原理
1. 目录结构
层级 | 路径规则 | 说明 |
ADR Base | DIAGNOSTIC_DEST参数指定 (默认$ORACLE_BASE或$ORACLE_HOME/log) | 根目录 |
ADR Home | diag/<product_type>/<product_id>/<instance_id> | 实例专属目录 |
子目录 | alert/, trace/, incident/, cdump/, hm/ | 分别存储XML警报日志、跟踪文件、事件数据等 |
2. 诊断数据类型
类型 | 内容 | 示例文件 | |
警报日志(Alert Log) | 内部错误(ORA-600)、管理操作(STARTUP/SHUTDOWN)、死锁事件 | log.xml(XML格式) | |
跟踪文件(Trace) | 进程活动、SQL执行详情、错误堆栈 | orcl_ora_12345.trc | |
DDL日志 | 所有DDL语句记录(需手动启用) | ddl.log |
3. 关键机制
- 洪水控制:相同问题事件频繁发生时,抑制转储生成,仅保留日志条目。
- 健康监控:自动生成报告(如数据块损坏检查),存储于hm/目录。
三、版本演进
版本 | 关键改进 |
Oracle 11g | 引入ADR,替代BACKGROUND_DUMP_DEST等分散参数,统一存储诊断数据。 |
Oracle 12c | 增强多租户支持,每个PDB独立事件跟踪;优化adrci的事件打包(IPS)功能。 |
Oracle 19c~ | 集成机器学习(如自动根因分析);支持云环境诊断数据直传Oracle Support。 |
四、验证脚本
1. 查询ADR路径
-- 查看所有关键路径
SELECT name, value FROM V$DIAG_INFO;
输出示例23ai和19c:
SELECT name, value FROM V$DIAG_INFO;NAME VALUE
________________________ _____________________________________________________________
Diag Enabled TRUE
ADR Base /opt/oracle
ADR Home /opt/oracle/diag/rdbms/free/FREE
Diag Trace /opt/oracle/diag/rdbms/free/FREE/trace
Diag Alert /opt/oracle/diag/rdbms/free/FREE/alert
Diag Incident /opt/oracle/diag/rdbms/free/FREE/incident
Diag Cdump /opt/oracle/diag/rdbms/free/FREE/cdump
Health Monitor /opt/oracle/diag/rdbms/free/FREE/hm
Default Trace File /opt/oracle/diag/rdbms/free/FREE/trace/FREE_ora_154577.trc
Active Problem Count 0
Active Incident Count 0
ORACLE_HOME /opt/oracle/product/23ai/dbhomeFree
Attention Log /opt/oracle/diag/rdbms/free/FREE/trace/attention_FREE.log13 rows selected.
---
SYS@CDB$ROOT> SELECT name, value FROM V$DIAG_INFO;
NAME VALUE
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /u01/app/oracle/diag/rdbms/test19/test19
Diag Trace /u01/app/oracle/diag/rdbms/test19/test19/trace
Diag Alert /u01/app/oracle/diag/rdbms/test19/test19/alert
Diag Incident /u01/app/oracle/diag/rdbms/test19/test19/incident
Diag Cdump /u01/app/oracle/diag/rdbms/test19/test19/cdump
Health Monitor /u01/app/oracle/diag/rdbms/test19/test19/hm
Default Trace File /u01/app/oracle/diag/rdbms/test19/test19/trace/test19_ora_30455.trc
Active Problem Count 0
Active Incident Count 0
ORACLE_HOME /u01/app/oracle/product/19.3.0/dbhome_1已选择 12 行。
2. 使用adrci管理日志
adrci
show homes -- 列出所有ADR Home
set home diag/rdbms/orcl/orcl -- 切换目录
show alert -tail 20 -- 实时查看警报日志尾部
purge -age 1440 -type incident -- 清理24小时内的事件数据
--
[oracle@OL97 ~]$ adrciADRCI: Release 23.0.0.0.0 - Production on Sun Jun 22 12:28:33 2025Copyright (c) 1982, 2025, Oracle and/or its affiliates. All rights reserved.ADR base = "/opt/oracle"
adrci> show homes;
ADR Homes:
diag/rdbms/free/FREE
diag/clients/user_oracle/RMAN_3026389520_115
diag/clients/user_oracle/host_3026389520_115
diag/tnslsnr/OL97/listener
diag/orapwd/ol97/kuzr
adrci> set home diag/rdbms/free/FREE
adrci> show alert -tail 2
2025-06-22 08:37:44.840000 +08:00Current log# 2 seq# 59 mem# 0: /opt/oracle/oradata/FREE/redo02.log
NET (PID:151752): Archived Log entry 54 added for B-1203593363.T-1.S-58 LOS:0x0000000000552488 NXS:0x0000000000552551 NAB:319 ID 0x57f538d2 LAD:1 [krse.c:4872]
adrci> purge -age 1440 -type incident
3. 启用DDL日志
---- 启用后DDL记录到log/ddl.log
ALTER SYSTEM SET enable_ddl_logging = TRUE;
SYS@CDB$ROOT> ALTER SYSTEM SET enable_ddl_logging = TRUE;
System altered.
4. 事件打包(供Oracle Support分析)
adrci
ips create package incident <incident_id> -- 创建逻辑包
ips generate package 1 in /tmp -- 输出物理包到/tmp
5. 设置清理策略
adrci
set control (SHORTP_POLICY = 120); -- 跟踪文件保留5天
set control (LONGP_POLICY = 168); -- 事件数据保留7天
五、使用体验
ADR通过标准化目录结构、事件驱动模型和洪水控制机制,实现了诊断数据的统一管理与高效分析。其演进过程体现了Oracle从分散管理到集中化、再到智能诊断的转型。通过adrci和动态视图的组合使用,管理员可快速定位问题,减少停机时间。