首页 >
问答 >
云计算 >
centos上sqlplus日志分析方法
centos上sqlplus日志分析方法
小樊
36
2025-12-21 11:36:56
CentOS 上 SQL*Plus 日志分析方法
一 日志来源与定位
SQL*Plus 自身输出日志:由用户在会话中使用 SPOOL 或将命令行输出重定向到文件生成,常见路径为用户自定义目录(如 /var/log/sqlplus/ 或脚本目录)。示例:SPOOL /path/to/run.log;或 sqlplus user/pass@db @script.sql > run.log 2>&1。此类日志记录了脚本执行过程、结果集与报错输出。
数据库告警与跟踪日志:用于定位实例级错误、启动关闭、内部异常等,路径由 ADR(自动诊断仓库) 管理,通常为 $ORACLE_BASE/diag/rdbms/<db_name>//trace/alert_.log ,可用 adrci 或 SQL 查询 v$diag_info 获取实际路径。
监听器日志:网络层面连接问题排查,位于 $ORACLE_HOME/network/log/listener.log 。
联机重做日志与归档日志:用于恢复与“谁在何时改了什么”的取证分析,文件路径可通过 v$logfile 查询;历史归档序列与时间可通过 v$log_history 辅助定位。
二 快速查看与过滤
实时查看 SQL*Plus 输出日志:tail -f /path/to/run.log。
关键字筛选错误:grep -i “ORA-” /path/to/run.log;如需排除无关项可用 grep -v。
按时间窗口提取(日志行内包含形如 YYYY-MM-DD HH:MM:SS 的时间戳时):awk ‘/2025-09-01 00:00:00/,/2025-09-01 23:59:59/’ /path/to/run.log。
清理脚本注释行:sed ‘/^–/d’ script.sql(用于预处理脚本,便于后续分析)。
系统级线索:若 sqlplus 崩溃或异常退出,可在 /var/log/messages 或 /var/log/syslog 检索 sqlplus 相关条目(grep -i sqlplus)。
三 深入分析与取证
使用 LogMiner 还原 DML 变更:适合定位“某时某表被谁改了什么”。基本步骤为:
以 SYS 登录,选择数据字典来源(如 DBMS_LOGMNR_D.BUILD 生成字典文件,或使用 ONLINE_CATALOG );
通过 DBMS_LOGMNR.ADD_LOGFILE 将要分析的 归档日志/重做日志 加入列表;
以时间或 SCN 范围启动分析(DBMS_LOGMNR.START_LOGMNR);
查询 V$LOGMNR_CONTENTS 获取 SQL_REDO/SQL_UNDO 、操作类型(INSERT/UPDATE/DELETE)、SCN、时间戳、用户名、表名等;
分析结束调用 DBMS_LOGMNR.END_LOGMNR 释放会话级结果。提示:SELECT 不产生 REDO,LogMiner 无法还原 SELECT 语句本身。
审计线索:若已启用审计,可在 DBA_AUDIT_TRAIL 中查询到对象级访问记录(如 AUDIT SELECT ON schema.tbl BY ACCESS)。
SQL 执行痕迹与性能:对问题会话启用 SQL_TRACE ,用 TKPROF 格式化跟踪文件,获取执行计划、CPU/IO 等性能指标。
四 自动化与运维建议
日志轮转:为 SQL*Plus 输出日志配置 logrotate (示例:/etc/logrotate.d/sqlplus),如“daily rotate 7 compress missingok”,避免单文件过大。
权限与目录:确保 Oracle 用户对日志目录(如 $ORACLE_BASE/diag 、自定义日志目录)具备读写权限(chown -R oracle:oinstall /path)。
清理策略:
跟踪/告警文件可按时间清理(如 find trace/ -mtime +30 -name “.tr ” -delete),清理前建议备份并观察业务影响;
alert_.log 可先备份后清空或删除,数据库会自动重建;必要时执行 ALTER SYSTEM SWITCH LOGFILE 触发新日志生成。
集中化与可视化:将 SQL*Plus 输出与数据库日志接入 ELK (Logstash→Elasticsearch→Kibana),构建错误趋势、TOP 错误、慢脚本排行等图表。
五 常见场景命令清单
定位告警日志与实时查看:
SQL> SELECT value FROM v$diag_info WHERE name=‘Diag Trace’;
tail -f $ORACLE_BASE/diag/rdbms///trace/alert_.log
或:adrci> show alert -tail -f
捕获 SQL*Plus 会话输出:
sqlplus user/pass@db @script.sql > run.log 2>&1
或在会话中:SPOOL run.log … SPOOL OFF
按时间筛选错误:
awk ‘/2025-09-01 10:00:00/,/2025-09-01 18:00:00/’ run.log | grep -i “ORA-”
归档日志定位与 LogMiner 快速分析:
SQL> SELECT sequence#, first_time FROM v$log_history WHERE first_time BETWEEN to_date(‘2025-09-01’,‘yyyy-mm-dd’) AND to_date(‘2025-09-02’,‘yyyy-mm-dd’);
使用 DBMS_LOGMNR_D.BUILD 生成字典 → DBMS_LOGMNR.ADD_LOGFILE 添加归档 → START_LOGMNR(时间/SCN)→ 查询 V$LOGMNR_CONTENTS → END_LOGMNR。