Linux Oracle故障排除实战手册
一 快速定位流程
sqlplus / as sysdba,执行 SELECT status FROM v$instance; 查看实例状态。lsnrctl status,必要时 lsnrctl start。$ORACLE_HOME/diag/rdbms/<db_name>/<inst_name>/trace/alert_<inst_name>.log,用 tail -f 实时跟踪。v$session、v$lock、v$sql 等视图确认瓶颈与等待事件。二 常见故障场景与处置要点
| 症状/错误码 | 快速检查 | 处置要点 |
|---|---|---|
| 监听未启动/端口不通(TNS-12541、ORA-12560) | lsnrctl status;`ps -ef |
grep tnslsnr;netstat -an |
| 连接超时(ORA-12170、TNS-12535) | ping <IP>;telnet <IP> 1521;tnsping <服务名>;检查 sqlnet.ora 超时 |
调整 SQLNET.INBOUND_CONNECT_TIMEOUT/SQLNET.SEND_TIMEOUT/SQLNET.RECV_TIMEOUT(如 120 秒);排查网络设备/防火墙会话超时 |
| 连接数上限(ORA-12516/12518/12519) | SELECT COUNT(*) FROM v$session;;SHOW PARAMETER processes; SHOW PARAMETER sessions;;按用户/模块统计 |
终止无用 INACTIVE 会话:ALTER SYSTEM KILL SESSION 'sid,serial#';适度调大 processes/sessions(需重启);应用侧优化连接池与泄漏 |
| 认证协议不匹配(ORA-28040) | SELECT username, password_versions FROM dba_users WHERE username='xxx';;sqlnet.ora 的 SQLNET.ALLOWED_LOGON_VERSION_SERVER |
服务端设置 SQLNET.ALLOWED_LOGON_VERSION_SERVER=11(或更高兼容版本);必要时重置用户密码以生成新版本密码 |
| 账号锁定/密码过期(ORA-01017、ORA-28000) | SELECT username, account_status, lock_date, expiry_date FROM dba_users WHERE username='xxx'; |
解锁:ALTER USER xxx ACCOUNT UNLOCK; 重置密码:ALTER USER xxx IDENTIFIED BY 新密码; 视需要调整密码策略 |
| 数据库不可用(ORA-01034、ORA-27101) | sqlplus / as sysdba 查实例状态;lsnrctl status 看服务注册 |
启动实例 startup;若失败,立刻查看 Alert 日志 定位根因 |
| 修改 SGA/PGA 后无法启动 | 检查系统 OOM 与磁盘空间;free -h、swapon --show、grep -i "oom|kill" /var/log/messages;df -h |
临时扩容 Swap 恢复实例;将内存管理改为手工并下调 sga_target/pga_aggregate_target,遵循 SGA+PGA ≤ 物理内存的约 80% 的经验值,再逐步调优 |
三 日志与诊断工具
diag/rdbms/<db>/<inst>/trace/,用于深入诊断。$ORACLE_HOME/network/log/listener.log,用于分析连接请求与监听异常。grep "ORA-" /path/to/logs | awk '{print $0}' | sort | uniq -c | sort -nrsed -n '/Nov 27 14:/,/Nov 27 15:/p' /var/log/messagesv$session、v$lock、v$sql 定位等待与热点 SQL;SQL 级别用 tkprof 分析执行计划与耗时。四 系统资源与环境检查
free -h、swapon --showgrep -i "oom\|kill" /var/log/messages | grep -i oracledd if=/dev/zero of=/tmp/swapfile bs=1G count=4
chmod 600 /tmp/swapfile
mkswap /tmp/swapfile
swapon /tmp/swapfile
df -h,关注 归档、数据文件、日志 所在分区是否已满。telnet <IP> 1521、firewall-cmd --list-all(或 iptables -S)lsnrctl status 确认服务已注册到监听sqlplus、lsnrctl、emctl 等应在 PATH 中可直接执行。五 安全与变更建议
SQLNET.ALLOWED_LOGON_VERSION_SERVER 兼容老旧客户端,同时推动客户端升级。