已索引
该文章已被其它文章引用。

首先,新建一个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表空间不足) 报错。

-- By 许望(RHCA、OCM、VCP)
最后修改:2023 年 12 月 01 日 11 : 23 AM
如果觉得我的文章对你有用,请随意赞赏