Oracle错误日志是故障排查的核心依据,记录了数据库启动、运行及关闭过程中的详细错误信息。在Debian系统中,日志路径通常为$ORACLE_BASE/diag/rdbms/<DB_NAME>/<SID>/trace/alert_<SID>.log。可通过以下SQL命令快速定位日志文件位置:
SELECT * FROM vdiag_info WHERE name = 'Default Trace File';
使用cat、less或tail -f命令查看日志,重点关注“ORA-”开头的错误代码(如ORA-00600表示内部错误、ORA-01034表示Oracle未启动)。
ADMINISTER MANAGE ADR DATABASE;命令管理,用于存储trace文件、dump文件等诊断数据。ALTER SESSION SET SQL_TRACE = TRUE;开启当前会话的SQL跟踪,或使用DBMS_SESSION.SESSION_TRACE_ENABLE()开启全局跟踪,生成trace文件后可使用TKPROF工具分析SQL执行计划。使用top命令实时查看CPU、内存占用情况(重点关注Oracle进程的资源消耗);使用df -h命令检查磁盘空间(确保$ORACLE_HOME、$ORACLE_BASE及表空间数据文件所在分区有足够剩余空间);使用free -m命令查看内存使用情况(确保系统有足够空闲内存)。
通过ps -ef | grep ora_pmon命令检查Oracle进程监控器(PMON)是否运行(PMON是数据库实例的核心进程,若未运行则实例可能未启动)。若实例已启动但无法连接,可使用sqlplus / as sysdba登录数据库,执行SELECT status FROM v$instance;确认实例状态(正常状态为“OPEN”)。
监听器负责处理客户端与数据库之间的连接请求,使用lsnrctl status命令查看监听器是否运行(需显示“RUNNING”状态)及监听的端口(默认1521)。若监听器未启动,使用lsnrctl start命令启动;若端口被占用,可通过netstat -tulnp | grep 1521命令查找占用进程并终止。
ps -ef | grep ora_pmon找到Oracle进程,使用kill -9 <PID>终止所有相关进程,再执行sqlplus / as sysdba启动实例。$ORACLE_SID环境变量是否设置正确(需与数据库实例名一致),或尝试使用sqlplus /nolog登录后执行CONNECT SYS AS SYSDBA。SELECT tablespace_name, bytes_used/1024/1024 AS used_mb, bytes_free/1024/1024 AS free_mb FROM dba_temp_free_space;(临时表空间)或SELECT a.tablespace_name, a.bytes_alloc/1024/1024 AS alloc_mb, (a.bytes_alloc - nvl(b.bytes_free, 0))/1024/1024 AS used_mb, nvl(b.bytes_free, 0)/1024/1024 AS free_mb FROM (SELECT tablespace_name, sum(bytes) AS bytes_alloc FROM dba_data_files GROUP BY tablespace_name) a, (SELECT tablespace_name, sum(bytes) AS bytes_free FROM dba_free_space GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name(+);(永久表空间)。ALTER DATABASE DATAFILE '<DATAFILE_PATH>' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;;若不支持,添加新数据文件:ALTER TABLESPACE <TABLESPACE_NAME> ADD DATAFILE '<NEW_DATAFILE_PATH>' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;。UNDO_RETENTION参数设置过小,导致长时间查询无法获取一致的读取视图。ALTER DATABASE DATAFILE '<UNDO_DATAFILE_PATH>' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;UNDO_RETENTION参数(单位:秒):ALTER SYSTEM SET UNDO_RETENTION=900 SCOPE=BOTH;(设置为900秒,即15分钟)/*+ NO_SNAPSHOT */提示。SELECT s.sid, s.serial#, s.username, s.osuser, s.program, s.status, l.type, l.lmode, l.request, l.block FROM v$session s, v$lock l WHERE s.sid = l.sid AND l.block > 0;ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>' IMMEDIATE;。SELECT * FROM <TABLE_NAME> WHERE <CONSTRAINT_COLUMN> = '<VALUE>';ALTER TABLE <TABLE_NAME> DISABLE CONSTRAINT <CONSTRAINT_NAME>;(完成后需重新启用:ALTER TABLE <TABLE_NAME> ENABLE CONSTRAINT <CONSTRAINT_NAME>;)。