Oracle执行sql报错的日志,案例:Oracle报错ORA-01555 caused by SQL statement below

天萃荷净

开发DBA反映,在执行SQL语句时,过一段时间报错ORA-01555 caused by SQL statement below,分析原因为SQL语句执行时间超过undo保留时间

1.alert日志文件发现ORA-01555错误

Mon Dec 26 10:08:22 2011

ORA-01555 caused by SQL statement below (Query Duration=49146 sec, SCN: 0x0b4b.17f5ae42):

Mon Dec 26 10:08:22 2011

SELECT COMPANY_ID,

COMPANY_MOBILE,

TO_CHAR(NVL(REG_DATE, SYSDATE - 100), 'yyyymmddhh24miss'),

BAK_FIELD2

FROM TAB_XN_COMPANY

WHERE (COMPANY_STATUS = 1 OR

(COMPANY_STATUS = 3 AND

NVL(UNREG_DATE, SYSDATE + 100) >=

TO_DATE('20111226094500', 'yyyymmddhh24miss')))

AND NVL(REG_DATE, SYSDATE - 100) <=

TO_DATE('20111226095959', 'yyyymmddhh24miss')

AND PAY_TYPE > 0

2.查询oracle数据库状态

[oracle@ora02 ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Jan 4 10:48:17 2012

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.4.0 - Production

SQL> show parameter undo;

NAME TYPE VALUE

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

undo_management string AUTO

undo_retention integer 10800

undo_suppress_errors boolean FALSE

undo_tablespace string UNDOTBS1

SQL> select sum(maxbytes)/1024/1024/1024,

2 SUM(USER_BYTES)/1024/1024/1024 FROM dba_data_files where tablespace_NAME='UNDOTBS1';

SUM(MAXBYTES)/1024/1024/1024 SUM(USER_BYTES)/1024/1024/1024

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

61.9999847 32.6834106

SQL> SELECT DISTINCT STATUS "状态",

2 COUNT(*) "EXTENT数量",

3 SUM(BYTES) / 1024 / 1024 / 1024 "UNDO大小"

4 FROM DBA_UNDO_EXTENTS

5 GROUP BY STATUS;

状态 EXTENT数量 UNDO大小

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

ACTIVE 1 .000976563

EXPIRED 2549 31.2333298

UNEXPIRED 3 .000175476

通过undo_retention保留时间为10800秒,而该sql执行了49146秒,在这49146秒钟,TAB_XN_COMPANY表中的数据被修改,而且被修改的undo数据在10800秒后被覆盖导致,导致原查询语句不能获取到scn小于或者等于查询时候的数据块内容(在undo中),所以出现ORA-01555。从这里也可以看出来,在undo空间还剩余的情况下,如果超过了undo_retention限制,undo内容还是有可能被覆盖,而不是使用未使用的undo

3.案例分析ORA-1555原因

The ORA-1555 errors can happen when a query is unable to access enough undo to build a copy of the data at the time the query started. Committed “versions” of blocks are maintained along with newer uncommitted “versions” of those blocks so that queries can access data as it existed in the database at the time of the query. These are referred to as “consistent read” blocks and are maintained using Oracle undo management.

就是一个查询要访问某个数据块,而这个数据块在这个查询执行过程中修改过,那么该查询需要查询undo中数据块,而undo中该数据块已经不存在,从而出现ORA-1555

4.ORA-1555错误解决方法

Case 1 – Rollback Overwritten

1.缩短sql运行时间

2.增加undo_retention,这个同时需要考虑undo空间大小

3.减少commit(rollback)次数

4.在一条sql中尽量使数据块访问一次

4.1)Using a full table scan rather than an index lookup

4.2)Introducing a dummy sort so that we retrieve all the data, sort it and then sequentially visit these data blocks.

Case 2 – Rollback Transaction Slot Overwritten

这种问题,主要是延迟块清理导致,一般建议在进行大批量的dml操作后,使用全表(全index)扫描执行一遍,或者收集全部统计信息

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之案例:Oracle报错ORA-01555 caused by SQL statement below

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值