已索引
该文章已被其它文章引用。
首先,新建一个undo表空间,小一些,8M(不要开自动扩展),将使用的undo表空间改为新建的表空间。
create undo tablespace undotbs3 datafile '/oradata/undotbs03.dbf' size 8m autoextend off
查看现在表中的数据:
SQL> select * from t;
ID NAME
---------- --------------------
1 a
在A会话中写一个查询,打开游标但先不输出游标:
SQL> variable i refcursor;
SQL> exec open :i for select * from t;
PL/SQL 过程已成功完成。
在B会话中执行下面的循环覆盖掉UNDO中的数据(这个循环是一个死循环,且100次提交一下)。
declare
i number :=0;
begin
loop
update t set name=i ;
i:=i+1;
if mod(i,100)=0 then
commit;
end if;
end loop;
end;
/
稍等一会后,在A会话中输出游标
SQL> print i;
ERROR:
ORA-01555: snapshot too old: rollback segment number 30 with name "_SYSSMU30_2882170007$" too small
no rows selected
在 alert 日志中也会看到相关的报错:
Mon Nov 20 15:27:41 2023
ORA-01555 caused by SQL statement below (SQL ID: 6k1fc899x4ud2, Query Duration=225 sec, SCN: 0x0000.00172457):
SELECT * FROM T
注意:在该日志周围,并未出现 ORA-30036(UNDO表空间不足) 报错。