如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?
- 内容介绍
- 文章标签
- 相关推荐
痛点:在 CentOS 环境下排查 Oracle 数据库问题时往往不知道 SQL*Plus 的会话输出、错误信息到底保存在哪里;说起来,1️⃣ 日志散落在多个目录,手动搜索耗时。2️⃣ 默认不记录会话,出错后只能凭记忆复现。3️⃣ 日志文件行宽、空格被截断,导致关键信息难以阅读。解决思路:通过程序自带工具和 Oracle 自带的 alert/trace 日志。实现“一键抓取‑一键定位”,让排查过程从“盲目”变成“可视”。
一、SQL*Plus 本身不生成日志——先把会话输出抓下来
1. 使用 SPOOL 命令实时写入文件
1) 进入 SQL*Plus 会话后立即开启 SPOOL:
SPOOL /var/log/sqlplus/session_$.log
2) 执行所有查询、DDL、DML。3) 完成后关闭 SPOOL:SPO OFF
4) 生成的日志保留原始换行、空格,便于后期 grep/awk 分析。
2. 使用 Linux script 命令捕获完整终端交互
script -q -c "sqlplus / as sysdba" /var/log/sqlplus/script_$.log
该方式会把所有键入和输出全部记录。包括错误堆栈和提示符,非常适合一次性排查 “登录卡死”“无响应”等现场问题。
3. 调整 LINESIZE 与 TRIMSPOOL 防止行宽被裁剪
再看在登录后执行。SET LINESIZE 32767
SET TRIMSPOOL OFF
这样即使假脱机输出的文本行宽度也保持与终端一致,避免关键信息被截断。
二、Oracle 数据库主要日志位置——Alert 与 Trace 文件
1. 查找 Alert 日志
从默认方法来看。$ORACLE_BASE/diag/rdbms/
如果不确定 $ORACLE_BASE,可通过 SQL*Plus 获取:
SHOW PARAMETER background_dump_dest;
说到或者查询视图,SELECT value FROM v$diag_info WHERE name='Diag Trace';怎么说呢,
从常用查看命令来看。tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log | grep --color=auto -E "ORA-|ERROR|waiting|full"
2. Trace 日志——细粒度会话或进程错误追踪
获取当前实例的默认 Trace 文件方法:
SELECT value FROM v$diag_info WHERE name='Default Trace File';
如果需要开启使用者会话跟踪,可在 SQL*Plus 中执行:
结束后查找对应的 *.trc 文件。一样使用 tkprof/alertlog.txt 进行格式化分析。
三、借助程序日志工具快速定位 Oracle 服务异常
1. journalctl 查看 systemd 管理的 Oracle 服务日志
如果 Oracle 是以 systemd 服务方式启动,可以直接查询其日志:
# 最近24小时内的所有 Oracle 相关日志
journalctl -u oracle.service --since "24 hours ago"
结合时间范围过滤更精准:
# 只看今天上午10点到12点之间出现的 ORA- 错误
journalctl -u oracle.service --since "2026-08-20 10:00" --until "2026-08-20 12:00" | grep --color=auto ORA-
2. 使用 find 快速定位使用者主目录下的 sqlplus.log
# 查找所有 sqlplus.log
find ~ -type f -name "sqlplus.log"
# 示例筛选最近24小时内产生的错误
find /var/log/sqlplus -name "*.log" -mtime -1 -exec grep -i "error" {} \;
四、实战案例——从“登录失败”到根因定位的完整流程
场景:上午10:30 左右。多个开发人员报告 "SQL*Plus 登录卡死",DBA 想快速确认是否是实例资源耗尽还是网络异常。
步骤:
-
a. 打开终端,立即启动 script 捕获完整交互:
# 捕获到 /tmp/loginissue$.log script -q -c "sqlplus user/pwd@orcl" /tmp/login_issue.log
exit
# 实时 tail 并高亮关键字
tail -n 200 $ORACLEBASE/diag/rdbms/orcl/ORCL/trace/alertORCL.log \
| grep --color=auto -E "ORA-|ERROR|space|processes|locked"
# 查看临时表空间使用率
SELECT tablespacename,round*100,2) AS pctused
FROM v$tempspaceheader;
# 检索最近半小时内的 OOM 信息
journalctl --since "30 min ago" | grep -i oom
journalctl --since "30 min ago" | grep -i "I/O error"
SPOOL /var/log/sqlplus/fixtempspace_$.log
ALTER TABLESPACE temp ADD DATAFILE '/u01/app/oracle/oradata/orcl/temp02.dbf' SIZE 5G;SPO OFF,
通过上述“一键抓取‑一键定位”的闭环。你可以把原本需要数十分钟甚至数小时才能复现的问题压缩到几分钟完成,明显提高运维效率。
五、常用快捷命令汇总
- SPOOL 开始记录 SPOOL /var/log/sqlplus/${USER}_$.log;
掌握以上技巧,你就能在 CentOS 上比较容易做到 “看得见·改得了·跑得快” 的数据库故障排查程序。
痛点:在 CentOS 环境下排查 Oracle 数据库问题时往往不知道 SQL*Plus 的会话输出、错误信息到底保存在哪里;说起来,1️⃣ 日志散落在多个目录,手动搜索耗时。2️⃣ 默认不记录会话,出错后只能凭记忆复现。3️⃣ 日志文件行宽、空格被截断,导致关键信息难以阅读。解决思路:通过程序自带工具和 Oracle 自带的 alert/trace 日志。实现“一键抓取‑一键定位”,让排查过程从“盲目”变成“可视”。
一、SQL*Plus 本身不生成日志——先把会话输出抓下来
1. 使用 SPOOL 命令实时写入文件
1) 进入 SQL*Plus 会话后立即开启 SPOOL:
SPOOL /var/log/sqlplus/session_$.log
2) 执行所有查询、DDL、DML。3) 完成后关闭 SPOOL:SPO OFF
4) 生成的日志保留原始换行、空格,便于后期 grep/awk 分析。
2. 使用 Linux script 命令捕获完整终端交互
script -q -c "sqlplus / as sysdba" /var/log/sqlplus/script_$.log
该方式会把所有键入和输出全部记录。包括错误堆栈和提示符,非常适合一次性排查 “登录卡死”“无响应”等现场问题。
3. 调整 LINESIZE 与 TRIMSPOOL 防止行宽被裁剪
再看在登录后执行。SET LINESIZE 32767
SET TRIMSPOOL OFF
这样即使假脱机输出的文本行宽度也保持与终端一致,避免关键信息被截断。
二、Oracle 数据库主要日志位置——Alert 与 Trace 文件
1. 查找 Alert 日志
从默认方法来看。$ORACLE_BASE/diag/rdbms/
如果不确定 $ORACLE_BASE,可通过 SQL*Plus 获取:
SHOW PARAMETER background_dump_dest;
说到或者查询视图,SELECT value FROM v$diag_info WHERE name='Diag Trace';怎么说呢,
从常用查看命令来看。tail -f $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace/alert_ORCL.log | grep --color=auto -E "ORA-|ERROR|waiting|full"
2. Trace 日志——细粒度会话或进程错误追踪
获取当前实例的默认 Trace 文件方法:
SELECT value FROM v$diag_info WHERE name='Default Trace File';
如果需要开启使用者会话跟踪,可在 SQL*Plus 中执行:
结束后查找对应的 *.trc 文件。一样使用 tkprof/alertlog.txt 进行格式化分析。
三、借助程序日志工具快速定位 Oracle 服务异常
1. journalctl 查看 systemd 管理的 Oracle 服务日志
如果 Oracle 是以 systemd 服务方式启动,可以直接查询其日志:
# 最近24小时内的所有 Oracle 相关日志
journalctl -u oracle.service --since "24 hours ago"
结合时间范围过滤更精准:
# 只看今天上午10点到12点之间出现的 ORA- 错误
journalctl -u oracle.service --since "2026-08-20 10:00" --until "2026-08-20 12:00" | grep --color=auto ORA-
2. 使用 find 快速定位使用者主目录下的 sqlplus.log
# 查找所有 sqlplus.log
find ~ -type f -name "sqlplus.log"
# 示例筛选最近24小时内产生的错误
find /var/log/sqlplus -name "*.log" -mtime -1 -exec grep -i "error" {} \;
四、实战案例——从“登录失败”到根因定位的完整流程
场景:上午10:30 左右。多个开发人员报告 "SQL*Plus 登录卡死",DBA 想快速确认是否是实例资源耗尽还是网络异常。
步骤:
-
a. 打开终端,立即启动 script 捕获完整交互:
# 捕获到 /tmp/loginissue$.log script -q -c "sqlplus user/pwd@orcl" /tmp/login_issue.log
exit
# 实时 tail 并高亮关键字
tail -n 200 $ORACLEBASE/diag/rdbms/orcl/ORCL/trace/alertORCL.log \
| grep --color=auto -E "ORA-|ERROR|space|processes|locked"
# 查看临时表空间使用率
SELECT tablespacename,round*100,2) AS pctused
FROM v$tempspaceheader;
# 检索最近半小时内的 OOM 信息
journalctl --since "30 min ago" | grep -i oom
journalctl --since "30 min ago" | grep -i "I/O error"
SPOOL /var/log/sqlplus/fixtempspace_$.log
ALTER TABLESPACE temp ADD DATAFILE '/u01/app/oracle/oradata/orcl/temp02.dbf' SIZE 5G;SPO OFF,
通过上述“一键抓取‑一键定位”的闭环。你可以把原本需要数十分钟甚至数小时才能复现的问题压缩到几分钟完成,明显提高运维效率。
五、常用快捷命令汇总
- SPOOL 开始记录 SPOOL /var/log/sqlplus/${USER}_$.log;
掌握以上技巧,你就能在 CentOS 上比较容易做到 “看得见·改得了·跑得快” 的数据库故障排查程序。

