Oracle ADRCI 诊断数据工具总结
一、ADRCI概述
1.1 什么是ADRCI
ADRCI(Automatic Diagnostic Repository Command Interpreter,自动诊断存储库命令解释器)是Oracle 11g版本开始引入的故障诊断基础架构的一部分。它是一个命令行工具,用于管理Oracle数据库的自动诊断存储库(ADR,Automatic Diagnostic Repository)中的诊断数据。
ADR是一个基于文件的数据库诊断数据存储库,用于存储跟踪文件(trace files)、转储文件(dumps)、警报日志(alert logs)、运行状况监视器报告等诊断数据。从Oracle 11g开始,数据库、自动存储管理(ASM)以及其他Oracle产品或组件将所有诊断数据统一存储在ADR中。
1.2 ADRCI的核心功能
ADRCI使DBA能够完成以下任务:
- 查看ADR中的诊断数据(告警日志、Trace文件等)
- 查看运行状况监视器(Health Monitor)报告
- 查看和跟踪事件(Incident)与问题(Problem)
- 将事件和问题信息打包成ZIP文件,便于提交给Oracle支持团队分析
- 批量清理过期的诊断日志文件,释放磁盘空间
1.3 ADRCI的优势
| 优势 | 说明 |
|---|---|
| 无需数据库开启 | 即使数据库实例未启动,也可以查看诊断数据 |
| 统一管理 | 跨多个实例和产品统一管理诊断数据,无需反复切换环境变量 |
| 问题追踪 | 每个问题都有唯一的问题键和问题ID,可通过SHOW PROBLEM查看 |
| 事件记录 | 每个问题根据发生的次数记录为一个个事件,每个事件由唯一的事件ID标识 |
| 跨平台支持 | 所有平台均支持 |
1.4 核心概念
| 概念 | 说明 |
|---|---|
| ADR Base | ADR的根目录,由DIAGNOSTIC_DEST参数控制,默认值为$ORACLE_BASE |
| ADR Home | 每个数据库实例、ASM实例或组件对应的独立诊断目录 |
| 事件(Incident) | 单个故障的具体发生实例,每个事件有唯一ID |
| 问题(Problem) | 同一根因导致的故障集合(如重复出现的ORA-00600) |
1.5 ADR 与 ADRCI 的关系
ADR(Automatic Diagnostic Repository)是 Oracle 11g 引入的统一诊断数据存储架构,它将所有数据库组件(如 RDBMS、ASM、CRS 等)的诊断数据集中存储在文件系统中的一个特定目录树中。ADRCI 则是操作和管理这个 ADR 目录树的专用命令行接口。
二、查询Alert日志地址
2.1 使用ADRCI查看Alert日志地址
ADRCI最大的便利之一就是无需记忆复杂的日志路径,直接通过命令即可查看alert日志地址:
bash
# 进入ADRCI交互模式
$ adrci
# 查看alert日志位置
adrci> show home
ADR Homes:
diag/rdbms/orcl/orcl --这个位置,就是alert日志位置!
diag/tnslsnr/host51/listener
2.2 通过SQL查询Alert日志地址
在数据库中可以查询V$DIAG_INFO视图来定位alert日志的位置:
sql
-- 查询诊断信息
set linesize 200 pagesize 999
col name format a21
col value format a65
SELECT name, value FROM v$diag_info;
-- 重点关注以下条目:
-- Diag Trace -> trace文件目录(包含文本格式的alert日志)
-- Diag Alert -> alert日志目录(XML格式)
-- Default Trace File -> 当前会话的trace文件
NAME VALUE
--------------------- -----------------------------------------------------------------
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /u01/app/oracle/diag/rdbms/orcl/orcl
Diag Trace /u01/app/oracle/diag/rdbms/orcl/orcl/trace
Diag Alert /u01/app/oracle/diag/rdbms/orcl/orcl/alert
Diag Incident /u01/app/oracle/diag/rdbms/orcl/orcl/incident
Diag Cdump /u01/app/oracle/diag/rdbms/orcl/orcl/cdump
Health Monitor /u01/app/oracle/diag/rdbms/orcl/orcl/hm
Default Trace File /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_93864.trc
Active Problem Count 0
Active Incident Count 0
2.3 Alert日志的物理路径
Oracle 11g及以后版本,alert日志的默认存储路径为:
$ORACLE_BASE/diag/rdbms/<数据库名>/<实例名>/trace/alert_<实例名>.log
例如:
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
同时,ADR中也存储了XML格式的alert日志:
$ORACLE_BASE/diag/rdbms/<数据库名>/<实例名>/alert/log.xml
注意:Oracle建议对alert日志内容的解析应基于XML格式版本,因为文本格式是非结构化的,可能在不同版本间发生变化。
三、GI集群中查询Alert日志地址
3.1 GI集群的ADR结构
在GI(Grid Infrastructure)集群环境中,每个组件都有自己独立的ADR Home。每个ADR Home中的alert日志都特定于其组件类型,如数据库、Oracle ASM、监听器(Listener)和Oracle Clusterware。
3.2 集群中各组件的Alert日志路径
| 组件 | ADR Home路径示例 |
|---|---|
| 数据库实例 | diag/rdbms/<db_name>/<instance_name> |
| ASM实例 | diag/asm/+asm/+ASM |
| 监听器 | diag/tnslsnr/<hostname>/listener |
| Clusterware | diag/crs/<hostname>/crs |
3.3 在集群中使用ADRCI查看日志
查看所有可用的ADR Home:
bash
su - grid
adrci
adrci> show homes
11g版本的输出示例:
adrci> show homes;
ADR Homes:
diag/asm/+asm/+ASM1
diag/tnslsnr/host40rac1/listener
11g版本的GI集群日志,并没有纳入进ADRCI管控
19c版本的输出示例:
adrci> show homes;
ADR Homes:
diag/asmtool/user_grid/host_2921199188_110
diag/asm/+asm/+ASM1
diag/crs/host61rac1/crs --可以看到,从19c版本开始,已经将GI集群的日志也纳入ADRCI管控
diag/tnslsnr/host61rac1/asmnet1lsnr_asm
diag/tnslsnr/host61rac1/listener_scan1
diag/tnslsnr/host61rac1/listener
diag/asmcmd/user_grid/host61rac1
diag/kfod/host61rac1/kfod
切换并查看特定组件的alert日志:
bash
# 查看ASM的alert日志
adrci> set homepath diag/asm/+asm/+ASM1
adrci> show alert -tail 200
# 查看监听器的alert日志
adrci> set homepath diag/tnslsnr/rac01/listener
adrci> show alert -tail -f
3.4 集群环境的重要注意事项
关键提醒 :RAC中各节点的GI日志目录不是共享的 ------即使使用ASM存储,每个节点的
diag/crs/<hostname>/crs是本机文件系统路径。在节点1上运行ADRCI清理操作,对节点2完全无效。因此,集群环境的日志清理需要在每个节点上分别执行。
在集群环境中,ADRCI的位置在$ORACLE_HOME/bin目录下。需要注意的是,集群环境通常在grid用户 下操作,而单机环境则在oracle用户下操作。
四、ADRCI使用方法
4.1 启动ADRCI
交互式模式:
bash
# 直接输入adrci命令
$ adrci
ADRCI: Release 11.2.0.4.0 - Production on Tue Aug 4 16:46:58 2026
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ADR base = "/u01/app/oracle"
批处理模式:
bash
# 使用exec选项执行单个命令
adrci exec="show homes"
adrci exec="set homepath diag/rdbms/orcl/orcl; show alert -tail 100"
4.2 ADR Home管理
ADRCI的所有操作均基于ADR Home,因此设置正确的Home是所有操作的前提。
查看所有ADR Home:
bash
adrci> show homes
ADR Homes:
diag/rdbms/orcl/orcl
diag/tnslsnr/host51/listener
设置当前ADR Home:
bash
# 设置单个ADR Home
adrci> set homepath diag/rdbms/orcl/orcl
# 验证当前Home
adrci> show home
ADR Homes: diag/rdbms/orcl/orcl
如果未设置ADR Home直接执行操作,ADRCI会提示选择Home,按编号选择即可。
4.3 健康检查
作为一名DBA,每天对数据库进行健康检查是日常工作。通过ADRCI可以快速高效地完成检查。
查看所有问题(Problems):
bash
adrci> show problem
该命令会显示所有实例运行中发生的严重错误。如果没有任何输出,说明实例运行过程中没有发生严重错误。
查看所有事件(Incidents):
bash
adrci> show incident -all
查看特定事件的详细信息:
bash
adrci> show incident -mode detail -p "incident_id=433469"
4.4 清理日志
数据库日志文件过大可能导致磁盘空间不足甚至数据库宕机。ADRCI提供了安全、高效的日志清理方式。
查看清理命令帮助:
bash
adrci> help purge
按时间清理日志(单位:分钟):
bash
# 删除10天(1440分钟)前的alert日志(是指alertxxx.xml类型的文件) --常用!!
purge -age 14400 -type alert
# 删除10天(14400分钟)前的trace文件(是指trc.trm类型的文件) --常用!!
purge -age 14400 -type trace
设置ADR Home后清理:
bash
set homepath diag/rdbms/orcl/orcl
purge -age 14400
不指定类型,清理alert和trace两种类型的!--常用!!
在命令行中直接执行清理(不进入交互模式):
bash
-- 常用
adrci exec="show homes"
adrci exec="set homepath diag/rdbms/orcl/orcl; purge -age 14400"
注意:默认情况下,当天的trace文件不能被清理。清理操作无需停止数据库实例,不影响实例运行。
4.5 IPS打包错误日志
IPS(Incident Packaging Service,事件打包服务)是Oracle 11g的新特性,可以查看某个错误相关的所有dump文件和trace文件,并方便地打包成一个文件,极大方便了DBA进行远程诊断。
基本打包流程:
- 使用
SHOW INCIDENT -ALL获取错误事件ID - 创建逻辑包
- 将事件添加到包中
- 生成物理包(ZIP文件)
示例操作:
bash
# 1. 查看事件列表,获取事件ID
adrci> show incident -all
# 2. 创建一个空的逻辑包
adrci> ips create package
# 3. 将诊断信息加入逻辑包(假设事件ID为43369,包号为1)
adrci> ips add incident 43369 package 1
# 3.1 将事件加入到package中,可加入多个事件
ips add incident 72697 package 1
# 4. 生成物理包(ZIP文件)到指定目录
adrci> ips generate package 1 in /home/oracle
adrci> ips generate package 1 in /home/oracle
Generated package 1 in file /home/oracle/IPSPKG_20260804174302_COM_1.zip, mode complete
直接创建包含事件的包:
bash
# 创建包时直接指定事件ID
adrci> ips create package incident 43369
# 创建包时直接指定问题ID
adrci> ips create package problem 1
按时间范围打包:
bash
# 创建包含两个时间点之间所有事件的包
adrci> ips create package time '2025-09-12 10:00:00 -08:00' to '2025-09-12 23:00:00 -08:00'
手动添加文件到已有包:
bash
adrci> ips add file <ADR_BASE>/diag/rdbms/orcl/orcl/trace/orcl_ora12345.trc package 1
查看和管理包:
bash
# 显示包中的所有文件
adrci> ips show files
# 显示包中的所有事件
adrci> ips show incidents
# 从包中移除诊断文件
adrci> ips remove file
4.6 其他常用命令
| 命令 | 说明 |
|---|---|
SHOW BASE |
显示当前ADR Base路径 |
SHOW TRACEFILE |
显示当前ADR Home下的所有trace文件 |
SHOW TRACEFILE %mmon% |
查找包含特定字符串的trace文件 |
SHOW TRACEFILE -I 43417 |
显示与特定事件相关的trace文件 |
HELP |
列出所有可用命令 |
HELP [command] |
查看特定命令的详细语法 |
SET EDITOR |
设置查看alert日志的编辑器 |
SPOOL |
将输出重定向到文件 |
五、日志保留策略配置
ADRCI允许通过设置保留策略来控制诊断数据的自动清理,避免手动频繁清理。
5.1 查看当前保留策略
bash
adrci> set homepath diag/rdbms/orcl/orcl
adrci> show control
5.2 设置保留策略
bash
# SHORTP_POLICY:短保留策略(单位:小时),主要管理TRACE、core dump等
# LONGP_POLICY:长保留策略(单位:小时),主要管理alert log、incident信息等
# 设置短保留策略为72小时(3天)
adrci> set control (SHORTP_POLICY = 72)
# 设置长保留策略为720小时(30天)
adrci> set control (LONGP_POLICY = 720)
5.3 默认保留策略
| 策略 | 默认值 | 管理内容 |
|---|---|---|
| SHORTP_POLICY | 720小时(30天) | TRACE文件、core dump、打包信息 |
| LONGP_POLICY | 8760小时(365天) | Alert日志、incident信息、incident转储 |
六、常用查询与维护命令汇总
6.1 快速参考
| 操作 | 命令 |
|---|---|
| 启动ADRCI | adrci |
| 查看所有Home | show homes |
| 设置当前Home | set homepath diag/rdbms/orcl/orcl |
| 查看当前Home | show home |
| 查看ADR Base | show base |
| 查看alert日志 | show alert |
| 实时查看alert日志 | show alert -tail -f |
| 查看最近N行alert | show alert -tail 50 |
| 查看ORA错误 | show alert -p "message_text like '%ORA-%'" |
| 查看所有问题 | show problem |
| 查看所有事件 | show incident -all |
| 查看特定事件详情 | show incident -mode detail -p "incident_id=xxx" |
| 查看trace文件 | show tracefile |
| 清理日志 | purge -age 1440 -type alert |
| 创建IPS包 | ips create package |
| 生成IPS包 | ips generate package 1 in /path |
| 查看帮助 | help |
| 查看保留策略 | show control |
| 设置保留策略 | set control (SHORTP_POLICY = 72) |
6.2 常用清理场景
bash
# 场景1:清理7天前的trace文件(10080分钟)
adrci> purge -age 10080 -type trace
# 场景2:清理30天前的alert日志(43200分钟)
adrci> purge -age 43200 -type alert
# 场景3:清理所有类型中7天前的数据
adrci> purge -age 10080
七、常见问题与注意事项
7.1 常见问题
Q1:ADRCI可以查看CRS日志吗?
11g版本不可以,ADRCI只可以查看数据库、ASM、监听器的日志,但CRS(Cluster Ready Services)日志通常不包含在ADRCI的show home列表中。19c版本开始支持查看CRS日志。
Q2:集群环境中的日志清理需要注意什么?
RAC各节点的GI日志目录是独立的,需要在每个节点上分别执行清理操作。
Q3:为什么有些日志无法通过purge清理?
默认情况下,当天的trace文件不能被清理。如需强制清理,可调整ARCH_CLEAN_IGNORE_MODE参数。
Q4:ADRCI工具的位置在哪里?
ADRCI位于$ORACLE_HOME/bin目录下。