这篇文章紧接着上一篇“ORA-01555错误总结(一)”。主要描写叙述延迟块清除导致的ORA-01555错误。

以下是一些简介(上一遍已经介绍过)

ORA-01555错误是一种在oracle数据库中很常见的错误。甚至也能够说是一个很经典的错误,仅仅是因为oracle的发展越来越自己主动化(UNDO自己主动管理+加强),这个错误已经越来越少见。可能许多使用10g的DBA都没有遇到过这个错误。
这个错误在9i之前的版本号(UNDO手工管理)出现的最多,也是最常见的,甚至能够说怎么样处理和避免ORA-01555 错误是令每个DBA曾头痛,可是又必须面对的问题。

从9i的undo自己主动管理,至如今的10g、11g中的undo auto
tuning,使得ORA-01555错误越来越少。可是这个错误仍然不可避免,特别是那些分析型的系统中(OLAP)。


错误原因(一般有两种)
  • SQL语句运行时。须要读取UNDO(前映像数据)来构造CR数据块,完毕一致性读取。

    可是在读取undo前映像数据时发现,undo信息已经被覆盖(undo空间循环使用),不能构造一致性读的CR块。抛出ORA-01555错误

  • SQL语句运行时。訪问到的数据块。须要进行延迟块清除。可是在进行延迟块清除时,不能确定这个数据块的事务提交时间与SQL运行開始时间的先后次序,从而抛出ORA-01555错误
备注:延迟块清除是指前一个事务完毕提交时(commit)。因为改动块已经刷新至磁盘等原因。未完毕块事务信息的清除(ILT。LB信息等等),在兴许的SQL语句訪问该块时,须要清除这些信息,这个动作即延迟块清除。

另外一种情况的解决方法(仅供參考)
  • 添加UNDO空间。延缓UNDO信息被覆盖。也能够理解为添加undo空间循环使用一次的时间,尽量避免延迟块清除时须要的undo信息被覆盖。
  • 优化抛出错误的SQL语句,降低SQL语句须要訪问的数据块,可能避免出现ORA-01555,可是这种方法治标不治本,不论什么兴许訪问该块的SQL。都会抛出ORA-01555错误。
  • 载入buffer cache。尽量使事务提交时,能够完毕fast commit(直接清理快上的事务信息)。这种方法基本也是过于理想,非常难在实际中发挥作用。

  • 缩减事务大小,也尽量使事务提交时。运行fast commit。因为须要改造业务逻辑,基本也不现实,非常难在实际中发挥作用。

  • 我们知道这类错误一般出如今OLAP类型的业务系统中。针对这样的情况。最有效的方法是收集可能出现延迟块清除并抛出ORA-01555错误的表,在业务逻辑中。完毕事务后,针对这些表马上进行一次全表扫描(清理块上的事务信息),避免兴许訪问清理时出现的ORA-01555错误。

    假设业务逻辑改动较困难,能够依据业务规则,指定一个定时针对这些表的全表扫面任务,来规避延迟块清除导致的ORA-01555错误

备注:针对第一情况的解决方法和演示样例请见我上一篇文章《ORA-01555错误总结(一)》。


注意事项
  • 全表查询中使用select count(*),避免使用select *,由于select count(*)的效率和速度远远高于select *;
  • 必须使用提示(full hint),避免使用索引高速扫面的运行计划来统计行数(select count(*))
  • 不能使用并行提示(parallel),由于在表上进行并行查询是,以DIRECT READ方式读取表时不会清理数据块上的事务信息
  • 11GR2中新特性,当表大小超过一定阀值时,使用direct path read取代db file scatter read扫描。必须避免这样的情况。

  • 假设表实在太大,全表扫描的时间过长,能够将表分段(依据dba_extends转化为rowid)。进行分段查询。
全表扫描语法
   select /*+ full(a) */ count(*) from scott.emp
a;
表分段语法(trunks变量表示将表分为几段,owner和table_name变量分别表示表对象的username和表名)(摘自老熊博客)

, oid1, fid1, bid1, ) rowid1,  

       dbms_rowid.rowid_create(, oid2, fid2, bid2, ) rowid2  

  from (select a.*, rownum rn  

          from (select chunk_no,  

                       min(oid1) oid1,  

                       max(oid2) oid2,  

                       min(fid1) fid1,  

                       max(fid2) fid2,  

                       min(bid1) bid1,  

                       max(bid2) bid2  

                  from (select chunk_no,  

                               FIRST_VALUE(data_object_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) oid1,  

                               LAST_VALUE(data_object_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) oid2,  

                               FIRST_VALUE(relative_fno) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid1,  

                               LAST_VALUE(relative_fno) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid2,  

                               FIRST_VALUE(block_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid1,  

                               LAST_VALUE(block_id ) OVER(PARTITION BY chunk_no ORDER BY data_object_id,
relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid2  

                          from (select data_object_id,  

                                       relative_fno,  

                                       block_id,  

                                       blocks,  

                                       ceil(sum2 / chunk_size) chunk_no  

                                  from (select /*+ rule */ b.data_object_id,
 

                                               a.relative_fno,  

                                               a.block_id,  

                                               a.blocks,  

                                               sum(a.blocks) over(order by b.data_object_id, a.relative_fno,
a.block_id) sum2,  

                                               ceil(sum(a.blocks)  

                                                    over() / &trunks) chunk_size  

                                          from dba_extents a, dba_objects b  

                                         where a.owner = b.owner  

                                           and a.segment_name = b.object_name  

                                           and nvl(a.partition_name, '-1') =  

                                               nvl(b.subobject_name, '-1')  

                                           and b.data_object_id is not null  

                                           and a.owner = upper('&owner')
 

                                           and a.segment_name = upper('&table_name'))))
 

                 group by chunk_no  

                 order by chunk_no) a);   

块延迟清除导致ORA-01555错误演示样例
(1)新建一个很小的undo表空间。并切换至改表空间,同一时候新建两个表dhtest1、dhtest2。

SQLcreate undo tablespace undo2 datafile '/u01/test/test/undo2.dbf' size 2m autoextend off;

Tablespace created.

SQLalter system set undo_tablespace='UNDO2';

System altered.

SQLcreate table dhtest1 as select object_id,object_name from dba_objects;

Table created.

SQLcreate table dhtest2 as select owner,table_name from dba_tables;

Table created.

SQLSELECT

    dbms_rowid.rowid_object(rowid) object_id,

     dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

    dbms_rowid.rowid_block_number(rowid) BLOCKNO,

     dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,OWNER,TABLE_NAME

     FROM dhtest2 WHERE table_name='DHTEST1';



 OBJECT_ID    REL_FNO    BLOCKNO      ROWNO ROWID              OWNER                          TABLE_NAME

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

                                 AAAR7XAAEAAAAO9ABT DH                             DHTEST1
(2)開始測试,session A 更新表dhtest2上rowid='AAAR7XAAEAAAAO9ABT'的数据行

update dhtest2 set table_name='yyyyyy' where rowid='AAAR7XAAEAAAAO9ABT';

 row updated.
(3)dump 被更新数据行的数据块(datafile 4,block 957)

SQL> oradebug setmypid;

Statement processed.

SQL> oradebug tracefile_name;

/u01/oracle/diag/rdbms/test/test/trace/test_ora_26266.trc

SQLalter system flush buffer_cache;   --刷新内存,兴许提交不会情况数据块中的事务信息

System altered.

 block ;

System altered.

Block header dump:  0x010003bd

 Object id on Block? Y

 seg  flg: E  typ:  - DATA

     brn:   bdba: 0x10003b0 ver: 0x01 opc: 

     inc:   exflg: 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00    scn 0x0000.000fbdc3

0x02   0x0016..  0x018000b4.0000.1b  ----  
   fsc 0x0001.00000000    ---lck为1 表示这个事务锁定了该数据块中的1行数据

0x03   0x0000.000.00000000  0x00000000.0000.00    fsc 0x0000.00000000

bdba: 0x010003bd

data_block_dump,data header at 0x2b2cf3514a7c

.....省略一部分.......

tab , , @0x4d1

tl:  fb: --H-FL-- lb: 0x2  cc: 2
            --lb为2,表示这一行被相应itl中的第二个事务槽中的事务更新。

col  : [ ]   48                     

col  : [ ]       79
           --转换数据能够发现为 yyyyy 。与我们更新的一致

....后面省略............
(4)查询事务的一些基本信息,比如usn,xidslot,xidsqn等等



SQL> col start_scnw format a20

SQL> col start_scnb format a20

SQLselect xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx')
start_scnw,  

    to_char(start_scnb,,)
start_scn 

    from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN     UBABLK     UBAFIL     UBAREC START_SCNW           START_SCNB            START_SCN

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

                                                        
                      fbdcc               

;

NAME

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

_SYSSMU22$

,),'xxxxxxxxxxx'))
undo_file#,

           dbms_utility.data_block_address_block(to_number(substr(uba,,),'xxxxxxxxxxx')) blockno#,

           to_number(substr(uba,,),'xxxxxxxxx') undo_seq,

           to_number(substr(uba,,),'xxxxxxxxx') undo_record

      from (select '0x018000b4.0000.1b' uba from dual);

UNDO_FILE#   BLOCKNO#   UNDO_SEQ UNDO_RECORD

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

                                                           
(5)依据步骤(4)查询的基本信息。dump事务的undo段头和undo块

SQLalter system dump undo header '_SYSSMU22$';

System altered.

 block ;

System altered.

undo header trace 文件:

TRN CTL:: seq: 0x0000 chd: 0x0014 ctl: 0x0012 inc: 0x00000000 nfb: 0x0002

            mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt:  (0x7ffffffe)

            uba: 0x018000b4.0000.1b scn: 0x0000.00000000    --uba相应事务表中最早使用的undo块

Version: 0x01

  FREE BLOCK POOL::

    uba: 0x00000000.0000.1a ext: 0x0  spc: 0x1292  

    uba: 0x018000b3.0000. ext: 0x0  spc: 0x1c52  

    uba: 0x018000b2.0000. ext: 0x0  spc: 0x124e  

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

  TRN TBL::

 

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt

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

 ...........省略一部分...............

   0x0f        0x00  0x0002  0x0010  0x0000.000fbe30  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x10        0x00  0x0002  0x0011  0x0000.000fbe3f  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x11        0x00  0x0002  0x0012  0x0000.000fbe45  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x12        0x00  0x0002  0xffff  0x0000.000fbe5e  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x13       0x80  0x0002  0x0000  0x0000.000fbdcc  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  0 

   0x14        0x00  0x0001  0x0015  0x0000.00000000  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  

   state为10表示该事物为活动状态

............后面省略.....................

undo block trace 文件:

UNDO BLK:  

xid: 0x0016..  seq: 0x0   cnt: 0x1b  irb: 0x1b icl: 0x0   flg: 0x0000  

 

 Rec Offset      Rec Offset      Rec Offset      Rec Offset  
   Rec Offset

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

0x01 0x1f60     0x02 0x1efc     0x03 0x1eac     0x04 0x1e5c     0x05 0x1e28     

0x06 0x1de0     0x07 0x1d80     0x08 0x1cc0     0x09 0x1c70     0x0a 0x1bec     

0x0b 0x1b68     0x0c 0x1ae0     0x0d 0x1a80     0x0e 0x19f8     0x0f 0x1998     

0x10 0x18ec     0x11 0x1840     0x12 0x1790     0x13 0x1724     0x14 0x16b8     

0x15 0x1604     0x16 0x1554     0x17 0x14a4     0x18 0x13f4     0x19 0x1344     

0x1a 0x12d8     0x1b 0x124c     

.................省略一部分undo record................

*-----------------------------

(0x00011ed7)  objd:   tblspc: (0x00000004)
 --------0xbl undo record中保存的前映像数据与我们知道的一致,为DHTEST1

 (   rci 0x00   

Undo type:  Regular undo    Begin trans    Last buffer split:  No 

Temp Object:  No 

Tablespace Undo:  No 

rdba: 0x00000000Ext idx: 

flg2: 

*-----------------------------

uba: 0x018000b4.0000. ctl max scn: 0x0000.00000000 prv tx scn: 0x0000.00000000

txn 

 prev brb:  prev bcl: 

KDO undo record:

KTB Redo 

op: 0x03  ver: 0x01  

compat  (post) padding: 

op: Z

KDO Op code: URP row dependencies Disabled

  xtype: XA flags: 0x00000000  bdba: 0x010003bd  hdba: 0x010003b2

itli:   ispac:   maxfr: 

tabn:  slot: (0x53) flag: 0x2c  ckix: 

ncol:  nnew:  

col  : [ ]        

SQLSELECT utl_raw.cast_to_varchar2(replace('44 48 54 45 53 54 31','
')) value FROM dual;

VALUE

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

DHTEST1
(6)提交事务,因为内存已经刷新。因此数据块上的事务不应该被清除。dump数据块查看,与我们期望的一致(事务未被清除)

SQLcommit;

Commit complete.

DUMP block trace 文件:

Block header dump:  0x010003bd

 Object id on Block? Y

 seg  flg: E  typ:  - DATA

     brn:   bdba: 0x10003b0 ver: 0x01 opc: 

     inc:   exflg: 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0xffff.000.00000000  0x00000000.0000.00    scn 0x0000.000fbdc3

0x02   0x0016..  0x018000b4.0000.1b  ----  
   fsc 0x0001.00000000  
 --事务信息确实没有被清除!

0x03   0x0000.000.00000000  0x00000000.0000.00    fsc 0x0000.00000000

bdba: 0x010003bd

DUMP undo header 文件:

  TRN CTL:: seq: 0x0000 chd: 0x0014 ctl: 0x0013 inc: 0x00000000 nfb: 0x0003

            mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt:  (0x7ffffffe)

            uba: 0x018000b4.0000.1b scn: 0x0000.00000000

Version: 0x01

  FREE BLOCK POOL::

    uba: 0x018000b4.0000.1b ext: 0x0  spc: 0x1204  

    uba: 0x018000b3.0000. ext: 0x0  spc: 0x1c52  

    uba: 0x018000b2.0000. ext: 0x0  spc: 0x124e  

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

  TRN TBL::

 

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt

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

 ...........省略一部分...............

   0x11        0x00  0x0002  0x0012  0x0000.000fbe45  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x12        0x00  0x0002  0x0013  0x0000.000fbe5e  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  

   0x13        0x00  0x0002  0xffff  0x0000.000fc00b  0x018000b4  0x0000.000.00000000  0x00000001   0x00000000  1399885369 

   0x14        0x00  0x0001  0x0015  0x0000.00000000  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  

   0x15        0x00  0x0001  0x0016  0x0000.00000000  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  

   0x16        0x00  0x0001  0x0017  0x0000.00000000  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  

   0x17        0x00  0x0001  0x0018  0x0000.00000000  0x00000000  0x0000.000.00000000  0x00000000   0x00000000  

............后面省略.....................

undo事务表上的state已经从10变为9。表示事务已经提交
(7)在session B中发起游标查询,查询rowid='AAAR7XAAEAAAAO9ABT'的这一行
varible v_cur1 refcursor
begin
  open :v_cur1 for select * from dhtest2where rowid='AAAR7XAAEAAAAO9ABT';
end;
/
PL/SQL procedure successfully completed.
(8)在session C中发起大量事务,将回滚段信息覆盖,而且确保事务表也已经被覆盖多次!

;

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQLcommit;

Commit complete.

;

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /

 rows updated.

SQL> /



*

ERROR :

ORA: unable  in undo
tablespace 'UNDO2'

SQLcommit

    ;

Commit complete.

SQL

SQLbegin

      .. loop

       ;

    commit;

    end loop;

    end;

    /

PL/SQL procedure successfully completed.
(9)dump 原先的回滚段头和undo块,发现信息已经被覆盖

SQLalter system dump undo header '_SYSSMU22$';

System altered.

 block ;

System altered.
undo header trace 文件:

TRN CTL:: seq: 0x07a9 chd: 0x0020 ctl: 0x001f inc: 0x00000000 nfb: 0x0001    次。因此事务表已经被覆盖多次

            mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt:  (0x7ffffffe)

            uba: 0x018000bc. scn: 0x0000.00150d58     ------这个SCN是事务表中近期被重用的事务表记录之前的事务的提交SCN,能够理解为已经被覆盖的事务记录中拥有最大的SCN值(事务表记录重用是依照提交SCN从小到大的顺序重用的)

Version: 0x01 

  FREE BLOCK POOL::

    uba: 0x018000be. ext: 0x1  spc: 0xf12   

    uba: 0x00000000. ext: 0x1  spc: 0xa84   

    uba: 0x00000000.0000. ext: 0x0  spc: 0x124e  

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

    uba: 0x00000000.0000.00 ext: 0x0  spc: 0x0     

  TRN TBL::

  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt

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

   0x00        0x00  0x014b  0x0002  0x0000.

   0x01        0x00  0x014b  0x000b  0x0000.

   0x02        0x00  0x014b  0x0003  0x0000.

   0x03        0x00  0x014b  0x0005  0x0000.

   0x04        0x00  0x014b  0x0006  0x0000.

   0x05        0x00  0x014b  0x0004  0x0000.

   0x06        0x00  0x014b  0x0007  0x0000.

   0x07        0x00  0x014b  0x0008  0x0000.

   0x08        0x00  0x014b  0x0009  0x0000.

   0x09        0x00  0x014b  0x000a  0x0000.

   0x0a        0x00  0x014b  0x0001  0x0000.

   0x0b        0x00  0x014b  0x000c  0x0000.

   0x0c        0x00  0x014b  0x000d  0x0000.

   0x0d        0x00  0x014b  0x000e  0x0000.

   0x0e        0x00  0x014b  0x000f  0x0000.

   0x0f        0x00  0x014b  0x0010  0x0000.

   0x10        0x00  0x014b  0x0011  0x0000.

   0x11        0x00  0x014b  0x0012  0x0000.

   0x12        0x00  0x014b  0x0013  0x0000.

   0x13        0x00  0x014b  0x0014  0x0000.

   0x14        0x00  0x014b  0x0015  0x0000.

   0x15        0x00  0x014b  0x0016  0x0000.  0x018000bf  0x0000.000.00000000  0x00000003   0x00000000  

   0x16        0x00  0x014b  0x0017  0x0000.

   0x17        0x00  0x014b  0x0018  0x0000.  0x018000b2  0x0000.000.00000000  0x00000001   0x00000000  

   0x18        0x00  0x014b  0x0019  0x0000.

   0x19        0x00  0x014b  0x001a  0x0000.

   0x1a        0x00  0x014b  0x001b  0x0000.

   0x1b        0x00  0x014b  0x001c  0x0000.  0x018000b9  0x0000.000.00000000  0x00000003   0x00000000  

   0x1c        0x00  0x014b  0x001d  0x0000.

   0x1d        0x00  0x014b  0x001e  0x0000.  0x018000bb  0x0000.000.00000000  0x00000003   0x00000000  

   0x1e        0x00  0x014b  0x001f  0x0000.  0x018000bc  0x0000.000.00000000  0x00000002   0x00000000  

   0x1f        0x00  0x014b  0xffff  0x0000.  0x018000be  0x0000.000.00000000  0x00000003   0x00000000  

   0x20        0x00  0x014a  0x0021  0x0000.

   0x21        0x00  0x014a  0x0000  0x0000.

undo block trace文件:

UNDO BLK:  

xid: 0x0016.  seq: 0x76c cnt: 0x2   irb: 0x2   icl: 0x0   flg: 0x0000

 Rec Offset      Rec Offset      Rec Offset      Rec Offset  
   Rec Offset

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

0x01 0x1ba0     0x02 0x17bc     

*-----------------------------

(0x00011ed5)  objd:   tblspc: (0x00000004)

 (   rci 0x00   

Undo type:  Regular undo   Last buffer split:  No 

Temp Object:  No 

Tablespace Undo:  No 

rdba: 0x018000b3

*-----------------------------

KDO undo record:

KTB Redo 

op: 0x02  ver: 0x01  

compat  (post) padding: 

op: 

 rows

tabn:  slot: (0x3c) flag: 0x2c  ckix: 

ncol:  nnew:  

KDO Op code:   row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

vect 

col  : []             

tabn:  slot: (0x3d) flag: 0x2c  ckix: 

ncol:  nnew:  

KDO Op code:   row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

vect 

.................省略这一undo record中的一部分

col  : []             

tabn:  slot: (0x4f) flag: 0x2c  ckix: 

ncol:  nnew:  

KDO Op code:   row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

vect 

col  : []             

*-----------------------------

(0x00011ed5)  objd:   tblspc: (0x00000004)

 (   rci 0x01   

Undo type:  Regular undo   Last buffer split:  No 

Temp Object:  No 

Tablespace Undo:  No 

rdba: 0x00000000

*-----------------------------

KDO undo record:

KTB Redo 

op: 0x02  ver: 0x01  

compat  (post) padding: 

op: 

 rows

tabn:  slot: (0x50) flag: 0x2c  ckix: 

ncol:  nnew:  

KDO Op code:   row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

vect 

.....................省略这一undo record中的一部分

col  : []             

tabn:  slot: (0x61) flag: 0x2c  ckix: 

ncol:  nnew:  

KDO Op code:   row dependencies Disabled

  xtype: XAxtype KDO_KDOM2 flags: 0x00000080  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

vect 

col  : []             



 file#:  minblk  maxblk 

能够看到。这个undo block中仅仅有两个undo record。无法再找到延迟事务相应的undo record 即1b。

(10)依据步骤(9)中undo header trace中的uba信息尝试进行回滚

dump uba :uba: 0x018000bc.
alter system dump datafile 6 block 188;
UNDO BLK:  

xid: 0x0016.01f.0000014b  seq: 0x7a9 cnt: 0x2b  irb: 0x2b  icl: 0x0   flg: 0x0000

 Rec Offset      Rec Offset      Rec Offset      Rec Offset  
   Rec Offset

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

0x01 0x1fa4     0x02 0x1f60     0x03 0x1f1c     0x04 0x1ed8     0x05 0x1e94     

0x06 0x1e50     0x07 0x1e0c     0x08 0x1dc8     0x09 0x1d84     0x0a 0x1d40     

0x0b 0x1cfc     0x0c 0x1cb8     0x0d 0x1c74     0x0e 0x1c30     0x0f 0x1bec     

0x10 0x1ba8     0x11 0x1b64     0x12 0x1b20     0x13 0x1adc     0x14 0x1a98     

0x15 0x1a54     0x16 0x1a10     0x17 0x19cc     0x18 0x1988     0x19 0x1944     

0x1a 0x1900     0x1b 0x18bc     0x1c 0x1878     0x1d 0x1834     0x1e 0x13ec     

0x1f 0x0fa4     0x20 0x0b5c     0x21 0x0714     0x22 0x0330     0x23 0x02a8     

0x24 0x0264     0x25 0x0220     0x26 0x01dc     0x27 0x0198     0x28 0x0154     

0x29 0x0110     0x2a 0x00cc     0x2b 0x0088     

*-----------------------------

(0x00011ed5)  objd:   tblspc: (0x00000004)

 (   rci 0x00   

Undo type:  Regular undo   Last buffer split:  No 

Temp Object:  No 

Tablespace Undo:  No 

rdba: 0x018000bb

(0x00011ed5)  objd:   tblspc: (0x00000004)

 (   rci 0x00   

Undo type:  Regular undo    Begin trans    Last buffer split:  No 

Temp Object:  No 

Tablespace Undo:  No 

rdba: 0x00000000Ext idx: 

flg2: 

*-----------------------------

uba: 0x018000bb. ctl max scn: 0x0000.00150d48 prv tx scn: 0x0000.00150d58

txn  logon 

 prev brb:  prev bcl: 

KDO undo record:

KTB Redo 

op: 0x04  ver: 0x01  

compat  (post) padding: 1 

op: L  itl: xid:  0x0019.01f.0000014b uba: 0x018000eb.07ab.04  
  ---又能够依据这个uba尝试回滚。一步一步查看。能够发现无法回滚到我们游标查询的SCN。因此能够预见游标查询会因为延迟块清除而抛出ORA-01555错误

                      flg:      scn: 0x0000.

KDO Op code: LKR row dependencies Disabled

  xtype: XA flags: 0x00000000  bdba: 0x010002ab  hdba: 0x010002aa

itli:   ispac:   maxfr: 

tabn:  slot:  
(11)SESSION B发起游标查询,与我们预期一致,抛出ORA-01555错误!

SQL> print :cur1

ERROR:

ORA: snapshot too  with name "_SYSSMU22$"

too small

备注:此处游标查询时能够设置逻辑读跟踪,或者10046+set db_file_multiblock_read_count=1来跟踪延迟块清除时详细訪问的undo块,可是因为实验时出现了些许问题,没有及时跟踪下来。


ORA-01555错误总结(二)的更多相关文章

  1. Tomcat运行错误示例二

    Tomcat运行错误示例二 当遇到这种错误时,一般是构建路径的问题,按步骤来就好.如图: 点击---->库---->Add Library---->下一步---->选择tomc ...

  2. ORA 00972 错误处理

    Oracle 11G SQL 写好的脚本执行后报错:ORA 00972 标识符过长 可能的原因一: select 语句中的字段别名太长,中文字符别名最长为10个汉字,简化别名名称,问题得到解决. 可能 ...

  3. Android编程容易犯的错误之二

    11.不要太相信工具,比如Eclipse里面的断点遇到多线程什么,经常不起作用/走不到,还有就是如果语句为空的也不会走,这时候别太早下结论断点地方出错了, 所以每个工程都应该有日志的开关,通过查看日志 ...

  4. ios block常见的错误(二)——循环引用

    这篇博文继续block的常见错误——循环引用. 循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用. 读者请阅读示例代码1,并思考示例代码1所创建的对象能否被正常销毁 ...

  5. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径

    REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...

  6. navicat cannot load oci dll||oracle 改字符集为GBK后 navicat 连不上||Ora-28547 ora net错误

    此段适用于 解决 navicat cannot load oci dll 环境 Navicat Premium  和 oracle 原因,navicat 32 和64 都只支持 32位的oci.dll ...

  7. Spring+dubbo错误(二)

    ERROR [TestContextManager.java:231] Caught exception while allowing TestExecutionListener [org.sprin ...

  8. klee错误汇报二:KLEE的optimize选项的一个困惑

    问题已经提交github:https://github.com/klee/klee/issues/650 在一个对命令行参数进行建模的符号执行过程中,添加optimize选项与不添加optimize选 ...

  9. 关于oracle 11g导出数据时 报 ORA 1455错误的处理

    因为导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先:  查看:     SQL>show parameter deferred_segment_creation;  假设为T ...

  10. plsql 连接oralce数据库,报ora 12557 tns 协议适配器不可加载错误

    使用plsql 连接oracle 数据库报ora 12557 错误: 解决方案: 1:首先确保服务中的service以及监听器都开启 2:F:\app\Administrator\product\11 ...

随机推荐

  1. java中的json使用

    import org.json.simple.JSONArray;import org.json.simple.JSONObject; /** * 使用的是json-lib-2.4.jar * @au ...

  2. 查看linux磁盘文件系统类型

    1.查看已经挂载了的磁盘的文件系统信息. [root@python2 ~]# df -hT 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/cl_python2-root x ...

  3. pandas 1 基本介绍

    import numpy as np import pandas as pd pd.Series() 构造数据 s = pd.Series([1, 3, 5, np.nan, 44, 1]) prin ...

  4. dos2unix和unix2dos命令使用【转】

    dos2unix, unix2dos 用来实现 DOS <=> UNIX text file 转换 aptitude install sysutils 行末: DOS 格式 0d 0a U ...

  5. unity3D常见问题

    总结自己在学习中遇到的问题. 记录问题,帮助他人,有什么不正确的地方欢迎指正 没有发生碰撞 两个物体(Plane和Cube)都加入了collider,当中一个加入了rigidbody,应该会产生碰撞, ...

  6. Qt 5.3 下OpenCV 2.4.11 开发(5)最高效的像素引用

    OpenCV 提供一个函数 getTickCount() ,能够用来測量一段代码的执行时间.另一个函数 getTickFrequency() 用来返回每秒内的时钟周期.代码操作例如以下: double ...

  7. 使用Qt.labs.settings来存储应用的设置

    我在曾经的文章中,讲述了怎样使用U1db及SQLite offline storage API来存储应用的一些状态.在这篇文章中,我将介绍怎样使用Qt.labs.settings来存储应用的状态.更加 ...

  8. 又见关系并查集 以POJ 1182 食物链为例

    简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u.v不在一个集合内,则显然此条语句会合法(暂且忽略后两条.下同). 那么将f ...

  9. 【BZOJ 1660】 [Usaco2006 Nov]Bad Hair Day 乱发节

    1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 678  Solved: 32 ...

  10. JavaScript加密解密7种方法

    注:本文纯转贴,供学习使用 本文一共介绍了七种javascript加密方法: 在做网页时(其实是网页木马呵呵),最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的javascript代码常常被别人轻易 ...