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.
分享到:
相关推荐
这个错误是由数据库的读一致性(Read consistency)引起的,当查询需要访问被修改的数据时,它会到undo里访问该数据的前镜像,如果该前镜像已被覆盖,查询语句就会返回ORA-01555的错误。 2. 导致ORA-01555错误的主要...
资源名称:Oracle 11g体系结构深入剖析和运维管理(五)资源目录:【】37_深入剖析事务槽及Oracle多种提交方式【】38_OracleIMU及RedoPrivateStrands技术【】39_读一致性(ORA-01555错误机制分析)及Undo表空间大小设置...
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表...
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表...
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表...
目标 10-2 回滚段管理概述 10-3 回滚段 10-4 回滚段:用途 10-5 读一致性 10-6 回滚段的类型 10-7 自动回滚管理:概念 10-8 自动回滚管理:设置 10-9 自动回滚管理:初始化参数 10-10 自动回滚管理:UNDO 表空间 ...
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 ...
说明: 指定数据库的默认语言, 该语言将用于消息, 日期和月份名, AD, BC, AM 和 PM 的符号, 以及默认的排序机制。可支持的语言包括英语, 法语和日语等等。 值范围: 任何有效的语言名。 默认值: 根据操作系统而定 ...
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 ...
3.1.2 遗留的init.ora 参数文件........................................................150 3.1.3 服务器参数文件..................................................................152 3.1.4 参数文件小结......