ORA-01555错误浅析(3)
【IT168 技术文档】
ORA-01555错误浅析(1) http://tech.it168.com/a2009/0512/275/000000275875.shtml
ORA-01555错误浅析(2) http://tech.it168.com/a2009/0519/368/000000368275.shtml
1555错误发生的情况
下面我们就模拟一下1555错误发生的情况。
测试环境
首先建立测试环境。由于我们只是要模拟1555错误的发生,所以需要建立一个小的回滚表空间,并且设置undo_retention时间为1(秒),以便回滚数据尽快被覆盖(呵呵,要防止1555错误发生,这就一定要避免的)。
CREATE UNDO TABLESPACE rbs_ts
DATAFILE 'rbs_ts2.dbf' SIZE 10M AUTOEXTEND OFF;
alter system set undo_retention=1 scope=spfile;
alter system set undo_management=auto scope=spfile;
alter system set undo_tablespace=rbs_ts scope=spfile;
startup force
alter tablespace rbs_ts online;
create table demo.t_dual as select * from dual;
insert into t_dual values(1);
commit;
一致性读导致的1555错误
开始读取表。
SQL> var cl refcursor
SQL> begin
2 open :cl for select * from demo.t_multiver;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>
更新表数据,产生回滚信息。
1 row updated.
SQL> commit;
Commit complete.
运行大批其他事务,充满所有回滚段,以致覆盖上面的回滚信息。回滚段可以通过dba_rollback_segs查看。
2 for i in 1..20000 loop
3 update demo.t_dual set dummy=1;
4 commit;
5 end loop;
6 end;
7
8 /
PL/SQL procedure successfully completed.
SQL> /
PL/SQL procedure successfully completed.
查询到更新过的数据记录,回滚信息已经被覆盖,所以报1555错误。
ERROR:
ORA-01555: snapshot too old: rollback segment number 18 with name "_SYSSMU18$"
too small
no rows selected
SQL>