如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?

更新于
2026-08-21 09:43:44
3阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

痛点:在 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 分析。

如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?

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///trace/alert_.log 如果不确定 $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

  • b. 同步查看 Alert 日志中是否有资源告警:
    # 实时 tail 并高亮关键字
    tail -n 200 $ORACLEBASE/diag/rdbms/orcl/ORCL/trace/alertORCL.log \
    | grep --color=auto -E "ORA-|ERROR|space|processes|locked"
    
  • d. 若发现 “ORA‑01652: unable to extend temp segment” 或 “ORA‑00054: resource busy” 等信息。 根据提示立即检查临时表空间或锁等待:
    # 查看临时表空间使用率
    SELECT tablespacename,round*100,2) AS pctused
    FROM v$tempspaceheader;
  • d. 使用 journalctl 确认程序层面是否有 OOM 或磁盘 I/O 报错:
    # 检索最近半小时内的 OOM 信息
    journalctl --since "30 min ago" | grep -i oom
  • journalctl --since "30 min ago" | grep -i "I/O error"

  • E. 定位完根因后以相同方式保存 SPOOL 日志供审计:
    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;

  • SPOOL 停止记录 SPO OFF;
  • LINESIZE 与 TRIMSPOOL 设置 SET LINESIZE 32767;按理说, SET TRIMSPOOL OFF;

  • CATCH ALERT LOG 实时监控 TARGET=$ORACLE_BASE/diag/rdbms/${DB}/${INST}/trace; T=$);其实,tail -f $TARGET/$T | grep --color=auto -E "ORA-|ERROR|waiting";其实,

  • 如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?

  • CUSTOM TRACE 方法获取 P=$;echo $P,
  • SYSTEMD 日志查询 manuallog=$;老实说,echo "$manuallog" | grep ORA-;
  • SCRIPT 捕获完整交互 SCRIPT /tmp/sqlplussession$.log;
  • MULTI‑LINE GREP 高亮关键字示例 T=$;老实说,echo "$T" | grep -A5 -B5 --color=auto -E "";
  • CLEANUP 老旧日志
  • DUMP V$DIAGINFO 全部方法 Select * from v$diag
    info;
  • AUTO‑SPOT ALERT 用 crontab 每日归档 * * * * * root cp $TARGET/alert${INST}.log /backup/alert${INST}$.log &&> $TARGET/alert${INST}.log;

  • 掌握以上技巧,你就能在 CentOS 上比较容易做到 “看得见·改得了·跑得快” 的数据库故障排查程序。

    标签: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 分析。

    如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?

    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///trace/alert_.log 如果不确定 $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

  • b. 同步查看 Alert 日志中是否有资源告警:
    # 实时 tail 并高亮关键字
    tail -n 200 $ORACLEBASE/diag/rdbms/orcl/ORCL/trace/alertORCL.log \
    | grep --color=auto -E "ORA-|ERROR|space|processes|locked"
    
  • d. 若发现 “ORA‑01652: unable to extend temp segment” 或 “ORA‑00054: resource busy” 等信息。 根据提示立即检查临时表空间或锁等待:
    # 查看临时表空间使用率
    SELECT tablespacename,round*100,2) AS pctused
    FROM v$tempspaceheader;
  • d. 使用 journalctl 确认程序层面是否有 OOM 或磁盘 I/O 报错:
    # 检索最近半小时内的 OOM 信息
    journalctl --since "30 min ago" | grep -i oom
  • journalctl --since "30 min ago" | grep -i "I/O error"

  • E. 定位完根因后以相同方式保存 SPOOL 日志供审计:
    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;

  • SPOOL 停止记录 SPO OFF;
  • LINESIZE 与 TRIMSPOOL 设置 SET LINESIZE 32767;按理说, SET TRIMSPOOL OFF;

  • CATCH ALERT LOG 实时监控 TARGET=$ORACLE_BASE/diag/rdbms/${DB}/${INST}/trace; T=$);其实,tail -f $TARGET/$T | grep --color=auto -E "ORA-|ERROR|waiting";其实,

  • 如何通过查看CentOS SQLplus日志,高效轻松地排查数据库问题呢?

  • CUSTOM TRACE 方法获取 P=$;echo $P,
  • SYSTEMD 日志查询 manuallog=$;老实说,echo "$manuallog" | grep ORA-;
  • SCRIPT 捕获完整交互 SCRIPT /tmp/sqlplussession$.log;
  • MULTI‑LINE GREP 高亮关键字示例 T=$;老实说,echo "$T" | grep -A5 -B5 --color=auto -E "";
  • CLEANUP 老旧日志
  • DUMP V$DIAGINFO 全部方法 Select * from v$diag
    info;
  • AUTO‑SPOT ALERT 用 crontab 每日归档 * * * * * root cp $TARGET/alert${INST}.log /backup/alert${INST}$.log &&> $TARGET/alert${INST}.log;

  • 掌握以上技巧,你就能在 CentOS 上比较容易做到 “看得见·改得了·跑得快” 的数据库故障排查程序。

    标签:CentOS