CentOS 上 Oracle 故障排查流程
一 快速定位与信息收集
ps -ef | grep pmon;登录 SQL*Plus:sqlplus / as sysdba;尝试 startup。lsnrctl status,必要时 lsnrctl start。tail -n 200 $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log,以及对应进程的 *.trc/*.trm。/var/log/messages、/var/log/syslog、dmesg | tail -n 200。@?/rdbms/admin/awrrpt.sql、@?/rdbms/admin/ashrpt.sql,定位Top SQL与资源争用。v$session、v$lock、v$sql、v$system_event 等,快速识别阻塞会话、锁等待、异常 SQL。二 常见故障场景与处理要点
| 场景 | 典型症状 | 快速检查 | 处理要点 |
|---|---|---|---|
| 实例无法启动 | sqlplus 显示 idle,startup 失败 |
alert.log;`ipcs -m/-s |
grep oracle;free -m、dmesg |
| 找不到参数文件 | ORA-01078 / LRM-00109 |
echo $ORACLE_SID;ls $ORACLE_HOME/dbs/init$ORACLE_SID.ora |
从 admin/$ORCL/pfile/ 复制备份 init.ora 到 dbs/,修正属主属组为 oracle:oinstall,再 startup |
| 监听不可用 | ORA-12541: TNS:no listener |
lsnrctl status;cat $ORACLE_HOME/network/admin/listener.ora |
修正 listener.ora/tnsnames.ora,lsnrctl stop/start |
| 连接超时 | ORA-12170: TNS:Connect timeout |
systemctl status firewalld;firewall-cmd --list-ports |
开放端口:firewall-cmd --zone=public --add-port=1521/tcp --permanent && firewall-cmd --reload |
| 端口被占用 | netca/启动监听报端口冲突 | `netstat -tulpen | grep 1521;检查 /etc/hosts与ORACLE_HOSTNAME` |
| 内存目标不支持 | ORA-00845(11g) |
df -h /dev/shm |
mount -o remount,size=2G /dev/shm(或按需增大) |
| 高 CPU 或间歇变慢 | top 中 oracle 占用高,SQL 时快时慢 | v$sqlarea 按 cpu_time/elapsed_time 排序;v$session/v$process 关联 spid |
识别异常 SQL 并优化;必要时临时限流/杀阻塞会话;复核优化器反馈等参数 |
| 常见等待事件 | latch: cache buffers chains、buffer busy waits、cursor: pin S wait on X |
AWR/ASH Top Events;v$session_wait/dba_hist_active_sess_history |
热块/低效 SQL:SQL 优化、分区、重建索引、调 PCTFREE;游标争用:减少硬解析、固化 SQL、合理 cursor_sharing |
三 性能与锁等待定位命令清单
select sid,serial#,username,event,seconds_in_wait,state from v$session where wait_class!='Idle';select lpad(' ',2*level)||sid||','||serial#||','||username||','||event from v$session connect by prior sid=blocking_session start with blocking_session is null;select sql_id,sql_text,executions,elapsed_time,cpu_time,disk_reads,buffer_gets from v$sqlarea order by cpu_time desc fetch first 20 rows only;select * from table(dbms_xplan.display_cursor('&sql_id',null,'ALLSTATS LAST'));alter session set sql_trace=true; ... tkprof <trace_file> <out_file> sys=no sort=prsela,exeela,fchela;dba_hist_active_sess_history 回溯时段内问题会话与 SQL。四 善后验证与长期监控
alert.log 无新错误;对比优化前后 AWR/ASH 指标与等待事件。