oracle 报错sql日志,oracle11g新特性-sqlplus错误日志 | 信春哥,系统稳,闭眼上线不回滚!...

可能大家都用过sqlplus的show error命令查看PL/SQL的错误信息,但是一条普通的查询操作报错,这个命令就查不到了。

SQL> select * from test;

select * from test

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

SQL> show error

没有错误。

11g开始引入sqlplus错误日志新特性,可以通过show errorlogging查看从无日志是否开启,默认是关闭状态。

SQL> show errorlog

errorlogging is OFF

可以通过set errorlogging on的方式开启sqlplus的错误日志。

SQL> set errorlogging on

SQL> show errorlog

errorlogging is ON TABLE SYS.SPERRORLOG

默认情况下,错误日志记录在当前用户下的SPERRORLOG表中(系统会自动创建SPERRORLOG表,如果当前用户下已经存在同名的SPERRORLOG表,则打开sqlplus错误日志时,不会创建SPERRORLOG表,如果已存在的SPERRORLOG表和sqlplus错误日志表的结构不一样,在执行报错错误的SQL时,将额外报SP2-1519错误)。

SQL> create table SPERRORLOG(id number,name varchar2(10));

表已创建。

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

SPERRORLOG                     TABLE

SQL> set errorlogging on

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

SPERRORLOG                     TABLE

SQL> select * from test_1;

select * from test_1

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

ERROR:

ORA-00913: 值过多

SP2-1519: 无法写入错误日志表 STREAM.SPERRORLOG

在正确开启sqlplus的错误日志,那么我们执行一条SQL报错时,就可以在SPERRORLOG表中查到报错的记录。

SQL> select * from test_1;

select * from test_1

*

第 1 行出现错误:

ORA-00942: 表或视图不存在

SQL> select USERNAME,TIMESTAMP,MESSAGE,STATEMENT from SPERRORLOG;

USERNAME TIMESTAMP                       MESSAGE                   STATEMENT

-------- ------------------------------- ------------------------- ---------------------

STREAM   20-3月 -13 03.00.22.000000 下午 ORA-00942: 表或视图不存在 select * from test_1

此时,在其他会话查询这个用户下的SPERRORLOG表不会查询到错误信息。

SQL> SELECT * FROM STREAM.SPERRORLOG;

未选定行

可见在SQL语句报错的时候,这个会话只是向SPERRORLOG表中插入了数据,但是并没有提交,那么怎样验证是这个会话没有只向SPERRORLOG表中插入记录报错的信息而没提交呢?也很简单,手动提交或者使用DDL语句隐式触发提交,其他会话就可以查询到这张表记录的错误信息了。

SQL> create table test_1(id number);

表已创建。

在其他会话就可以查询到stream用户下的SPERRORLOG表里面的内容了。

SQL> select USERNAME,TIMESTAMP,MESSAGE,STATEMENT from stream.SPERRORLOG;

USERNAME TIMESTAMP                         MESSAGE                        STATEMENT

-------- --------------------------------  ------------------------------ --------------------

STREAM   20-3月 -13 03.00.22.000000 下午   ORA-00942: 表或视图不存在      select * from test_1

在没有手动提交或隐式提交的情况下,这个会话断开与数据库的连接后,记录会自动回滚,可是在触发提交后,即使会话断开与数据库的连接,SPERRORLOG表中已提交的数据不会自动删除。

在打开sqlplus错误日志后,如果SQL报错,就会将报错信息记录到SPERRORLOG表中,然后还不提交,这样数据库中就会存在锁信息。

SQL> SELECT * FROM V$LOCK WHERE ID1=(SELECT OBJECT_ID FROM dba_objects where owner='STREAM' and object_name='SPERRORLOG');

ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK

-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------

0E1EF30C 0E1EF33C        131 TM      77995          0          3          0       1051          0

当然,这个锁对数据库不会产生太大的影响,个人感觉,这个新特性对经常使用SQLPLUS的人来说可能有用,特别是习惯使用sqlplus书写PL/SQL的人,SPERRORLOG表中记录的PL/SQL错误信息要比 SHOW ERROR全面,但现在大部分人都习惯使用PLSQL Developer或其他第三方的工具来操作数据库,那么这个功能基本就没什么太大作用了。

本文也只是对11g的新特性-sqlplus的错误日志做简单的介绍,有兴趣的朋友可以深入研究下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值