SQL*Plus的日志主要分为两类:会话输出日志(记录执行的SQL语句及结果)和错误日志(记录执行过程中的错误信息)。
.sqlplus文件夹中,文件名为log(路径示例:~/.sqlplus/log)。SPERRORLOG表记录,该表位于当前用户 schema 下(如SCOTT.SPERRORLOG),默认自动创建(若已存在同名表且结构不符,需手动调整或删除旧表)。使用文本编辑器(如vim、nano)或命令行工具查看默认日志文件:
vim ~/.sqlplus/log # 查看完整日志
tail -f ~/.sqlplus/log # 实时监控日志更新(按Ctrl+C停止)
通过SPOOL命令将输出重定向到自定义文件,支持动态命名(如按日期生成):
-- 静态文件名
SPOOL /path/to/static_log.log
SELECT * FROM employees;
SPOOL OFF
-- 动态文件名(结合日期)
SET TERMOUT OFF
VARIABLE dt VARCHAR2(13);
BEGIN
SELECT TO_CHAR(SYSDATE, 'yyyymmdd_hh24mi') INTO :dt FROM DUAL;
END;
/
SPOOL dynamic_&&dt..log
SELECT * FROM departments;
SPOOL OFF
SET TERMOUT ON
直接在命令行重定向SQL*Plus的输出(包括标准输出和错误输出):
sqlplus username/password@database > /path/to/output.log 2>&1
>:重定向标准输出到文件;2>&1:将标准错误合并到标准输出,确保所有信息均写入日志。执行以下命令启用错误日志记录(默认记录到SPERRORLOG表):
SET ERRORLOGGING ON;
SHOW ERRORLOG; -- 确认状态(应为“TABLE SCOTT.SPERRORLOG”)
查询SPERRORLOG表获取详细的错误信息(包括时间、语句、错误消息):
SELECT USERNAME, TIMESTAMP, STATEMENT, MESSAGE
FROM SCOTT.SPERRORLOG
ORDER BY TIMESTAMP DESC;
TRUNCATE TABLE SCOTT.SPERRORLOG; -- 清空当前日志
ERRORLOGGING才会重建):DROP TABLE SCOTT.SPERRORLOG; -- 删除旧表
SET ERRORLOGGING ON; -- 重新开启(自动创建新表)
SPERRORLOG表),需删除旧表或调整结构以恢复记录功能。使用logrotate工具定期清理旧日志,避免日志文件过大:
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/sqlplus):/home/username/.sqlplus/log {
weekly # 每周轮转
rotate 4 # 保留4个备份
compress # 压缩旧日志(如.gz格式)
missingok # 忽略缺失文件
notifempty # 空日志不轮转
}
sudo logrotate -vf /etc/logrotate.d/sqlplus
chmod 600 ~/.sqlplus/log),避免敏感信息泄露;SYSDBA或表所有者)才能访问SPERRORLOG表。