首先需明确故障现象(如数据库无法连接、性能骤降、报错信息等),记录故障发生的时间、持续时长、影响范围(如哪些业务模块受影响)。这一步是后续排查的基础,有助于快速定位问题边界。
日志是故障诊断的“黄金线索”,需重点检查以下日志:
SHOW PARAMETER BACKGROUND_DUMP_DEST命令获取日志路径,或使用tail -f实时查看最新内容,用grep "ORA-"过滤错误信息。ORACLE_BASE/diag/rdbms/db_name/instance_name/trace目录下,以进程ID或会话ID命名(如ora_12345.trc)。包含会话详细信息、SQL执行轨迹、锁等待等,可使用tkprof工具格式化(如tkprof trace_file.trc output.txt explain username/password@db),便于分析。/var/log/messages、/var/log/syslog或dmesg输出,排查系统级问题(如内存不足、磁盘I/O错误、CPU过载),这些日志能关联Oracle故障与底层系统环境的关联。sqlplus / as sysdba连接数据库,执行SELECT instance_name, status FROM v$instance;确认实例是否处于OPEN状态(正常运行)。若状态为MOUNTED或NOMOUNT,需进一步检查控制文件、数据文件是否完整。lsnrctl status命令查看监听器是否运行(显示“Listener is running”),并确认监听的端口(默认1521)、服务名是否正确。若未启动,用lsnrctl start启动监听器。使用Linux命令检查系统资源是否充足,避免因资源瓶颈导致Oracle故障:
top或ps -eo pid,user,cpu,command --sort=-%cpu | grep ora_(按CPU排序,找出高消耗的Oracle进程)。free -m查看内存剩余量,vmstat 1 5监控内存交换(swap)情况(若si/so列数值持续增长,说明内存不足)。df -h检查数据文件、归档日志目录所在分区是否有足够空间(建议预留20%以上空闲空间)。iostat -x 1查看磁盘的await(平均等待时间)、%util(利用率),若%util接近100%,说明磁盘I/O瓶颈。通过Oracle动态性能视图(V$视图)实时监控数据库状态,定位具体问题:
SELECT s.sid, s.serial#, s.username, s.status, l.type, l.lmode, l.request, l.ctime FROM v$lock l, v$session s WHERE l.sid = s.sid AND l.request > 0;查询阻塞会话,用ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;终止阻塞会话。SELECT s.sid, s.serial#, s.username, s.event, s.seconds_in_wait, s.state FROM v$session s WHERE s.status = 'ACTIVE' AND s.event NOT LIKE '%SQL*Net%';查看当前SQL的等待事件(如db file sequential read表示索引扫描慢,enq: TX - row lock contention表示行锁冲突)。SELECT * FROM v$librarycache WHERE pins > 0;检查共享池命中率(若pin hit ratio低于90%,需调整shared_pool_size参数),或SELECT * FROM v$db_object_cache WHERE locks > 0;查看库缓存锁等待。确保Oracle关键配置文件正确无误:
$ORACLE_HOME/network/admin目录,检查监听地址(HOST)、端口(PORT)、服务名(SERVICE_NAME)是否与数据库实例匹配。$ORACLE_HOME/network/admin,检查客户端连接串(如ORCL)的HOST、PORT、SERVICE_NAME是否正确。SHOW PARAMETER SPFILE确认是否使用SPFILE,用CREATE PFILE='/tmp/init.ora' FROM SPFILE;导出PFILE备份,检查关键参数(如memory_target、processes、open_cursors)是否符合业务需求。oracle)对数据文件($ORACLE_BASE/oradata/db_name)、控制文件($ORACLE_BASE/diag/rdbms/db_name/instance_name/trace)、日志文件($ORACLE_HOME/log)有读写权限(使用chown -R oracle:oinstall /u01/app/oracle,chmod -R 750 /u01/app/oracle)。mount命令检查数据文件所在分区是否正常挂载(如/dev/sdb1 /u01/app/oracle ext4 defaults 0 0),避免因挂载失败导致数据库无法访问。adrci命令行工具查看告警日志、跟踪文件(如adrci show alert -tail -f实时查看告警,adrci list incident列出故障事件)。@?/rdbms/admin/awrrpt.sql生成AWR报告(分析历史性能数据,如TOP SQL、等待事件),@?/rdbms/admin/ashrpt.sql生成ASH报告(实时监控当前会话活动),帮助定位性能瓶颈。ALTER SESSION SET sql_trace = TRUE;),用tkprof格式化跟踪文件(如tkprof trace_file.trc output.txt),分析SQL执行计划、执行时间、物理读/逻辑读等指标。shared_pool_size参数(如设置为物理内存的10%-20%),或定期刷新共享池(ALTER SYSTEM FLUSH SHARED_POOL;)。ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/db_name/users02.dbf' SIZE 1G;),或清理无用数据(如归档旧日志、删除临时表数据)。processes参数(增加并发进程数)。若故障导致数据丢失或损坏,需使用RMAN(恢复管理器)进行恢复:
rman target /进入RMAN命令行,执行BACKUP DATABASE PLUS ARCHIVELOG;备份数据库及归档日志。STARTUP MOUNT;),执行RESTORE DATABASE;恢复数据文件,RECOVER DATABASE;应用归档日志,最后ALTER DATABASE OPEN;打开数据库。