重现ORA-01555 (snapshot too old)

[复制链接]
查看11 | 回复2 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
这个实验重现了ORA-01555 (snapshot too old)的错误。
环境:8i
建议:首先学习biti_rainy 的 关于回滚段的探讨
http://www.itpub.net/showthread. ... =%BB%D8%B9%F6%B6%CE
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
SQL> conn internal
Connected.
---回滚段usn,回滚段头class为11+2n,回滚段块class为12+2n,---
SQL>select class,count(*) from x$bh where class>10 group by class;
CLASS COUNT(*)
---------- ----------
11
1
12
2
13
1
14 14
15
1
16
1
17
1
18
1
19
1
20
1
21
1
CLASS COUNT(*)
---------- ----------
22
1
23
1
24
3
25
1
26
1
16 rows selected.
SQL> select segment_id,segment_name from dba_rollback_segs;
SEGMENT_ID SEGMENT_NAME
---------- ------------------------------
0 SYSTEM
1 RBS0
2 RBS1
3 RBS2
4 RBS3
5 RBS4
6 RBS5
7 RBS6
8 rows selected.
---指定这个transaction使用rollback segment rbs3---
SQL> set transaction use rollback segment rbs3;
Transaction set.
---打开一个游标,但是暂不获取数据---
SQL>variable x refcursor
SQL>begin
2 open :x for select * from t where rownum=1;
3end;
4/
PL/SQL procedure successfully completed.
---update游标中查询的第一条记录,并且commit---
SQL> update t set object_id=1 where OBJECT_ID=7781;
1 row updated.
SQL> commit;
Commit complete.
---同样指定使用rollback segment rbs3,进行大量的update操作,
使得上面update操作在回滚段中的前影被覆盖(因为回滚段是循环使用的)。---
SQL> begin
2for i in 1..1000 loop
3set transaction use rollback segment rbs3;
4update t set object_id=i where rownum print x
ERROR:
ORA-01555: snapshot too old: rollback segment number 4 with name "RBS3" too
small

no rows selected
SQL>select class,count(*) from x$bh where class>10 group by class;
CLASS COUNT(*)
---------- ----------
11
1
12
2
13
1
14 14
15
1
16
1
17
1
18
1
19
2
20511-- RBS3使用的块
21
1
CLASS COUNT(*)
---------- ----------
22
1
23
1
24
3
25
1
26
1
16 rows selected.
SQL>
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
9i 中回滚端的改进是引入了UNDO_RETENTION 参数,用来限定回滚段中数据在多长时间内不得被覆盖,以避免1555。
所以这个参数通常取决于系统中运行的大查询的时间。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行