故障排查
按故障现象快速定位检查项、操作风险和升级信息。
排查路径
先记下发生时间、报错原文、影响范围和近期变更。以下检查先使用只读方式;杀会话、删归档、重启服务或改参数,按现场变更流程处理。
按现象查
| 现象 | 先看 | 排查章节 |
|---|---|---|
| 数据库慢、卡顿 | 活跃会话、等待事件、阻塞和资源 | 数据库慢或卡顿 |
| 锁等待、死锁 | 阻塞链、会话归属、死锁 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;SID SERIAL# USERNAME SQL_ID STATE EVENT WAIT_CLASS WAIT_TIME_MICRO BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION
--- ------- -------- ------------- ------- --------------------------- ----------- --------------- ----------------------- ----------------- ----------------
508 19024 APPUSER 4dfg456uvw789 WAITING enq: TX - row lock contention Application 95000000 VALID 1 421
421 7701 APPUSER 8abc123xyz789 WAITING db file sequential read User I/O 18000000 NO HOLDER模拟结果(字段节选):
| SID | USERNAME | SQL_ID | STATE | EVENT | WAIT_CLASS | WAIT_TIME_MICRO | BLOCKING_SESSION |
|---|---|---|---|---|---|---|---|
| 508 | APPUSER | 4dfg456uvw789 | WAITING | enq: TX - row lock contention | Application | 95000000 | 421 |
| 421 | APPUSER | 8abc123xyz789 | WAITING | db file sequential read | User I/O | 18000000 | — |
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_ID EXECUTIONS TOTAL_ELAPSED_SECONDS AVG_ELAPSED_SECONDS BUFFER_GETS DISK_READS ROWS_PROCESSED
------------- ---------- --------------------- ------------------- ----------- ---------- --------------
4dfg456uvw789 30 123.0 4.100 102400 2500 8000这是游标缓存中按子游标记录的累计值,不代表指定时间段;并行 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;SAMPLE_TIME SESSION_ID SESSION_SERIAL# SQL_ID SESSION_STATE WAIT_CLASS EVENT BLOCKING_SESSION
----------------------- ---------- --------------- ------------- ------------- ----------- ----------------------------- ----------------
2026-10-26 09:00:00.000 508 19024 4dfg456uvw789 WAITING Application enq: TX - row lock contention 421时间条件使用 UTC,避免会话时区与数据库主机时区不同时选错采样范围。生成报告时,先在 SQL*Plus 中执行 AWR 脚本,并按提示完成报告:
@$ORACLE_HOME/rdbms/admin/awrrpt.sqlSQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql
Enter value for report_type: html
Enter value for begin_snap: 101
Enter value for end_snap: 102
Enter value for report_name: awrrpt_101_102.html
Report written to awrrpt_101_102.html需要 ASH 报告时,在 AWR 脚本结束后单独执行:
@$ORACLE_HOME/rdbms/admin/ashrpt.sqlSQL> @$ORACLE_HOME/rdbms/admin/ashrpt.sql
Enter value for report_type: html
Enter value for report_name: ashrpt.html
Report written to ashrpt.html脚本会询问报告格式、时间范围和输出文件。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 09:00:00 up 12 days, 2:30, 2 users, load average: 0.35, 0.28, 0.22
total used free shared buff/cache available
Mem: 62Gi 28Gi 12Gi 1.0Gi 22Gi 32Gi
Swap: 8Gi 0.0Gi 8Gi
Device r/s w/s rMB/s wMB/s await %util
sdb 12.0 8.0 2.40 1.20 3.20 12.00iostat 由 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;SID SESS_SERIAL# BLOCKER_INSTANCE_ID BLOCKER_SID BLOCKER_SESS_SERIAL# WAIT_EVENT_TEXT
--- ------------ ------------------- ----------- ------------------- -----------------------------
508 19024 1 421 7701 enq: TX - row lock contention模拟结果:
| SID | SESS_SERIAL# | BLOCKER_INSTANCE_ID | BLOCKER_SID | BLOCKER_SESS_SERIAL# | WAIT_EVENT_TEXT |
|---|---|---|---|---|---|
| 508 | 19024 | 1 | 421 | 7701 | enq: 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;SID SERIAL# USERNAME SQL_ID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
--- ------- -------- ------------- ---- ----- --- ----- ------- ----- -----
421 7701 APPUSER 8abc123xyz789 TX 12345 678 6 0 120 1
508 19024 APPUSER 4dfg456uvw789 TX 12345 678 0 6 95 0REQUEST > 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:
adrciADRCI: Release 19.0.0.0.0 - Production
ADRCI>在 ADRCI 中列出可用的 ADR home:
show homesADR Homes:
diag/rdbms/orcl/orcl选择与目标实例对应的 home 并查看最近 100 条告警。下面的路径是示例,执行时换成 show homes 的实际结果:
set homepath diag/rdbms/orcl/orcl
show alert -tail 1002026-10-26 09:00:00.000 +08:00
ORA-00060: Deadlock detected. More info in file
/data_oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_12345.trc告警日志中会记录 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_NAME USED_MB AVAILABLE_OR_MAX_MB USED_PERCENT
--------------- ------- ------------------- ------------
USERS 69632.0 102400.0 68.0
SYSAUX 11264.0 20480.0 55.0TABLESPACE_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;NAME LIMIT_MB USED_MB RECLAIMABLE_MB NUMBER_OF_FILES
------------------------------ -------- ------- -------------- ---------------
/data_oracle/fast_recovery_area 512000 215040 51200 56
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------- ------------------ ------------------------- ---------------
ARCHIVED LOG 40 10 50
CONTROL FILE 2 0 6这两条仅检查 FRA;其他文件系统空间用 Linux 命令检查。将目录替换成实际挂载点:
df -h /data_oracle
df -i /data_oracleFilesystem Size Used Avail Use% Mounted on
/dev/sdb1 5.0T 3.1T 1.9T 62% /data_oracle
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 327680000 9830400 317849600 3% /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;DEST_ID STATUS ERROR DATABASE_MODE RECOVERY_MODE ARCHIVED_THREAD# ARCHIVED_SEQ# APPLIED_THREAD# APPLIED_SEQ# GAP_STATUS
------- ------ ----- --------------- ----------------------- ---------------- ------------- --------------- ------------ ----------
2 VALID MOUNTED-STANDBY MANAGED REAL TIME APPLY 1 2380 1 2380 NO GAP连接到物理备库后查看延迟和恢复进程:
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;NAME VALUE TIME_COMPUTED DATUM_TIME
------------- ------------- ------------------- -------------------
transport lag +00 00:00:00 2026-10-26 09:00:00 2026-10-26 08:59:59
apply lag +00 00:00:00 2026-10-26 09:00:00 2026-10-26 08:59:59
ROLE THREAD# SEQUENCE# ACTION
------------------ ------- --------- ------------
managed recovery 0 0 IDLE
recovery logmerger 1 2380 APPLYING_LOG
no rows selected延迟、进程和 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');NAME NETWORK_NAME
---- ------------
pdb1 pdb1
pdb2 pdb2
SERVICE_NAME STATUS SESSION_COUNT
------------ -------- -------------
pdb1 ACTIVE 8
pdb1 INACTIVE 42
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION LIMIT_VALUE
------------- ------------------- --------------- -----------
processes 120 180 1000
sessions 150 220 1500数据库视图只能说明服务和会话情况,不能证明监听进程正常。在 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 连接成功'LSNRCTL for Linux: Version 19.0.0.0.0
STATUS of the LISTENER
Alias LISTENER
Listening Endpoints Summary...
(ADDRESS=(PROTOCOL=tcp)(HOST=Oracle.server.MT01)(PORT=1521))
Services Summary...
Service "pdb1" has 1 instance(s).
Instance "orcl", status READY
The command completed successfully
192.168.8.180 Oracle.server.MT01
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;SESSION_KEY INPUT_TYPE STATUS START_TIME END_TIME ELAPSED_MINUTES OUTPUT_BYTES_DISPLAY
----------- ---------- ------ ------------------- ------------------- --------------- --------------------
103 DB INCR FAILED 2026-10-26 00:15:00 2026-10-26 00:20:00 5.0 2.50G视图显示 RMAN 作业记录;失败原因仍需查看 RMAN 完整日志。详见 Oracle V$RMAN_BACKUP_JOB_DETAILS 文档。
在 Oracle 软件属主的 shell 中连接本地目标库:
rman target /Recovery Manager: Release 19.0.0.0.0 - Production
connected to target database: ORCL (DBID=1234567890)
RMAN>在 RMAN> 提示符执行以下只读查看命令:
SHOW ALL;
LIST BACKUP SUMMARY;
LIST BACKUP OF DATABASE;
LIST BACKUP OF ARCHIVELOG ALL;RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
List of Backups
Key TY LV S Device Type Completion Time
--- -- -- - ----------- -------------------
101 B 0 A DISK 2026-10-24 01:08:00
102 B 1 A DISK 2026-10-26 01:08:00
List of Archived Log Backups
Key Thrd Seq Low Seq High
--- ---- ------- --------
103 1 2370 2380SHOW ALL 查看保留策略和归档删除策略;LIST 查看 RMAN 仓库记录的备份。它们不会验证备份文件一定可恢复,也不会显示完整失败原因;进一步验证需安排获批的恢复演练。详见 Oracle 19c RMAN LIST 和 SHOW。