备份异常引发的ORA-01438,ORA-20242故障解析


早晨检查备份,发现一台ERP的测试机备份异常,检查日志发现如下错误

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of crosscheck command at 02/17/2017 12:22:58

ORA-00604: error occurred at recursive SQL level 1

ORA-01438: value larger than specified precision allowed for this column

ORA-20242: No archived logs in the range specified

看到604和1438这样的异常第一时间感觉很诧异,一个普普通通的备份不应该会有这样报错提示啊。分析了一下。。原来备份脚本在执行crosscheck和delete expired时报的错误,于是将这两个命令注释掉,重启发起了备份,成功了。

那么问题来了,crosscheck和delete expired都是rman中很常见的命令(这里解释一下,crosscheck是交叉校验备份集,delete expired是同步catalog与物理备份,清理过期的数据字典,这两条命令是配合使用的),那么为什么会引起某个表的列值不够大呢。

于是trace了一下rman命令:

RMAN> sql "alter session set tracefile_identifier=''rman_verify01438''";

RMAN> sql "alter session set events ''10046 trace name context forever,level 12''";

RMAN> sql "alter session set events ''1438 trace name errorstack level 10''";

RMAN> set echo on;

RMAN> crosscheck archivelog all

RMAN> exit;

检查trace文件发现如下信息:

<<<<<<<<<<<<<<<<Q01_ora_18582_rman_verify01438.trc

 

----- Error Stack Dump -----

ORA-01438: value larger than specified precision allowed for this column

ORA-20242: No archived logs in the range specified

ORA-06512: at "SYS.DBMS_RCVMAN", line 9172

ORA-06512: at "SYS.DBMS_RCVMAN", line 18221

ORA-06512: at line 1

----- Current SQL Statement for this session (sql_id=5w48h65mm7zu7) -----

INSERT INTO STATS$USER_LOG VALUES( USER, SYS_CONTEXT('USERENV','SESSIONID'), SYS_CONTEXT('USERENV','HOST'), NULL, NULL, NULL, SYSDATE, TO_CHAR(SYSDATE, 'hh24:mi:ss'), NULL, NULL, NULL )

----- PL/SQL Stack -----

怀疑是插入stats$user_log这个表时引发的,那么看一下这个表的owner和结构

SQL> select owner , object_type, status from dba_objects where object_name='STATS$USER_LOG';


OWNER       OBJECT_TYPE   STATUS
------------------------------ ------------------- -------
SYSTEM       TABLE   VALID


SQL> desc system.STATS$USER_LOG
 Name   Null?    Type
 ----------------------------------------- -------- ----------------------------
 USER_ID    VARCHAR2(30)
 SESSION_ID    NUMBER(8)
 HOST    VARCHAR2(30)
 LAST_PROGRAM    VARCHAR2(48)
 LAST_ACTION    VARCHAR2(32)
 LAST_MODULE    VARCHAR2(32)
 LOGON_DAY    DATE
 LOGON_TIME    VARCHAR2(10)
 LOGOFF_DAY    DATE
 LOGOFF_TIME    VARCHAR2(10)
 ELAPSED_MINUTES    NUMBER(8)

由于插入的是sessionid和host,因此怀疑sessionid长度超限,那么尝试修改了字段类型,不限number的位数

SQL> alter table system.stats$user_log modify session_id number;

 

Table altered.

执行命令,发现依然报错,不过这次的错误代码变了

RMAN> crosscheck archivelog all;

 

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=929 device type=DISK

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of crosscheck command at 02/17/2017 15:20:40

ORA-04045: errors during recompilation/revalidation of SYSTEM.LOGON_AUDIT_TRIGGER2

ORA-01031: insufficient privileges

ORA-20242: No archived logs in the range specified

 

RMAN> delete expired archivelog all;

 

released channel: ORA_DISK_1

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=929 device type=DISK

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of delete command at 02/17/2017 15:20:58

ORA-04045: errors during recompilation/revalidation of SYSTEM.LOGON_AUDIT_TRIGGER2

ORA-01031: insufficient privileges

ORA-20242: No archived logs in the range specified

根据报错信息,发现这个一个trigger,跟之前怀疑的吻合,trigger触发了insert导致插入失败,那么修改字段type,需要将trigger重新进行编译

alter trigger SYSTEM.LOGON_AUDIT_TRIGGER2 compile;

编译之后,一切正常,没有报错信息了。

RMAN> crosscheck archivelog all;
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=622 device type=DISK
specification does not match any archived log in the repository

RMAN> delete expired archivelog all;
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=622 device type=DISK
specification does not match any archived log in the repository

总结:

LOGON_AUDIT_TRIGGER2这个trigger应该是自定义的,看名字是用来做登陆审计,里面包含了表stats$user_log, 而这个表的sessionid 列值默认设置的比较小。

rman操作触发此trigger时,写入的session id值大于允许的列值导致错误。当表更改后,trigger需要重新编译一下生效。所以进行以下修改后,触发的审计trigger正常运行,Rman命令正常。 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24862754/viewspace-2133819/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24862754/viewspace-2133819/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值