SQL*Plus本身无独立日志,需通过SPOOL命令将执行过程及结果输出到指定文件。常用场景包括保存查询结果、脚本执行记录等。
示例脚本(dynamic_logfile_name.sql):
SET TERMOUT OFF ECHO OFF VERIFY OFF FEEDBACK OFF
VARIABLE dt VARCHAR2(13);
COL dt FORMAT a15;
BEGIN
SELECT TO_CHAR(SYSDATE, 'yyyymmdd_hh24mi') INTO :dt FROM DUAL;
END;
/
PRINT dt;
COL report_name NEW_VALUE rpt_name;
SELECT 'dynamic_logfile_' || :dt || '.log' AS report_name FROM DUAL;
PROMPT "变量 rpt_name 值为 &rpt_name";
SPOOL &rpt_name;
ALTER SESSION SET nls_date_format='yyyymmdd hh24:mi:ss';
SELECT SYSDATE FROM DUAL;
SPOOL OFF;
SET TERMOUT ON ECHO ON VERIFY ON;
SET FEEDBACK ON;
UNDEFINE rpt_name;
EXIT;
执行方式:
sqlplus -S scott/tiger@orcl @dynamic_logfile_name.sql
效果:生成动态命名的日志文件(如dynamic_logfile_20251030_1430.log),包含执行时间、查询结果等内容。
SQL*Plus执行时,日志主要分布在以下位置:
SHOW PARAMETER background_dump_dest查询(如/u01/app/oracle/diag/rdbms/orcl/trace/alert_orcl.log)。SHOW PARAMETER user_dump_dest查询(如/u01/app/oracle/diag/rdbms/orcl/trace/orcl_ora_12345.trc)。~/sqlplus/log目录(需确认环境变量设置)。基础查看:使用cat、less、tail命令查看日志内容。
tail -f /path/to/sqlplus.log。grep "ORA-" /path/to/sqlplus.log(Oracle错误码以ORA-开头)。高级分析:
awk '/ORA-/ {print $1, $2, $10}' alert.log(假设日志含YYYY-MM-DD格式时间戳)。grep "ORA-" alert.log | wc -l(统计告警日志中的错误行数)。sed '/^--/d' /path/to/sqlplus.log(去掉以--开头的注释行)。为避免日志文件过大占用磁盘空间,需通过logrotate工具定期轮转(压缩、删除旧日志)。
配置步骤:
/etc/logrotate.d/sqlplus文件(若不存在则创建),添加以下内容:/path/to/sqlplus.log {
daily # 每天轮转
rotate 7 # 保留7个旧日志文件
compress # 压缩旧日志(如.gz格式)
missingok # 日志丢失时不报错
notifempty # 日志为空时不轮转
create 640 oracle oinstall # 创建新日志,权限640,属主oracle,属组oinstall
}
sudo logrotate -f /etc/logrotate.d/sqlplus(强制执行轮转,验证配置是否正确)。logrotate默认由cron每日运行(路径/etc/cron.daily/logrotate),无需额外配置。/path/to/logs)属主为oracle用户,权限为640(chown -R oracle:oinstall /path/to/logs),避免权限问题导致日志无法写入。logrotate的rotate参数控制保留的日志数量(如rotate 7保留7天),或手动删除过期日志(如rm -f /path/to/sqlplus.log.7.gz)。ORA-错误的数量变化)。