`
java-mans
  • 浏览: 11422439 次
文章分类
社区版块
存档分类
最新评论

undo系列学习之读一致性(ORA-01555错误机制分析)

 
阅读更多

oracle在读的过程中,数据是静止的,没有脏读,也就是,未提交的永远都不会被读到。我们可以理解为,oracle在读的开始时,提前为他今后所要读的内容拍了一张”照片“,把所有内容全部定格在一个时间点上,作为接下来读的依据。oracle利用scn来实现这个理论,开始查询时,会确定一个select scn,这样就保证了事务槽里所有的scn都小于select scn。好比如,现在是12:21分,那么我之前所敲的字都在12:21分之前做的。

我们已经知道,undo段是循环使用,并且,oracle只会把inactive的事务给覆盖。若是一个长时间的查询需要读到被覆盖的块时,就会报ora-01555错误。借助v$undostat里面的字段ssolderrcnt来查询在每个10分钟,oracle内是否发生过01555错误。

下面是一张01555错误的图:

产生01555错误,原因有好多,这里列三个:

1)undo_retention不够大

2)undo空间压力大

3)sql性能差

下面我们来模拟01555错误。注意,这里要避免和30036错误相混淆。

会话1:

hr@ORCL> var i refcursor
hr@ORCL> exec open :i for select * from t;

PL/SQL procedure successfully completed.

hr@ORCL> print i;

        ID NAME
---------- ----------
         1 a
         2 b

hr@ORCL> exec open :i for select * from t;

PL/SQL procedure successfully completed.


会话2:

sys@ORCL> delete from hr.t;

3 rows deleted.

sys@ORCL> commit;

Commit complete.


会话1:

hr@ORCL> print i;

        ID NAME
---------- ----------
         1 a
         2 b

如果有数据,则证明查询是修改前的;如果没有数据,则证明查询是修改后的。但如果,此时undo里面没有数据,那就会报错。从查询输出,可知,查询是修改前的。

会话2:

sys@ORCL> create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/ORCL/datafile/undotbsthi.dbf' size 1m autoextend off;

Tablespace created.

sys@ORCL> alter system set undo_tablespace=undotbs2;

System altered.

sys@ORCL> show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS2


会话1:

hr@ORCL> select * from t;

no rows selected

hr@ORCL> insert into t values (1,'a');

1 row created.

hr@ORCL> insert into t values(2,'b');

1 row created.

hr@ORCL> insert into t values(3,'c');

1 row created.

hr@ORCL> select * from t;

        ID NAME
---------- ----------
         1 a
         2 b
         3 c

hr@ORCL> commit;

Commit complete.

hr@ORCL> exec open :i for select * from t;

PL/SQL procedure successfully completed.


会话2:

sys@ORCL> select a.spid "专用服务器进程",b.process "客户进程"
  from v$process a,v$session b
  where a.addr=b.paddr
  and b.sid=(select sid from v$mystat where rownum=1)  2    3    4  
  5  ;

专用服务器进 客户进程
------------ ------------
8427         8425

sys@ORCL> declare
i number :=0;
begin
loop
update hr.t set id=i;
i:=i+1;
if mod(i,200)=0 then commit;
end if;
end loop;
end; 


会话1:

hr@ORCL> print i;
ERROR:
ORA-01555: snapshot too old: rollback segment number 11 with name "_SYSSMU11$" too small


会话3:

[root@localhost ~]# kill -9 8427


小结:undo够不够,就看01555.

分享到:
评论

相关推荐

    [Oracle] 浅析令人抓狂的ORA-01555问题

    这个错误是由数据库的读一致性(Read consistency)引起的,当查询需要访问被修改的数据时,它会到undo里访问该数据的前镜像,如果该前镜像已被覆盖,查询语句就会返回ORA-01555的错误。 2. 导致ORA-01555错误的主要...

    Oracle11g体系结构深入剖析和运维管理(五)

    资源名称:Oracle 11g体系结构深入剖析和运维管理(五)资源目录:【】37_深入剖析事务槽及Oracle多种提交方式【】38_OracleIMU及RedoPrivateStrands技术【】39_读一致性(ORA-01555错误机制分析)及Undo表空间大小设置...

    深入解析OracleDBA入门进阶与诊断案例 3/4

     8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表...

    深入解析OracleDBA入门进阶与诊断案例 2/4

     8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表...

    深入解析OracleDBA入门进阶与诊断案例 4/4

     8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表...

    Oracle自学(学习)材料 (共18章 偏理论一点)

    目标 10-2 回滚段管理概述 10-3 回滚段 10-4 回滚段:用途 10-5 读一致性 10-6 回滚段的类型 10-7 自动回滚管理:概念 10-8 自动回滚管理:设置 10-9 自动回滚管理:初始化参数 10-10 自动回滚管理:UNDO 表空间 ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    9.6.2 ORA-01555: snapshot too old错误 323 9.7 小结 334 第10章 数据库表 335 10.1 表类型 335 10.2 术语 337 10.2.1 段 337 10.2.2 段空间管理 339 10.2.3 高水位线 340 10.2.4 freelists 342 10.2.5 ...

    Oracle9i的init.ora参数中文说明

    说明: 指定数据库的默认语言, 该语言将用于消息, 日期和月份名, AD, BC, AM 和 PM 的符号, 以及默认的排序机制。可支持的语言包括英语, 法语和日语等等。 值范围: 任何有效的语言名。 默认值: 根据操作系统而定 ...

    深入解析Oracle.DBA入门进阶与诊断案例

    8.13 ORA-01555成因与解决 382 8.14 Oracle 11g闪回数据归档 389 8.15 AUM下如何重建UNDO表空间 393 8.16 使用Flashback Query恢复误删除数据 394 8.17 诊断案例之一:释放过度扩展的UNDO空间 396 8.18 ...

    Oracle编程艺术

    3.1.2 遗留的init.ora 参数文件........................................................150 3.1.3 服务器参数文件..................................................................152 3.1.4 参数文件小结......

Global site tag (gtag.js) - Google Analytics