O Oracle DBA 运维知识库

故障排查

按故障现象快速定位检查项、操作风险和升级信息。

排查路径

确认现象和影响范围收集时间错误和变更只读检查保存证据判断原因确认风险按流程处置复查或升级

先记下发生时间、报错原文、影响范围和近期变更。以下检查先使用只读方式;杀会话、删归档、重启服务或改参数,按现场变更流程处理。

按现象查

现象先看排查章节
数据库慢、卡顿活跃会话、等待事件、阻塞和资源数据库慢或卡顿
锁等待、死锁阻塞链、会话归属、死锁 trace锁阻塞与死锁
表空间、归档区或磁盘满使用量、增长、主备同步状态空间与 Data Guard
监听或连接失败错误码、服务注册、网络和连接数监听与连接
备份失败RMAN 日志、目标空间、最近成功备份备份失败

以下 SQL 是检查示例,模拟结果仅用于说明字段含义。先确认实例和账号权限。RAC 环境按数据库版本使用 GV$ 视图,并结合 INST_ID 判断实例。

数据库慢或卡顿

  • 先查:确认开始时间和影响范围;查看活跃会话、等待事件、阻塞关系,再对照 TOP SQL、AWR/ASH、CPU 和 I/O 趋势。
  • 判断:等待事件说明会话当前在等什么,需结合 SQL、阻塞和资源证据判断原因。
  • 避免:未确认业务归属和影响前,不终止会话、不改参数或执行计划。
  • 升级带上:实例、时间范围、SQL_ID、等待事件、会话/阻塞信息、AWR/ASH 区间和近期变更。
查看 SQL 和模拟结果:当前活跃会话
SELECT sid,
       serial#,
       username,
       sql_id,
       state,
       event,
       wait_class,
       wait_time_micro,
       blocking_session_status,
       blocking_instance,
       blocking_session
FROM   v$session
WHERE  type = 'USER'
AND    status = 'ACTIVE'
ORDER BY wait_time_micro DESC NULLS LAST;

模拟结果(字段节选):

SIDUSERNAMESQL_IDSTATEEVENTWAIT_CLASSWAIT_TIME_MICROBLOCKING_SESSION
508APPUSER4dfg456uvw789WAITINGenq: TX - row lock contentionApplication95000000421
421APPUSER8abc123xyz789WAITINGdb file sequential readUser I/O18000000—

STATE = 'WAITING' 时,WAIT_TIME_MICRO 是当前等待时长;其他状态下是上一次等待时长,因此排序不能直接代表当前 SQL 耗时。BLOCKING_SESSION_STATUS = 'VALID' 时,才使用 BLOCKING_INSTANCE 和 BLOCKING_SESSION 定位阻塞源头。结果是当前时点快照,短暂问题可能已经结束。详见 Oracle V$SESSION 文档。

查看 SQL:累计耗时较高的 SQL(共享池快照)
SELECT sql_id,
       executions,
       ROUND(elapsed_time / 1000000, 1) AS total_elapsed_seconds,
       ROUND(elapsed_time / NULLIF(executions, 0) / 1000000, 3) AS avg_elapsed_seconds,
       buffer_gets,
       disk_reads,
       rows_processed
FROM   v$sql
WHERE  executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;

这是游标缓存中按子游标记录的累计值,不代表指定时间段;并行 SQL 的累计耗时包含并行进程耗时,不等同于实际经过时间。要分析历史时段,使用 AWR/ASH 并确认现场授权和许可。列和统计口径见 Oracle V$SQL 文档。

查看 ASH SQL 和 AWR/ASH 报告命令

查看近 15 分钟采样到的前台会话:

SELECT sample_time,
       session_id,
       session_serial#,
       sql_id,
       session_state,
       wait_class,
       event,
       blocking_session
FROM   v$active_session_history
WHERE  sample_time_utc >= SYS_EXTRACT_UTC(SYSTIMESTAMP) - INTERVAL '15' MINUTE
AND    session_type = 'FOREGROUND'
ORDER BY sample_time_utc DESC
FETCH FIRST 100 ROWS ONLY;

时间条件使用 UTC,避免会话时区与数据库主机时区不同时选错采样范围。生成报告时,先在 SQL*Plus 中执行 AWR 脚本,并按提示完成报告:

@$ORACLE_HOME/rdbms/admin/awrrpt.sql

需要 ASH 报告时,在 AWR 脚本结束后单独执行:

@$ORACLE_HOME/rdbms/admin/ashrpt.sql

脚本会询问报告格式、时间范围和输出文件。RAC 环境按需选择 RAC 报告脚本。ASH 查询只覆盖内存中的近期采样;查历史区间使用 AWR/ASH 报告。V$ACTIVE_SESSION_HISTORY、AWR/ASH 报告属于 Oracle Diagnostics Pack,使用前确认许可及账号授权。详见 Oracle 19c ASH 视图、AWR 报告 和 许可说明。

查看 Linux 命令:主机负载、内存和 I/O
uptime
free -h
iostat -mxz 1 3

iostat 由 sysstat 软件包提供;未安装时请使用现场监控,不要为排障临时安装软件。

锁阻塞与死锁

  • 先查:从 v$session、v$lock 查等待会话和阻塞链;沿链找到最前端会话,记录 SID、SERIAL#、SQL_ID、用户、机器和程序。
  • 判断:阻塞是会话等待资源;死锁是事务形成循环等待。发生死锁时,从告警日志定位对应 trace。
  • 避免:先联系业务方确认事务状态;未确认前不杀会话、不回滚事务。
  • 升级带上:阻塞链、会话标识、等待时长、业务归属、死锁 trace 和发生时间。

阻塞与死锁:单向等待是阻塞;两个事务各自持有对方需要的锁并互相等待,形成死锁。

查看 SQL 和模拟结果:当前阻塞会话
SELECT sid,
       sess_serial#,
       blocker_instance_id,
       blocker_sid,
       blocker_sess_serial#,
       wait_event_text
FROM   v$session_blockers;

模拟结果:

SIDSESS_SERIAL#BLOCKER_INSTANCE_IDBLOCKER_SIDBLOCKER_SESS_SERIAL#WAIT_EVENT_TEXT
5081902414217701enq: TX - row lock contention

结果表示 SID 508 正被 SID 421 阻塞,不代表可以安全终止 SID 421。无记录表示当前快照未发现阻塞对。详见 Oracle V$SESSION_BLOCKERS 文档。

查看锁持有和等待行:

SELECT s.sid,
       s.serial#,
       s.username,
       s.sql_id,
       l.type,
       l.id1,
       l.id2,
       l.lmode,
       l.request,
       l.ctime,
       l.block
FROM   v$lock l
JOIN   v$session s ON s.sid = l.sid
WHERE  l.request > 0
OR     l.block > 0
ORDER BY l.ctime DESC;

REQUEST > 0 表示正在请求锁;BLOCK = 1 表示该锁正在阻塞其他会话。按 TYPE、ID1、ID2 对照请求行和持有行;具体等待对可优先看 V$SESSION_BLOCKERS。RAC 环境应使用 GV$LOCK、GV$SESSION 并按 INST_ID 关联;BLOCK = 2 表示可能阻塞远端实例会话。详见 Oracle 19c V$LOCK 文档。

从 ADRCI 查看告警日志,定位 ORA-00060 对应的 deadlock trace。确认 ORACLE_HOME 和 PATH 已设置,在数据库主机的 shell 中启动 ADRCI:

adrci

在 ADRCI 中列出可用的 ADR home:

show homes

选择与目标实例对应的 home 并查看最近 100 条告警。下面的路径是示例,执行时换成 show homes 的实际结果:

set homepath diag/rdbms/orcl/orcl
show alert -tail 100

告警日志中会记录 trace 文件位置。命令说明见 Oracle 19c ADRCI 文档。

空间与 Data Guard

  • 表空间满:查使用率、数据文件可用空间、自动扩展和增长趋势;扩容前确认底层文件系统容量。
  • 归档区/磁盘满:查归档区、备份目录空间和增长速度;清理前核实备份状态、备库应用进度及 RMAN 删除策略。不要直接删除归档,脚本操作先看脚本说明。
  • 同步中断/延迟:对比主备角色、归档序列、传输/应用延迟、GAP 和 MRP 状态,同时检查网络与备库空间。出现 GAP、归档缺失或 MRP 异常时停止清理并升级 DBA。
  • 升级带上:主备状态、序列差异、延迟、GAP、MRP、空间、网络结果和告警日志时间段。
查看 SQL:表空间使用率
SELECT m.tablespace_name,
       ROUND(m.used_space * t.block_size / 1024 / 1024, 1) AS used_mb,
       ROUND(m.tablespace_size * t.block_size / 1024 / 1024, 1) AS available_or_max_mb,
       ROUND(m.used_percent, 1) AS used_percent
FROM   dba_tablespace_usage_metrics m
JOIN   dba_tablespaces t ON t.tablespace_name = m.tablespace_name
ORDER BY m.used_percent DESC;

TABLESPACE_SIZE 在数据文件启用自动扩展时会考虑底层可用存储;因此结果不等同于当前已分配文件大小。需要 DBA 字典视图读取权限。详见 Oracle DBA_TABLESPACE_USAGE_METRICS 文档。

查看 SQL 和 Linux 命令:归档区、FRA 和磁盘空间
SELECT name,
       ROUND(space_limit / 1024 / 1024) AS limit_mb,
       ROUND(space_used / 1024 / 1024) AS used_mb,
       ROUND(space_reclaimable / 1024 / 1024) AS reclaimable_mb,
       number_of_files
FROM   v$recovery_file_dest;

SELECT file_type,
       percent_space_used,
       percent_space_reclaimable,
       number_of_files
FROM   v$recovery_area_usage
ORDER BY percent_space_used DESC;

这两条仅检查 FRA;其他文件系统空间用 Linux 命令检查。将目录替换成实际挂载点:

df -h /data_oracle
df -i /data_oracle

可回收空间不表示可以绕过归档删除策略直接删文件。详见 Oracle RMAN FRA 空间监控说明。

查看 SQL:Data Guard 目的地、GAP 和延迟

在主库查看指向物理备库的归档目的地:

SELECT dest_id,
       status,
       error,
       database_mode,
       recovery_mode,
       archived_thread#,
       archived_seq#,
       applied_thread#,
       applied_seq#,
       gap_status
FROM   v$archive_dest_status
WHERE  type = 'PHYSICAL'
ORDER BY dest_id;

连接到物理备库后查看延迟和恢复进程:

SELECT name, value, time_computed, datum_time
FROM   v$dataguard_stats
WHERE  name IN ('transport lag', 'apply lag');

SELECT role, thread#, sequence#, action
FROM   v$dataguard_process
WHERE  role LIKE '%recovery%';

SELECT thread#, low_sequence#, high_sequence#
FROM   v$archive_gap;

延迟、进程和 GAP 查询在备库执行;V$DATAGUARD_STATS 在主库没有返回行。GAP 查询无返回行只表示当前没有报告阻塞恢复的缺口。结合 STATUS、ERROR、GAP_STATUS、序列和各恢复进程的 ACTION 判断;管理恢复进程 IDLE 不一定表示日志应用已停止。详见 Oracle 19c Data Guard 健康检查 SQL 和 V$DATAGUARD_PROCESS。

监听与连接

  • 先查:保留错误码和客户端信息;检查主机/端口连通性、监听状态、服务注册、监听日志和当前会话分布。
  • 判断:区分网络不可达、监听未运行、服务未注册、服务名错误、数据库不可用或连接数异常;核对近期变更。
  • 避免:单个客户端连接失败时,不直接重启监听;未确认会话归属时,不批量断开连接。
  • 升级带上:错误原文、客户端、服务名、网络检查、监听状态、会话分布和日志时间段。
查看 SQL 和 Linux 命令:服务、连接和监听
SELECT name, network_name
FROM   v$services
ORDER BY name;

SELECT service_name, status, COUNT(*) AS session_count
FROM   v$session
WHERE  type = 'USER'
GROUP BY service_name, status
ORDER BY service_name, status;

SELECT resource_name, current_utilization, max_utilization, limit_value
FROM   v$resource_limit
WHERE  resource_name IN ('sessions', 'processes');

数据库视图只能说明服务和会话情况,不能证明监听进程正常。在 Linux 数据库主机检查监听和网络:

lsnrctl status
lsnrctl services
getent hosts Oracle.server.MT01
timeout 5 bash -c 'exec 3<>/dev/tcp/192.168.8.180/1521' && echo 'TCP 连接成功'

主机名、地址和端口以实际目标为准。timeout 限制连接等待为 5 秒;出现错误或超时应继续检查网络和监听。TCP 可连接只说明端口可达,还需检查 Oracle 服务和业务登录。详见 Oracle V$SERVICES 和 V$RESOURCE_LIMIT。

备份失败

  • 先查:记录任务、时间和 RMAN 错误原文;查看完整日志、目标路径空间/权限、备份介质状态及最近一次成功备份。
  • 判断:确认失败在连接、读取、写入、归档处理还是清理阶段;核对恢复所需的备份和归档是否齐全。
  • 避免:不能只凭脚本“完成”提示认定成功;未核实保留策略和恢复链前,不删备份或归档腾空间。
  • 升级带上:完整 RMAN 日志、失败阶段、目标空间、最近成功备份、归档情况和错误码。
查看 SQL 和 RMAN 命令:备份任务与备份集
SELECT session_key,
       input_type,
       status,
       start_time,
       end_time,
       ROUND(elapsed_seconds / 60, 1) AS elapsed_minutes,
       output_bytes_display
FROM   v$rman_backup_job_details
WHERE  start_time >= SYSDATE - 7
ORDER BY start_time DESC;

视图显示 RMAN 作业记录;失败原因仍需查看 RMAN 完整日志。详见 Oracle V$RMAN_BACKUP_JOB_DETAILS 文档。

在 Oracle 软件属主的 shell 中连接本地目标库:

rman target /

在 RMAN> 提示符执行以下只读查看命令:

SHOW ALL;
LIST BACKUP SUMMARY;
LIST BACKUP OF DATABASE;
LIST BACKUP OF ARCHIVELOG ALL;

SHOW ALL 查看保留策略和归档删除策略;LIST 查看 RMAN 仓库记录的备份。它们不会验证备份文件一定可恢复,也不会显示完整失败原因;进一步验证需安排获批的恢复演练。详见 Oracle 19c RMAN LIST 和 SHOW。

On this page