温馨提示×

Linux SQLPlus日志查看方法

小樊
39
2025-12-16 18:03:36
栏目: 云计算

Linux 下 SQL*Plus 日志查看方法

一 开启并使用 SQL*Plus 内置错误日志

  • SQL*Plus 11g 及以上版本可直接开启错误日志,将 SP2-ORA-PLS- 等错误落地到数据表,便于事后检索。
  • 基本用法:
    • 开启并记录到当前用户下的表(表名自动为 SPERRORLOG,若已存在则复用):
      SET ERRORLOGGING ON
      SHOW ERRORLOGGING
      
    • 指定自定义表与所属用户(示例:用户 SEC,表 MY_SQLERR_LOG):
      SET ERRORLOGGING ON TABLE SEC.MY_SQLERR_LOG
      
    • 查询错误记录(示例):
      COL USERNAME FOR A10
      COL TIMESTAMP FOR A20
      COL MESSAGE FOR A60
      SELECT USERNAME, TIMESTAMP, MESSAGE, STATEMENT
      FROM SEC.MY_SQLERR_LOG
      ORDER BY TIMESTAMP DESC;
      
    • 说明:默认情况下,错误记录写入为“未提交”状态;如需在库中永久保留,执行 COMMIT。字段包含:USERNAME、TIMESTAMP、SCRIPT、IDENTIFIER、MESSAGE、STATEMENT

二 在 SQL*Plus 内查看数据库告警与跟踪日志路径

  • 告警日志(alert)与后台进程跟踪文件位置(适用于 11g 及以后,DIAG 目录结构):
    -- 告警日志(文本,持续追加)
    SHOW PARAMETER BACKGROUND_DUMP_DEST
    
    -- 用户进程跟踪文件目录
    SHOW PARAMETER USER_DUMP_DEST
    
    -- 审计文件目录
    SHOW PARAMETER AUDIT_FILE_DEST
    
    -- 核心转储目录
    SHOW PARAMETER CORE_DUMP_DEST
    
    典型路径形如:$ORACLE_BASE/diag/rdbms///trace/alert_.log(告警)以及同目录下的 .trc/.trm 文件(跟踪)。
  • 若需快速确认监听日志(非 SQL*Plus 内置,但常配合排错):
    -- 监听跟踪与告警目录(11g 起)
    SHOW PARAMETER DIAG_TRACE
    SHOW PARAMETER DIAG_ALERT
    
    典型路径形如:$ORACLE_BASE/diag/tnslsnr//listener/trace/…/alert/

三 Linux 侧实时查看与检索日志文件

  • 实时查看(最常用):
    tail -f $ORACLE_BASE/diag/rdbms/<dbname>/<inst>/trace/alert_<sid>.log
    tail -f $ORACLE_BASE/diag/rdbms/<dbname>/<inst>/trace/*.trc
    
  • 关键字检索并高亮(示例:ORA-、SP2-):
    tail -f alert_<sid>.log | egrep --color=auto "ORA-|SP2-|PLS-"
    
  • 按时间窗口查看最近一段时间的错误(示例:最近 60 分钟):
    find $ORACLE_BASE/diag/rdbms/<dbname>/<inst>/trace/ -name "alert_<sid>.log" -mmin -60 -exec tail -n 200 {} \; | egrep "ORA-|SP2-"
    
  • 大文件分页查看:
    less -S $ORACLE_BASE/diag/rdbms/<dbname>/<inst>/trace/alert_<sid>.log
    
  • 监听日志也可用同样方式实时查看:
    tail -f $ORACLE_BASE/diag/tnslsnr/<hostname>/listener/trace/listener.log
    
    以上命令均为 Linux 常用日志查看方式,配合 Oracle 的 DIAG 目录定位即可高效排查。

四 使用 LogMiner 分析重做日志以还原历史操作

  • 适用场景:需要追溯 INSERT/UPDATE/DELETE/DDL 等已提交事务的具体内容(注意:SELECT 不产生重做,不会被 LogMiner 捕获)。
  • 基本步骤(以 11g 为例):
    1. 指定字典目录并重启(UTL_FILE_DIR 方式,示例目录 /u01/arch):
      ALTER SYSTEM SET UTL_FILE_DIR='/u01/arch' SCOPE=SPFILE;
      SHUTDOWN IMMEDIATE;
      STARTUP;
      
    2. 生成数据字典文件:
      BEGIN
        DBMS_LOGMNR_D.BUILD(
          dictionary_name     => 'logmnr_dict.dat',
          dictionary_location => '/u01/arch');
      END;
      /
      
    3. 添加并重做日志文件到分析列表:
      BEGIN
        DBMS_LOGMNR.ADD_LOGFILE(
          options => DBMS_LOGMNR.NEW,
          logfilename => '/u01/arch/o1_mf_1_37_57scllcl_.arc');
      END;
      /
      
    4. 启动 LogMiner(可按时间或 SCN 窗口):
      BEGIN
        DBMS_LOGMNR.START_LOGMNR(
          dictfilename => '/u01/arch/logmnr_dict.dat',
          starttime => TO_DATE('2025-12-16 00:00:00','YYYY-MM-DD HH24:MI:SS'),
          endtime   => TO_DATE('2025-12-16 23:59:59','YYYY-MM-DD HH24:MI:SS'));
      END;
      /
      
    5. 查询分析结果(示例:查看某表变更):
      SELECT scn, timestamp, username, sql_redo, sql_undo
      FROM V$LOGMNR_CONTENTS
      WHERE seg_owner = 'SCOTT' AND table_name = 'EMP'
      ORDER BY scn;
      
    6. 结束分析会话:
      EXEC DBMS_LOGMNR.END_LOGMNR;
      
    说明:分析视图 V$LOGMNR_CONTENTS 仅在当前 LogMiner 会话内有效,退出后不可见。

0