重现ORA-01555错误

简介: 非常经典的一个一致性快照过旧的错误,Oracle面试必读。

实验步骤如下:
create undo tablespace undotbs2 datafile '/u01/app/oracle/oradata/ocp/undotbs2.dbf' size 10M;
alter system set undo_tablespace=undotbs2;
alter system set undo_retention=2 scope=both;

第1步、session1: 目标是让b表报快照过旧的报错
conn gyj/gyj
create table a (id int,cc varchar2(10));
insert into a values(1,'hello');
commit;
create table b(id int,cc varchar2(10));
insert into b values(10,'AAAAAA');
commit;
select * from a;
select * from b;
var x refcursor;
exec open :x for select * from b;

第2步、session2:修改b表,字段cc前镜像"OK"保存在UDNO段中
update b set cc='BBBBBB' where id= 10;
commit;

第3步、session 3:该条语句就是刷新缓存
conn / as sysdba
SQL> alter session set events = 'immediate trace name flush_cache'; --9i提供强制刷缓存
(alter system flush buffer_cache;--10g提供的一种刷缓存方法)

第4步、 session2: 在A表上行大的事务,多运行几次以确保,回滚段被覆盖
begin
for i in 1..20000 loop
update a set cc='HELLOWWWW';
commit;
end loop;
end;
/

第5步、session 1:在B表上执行查询(第一步的查询)
SQL> print :x
ERROR:
ORA-01555: snapshot too old: rollback segment number 21 with name "_SYSSMU21$" too small

相关文章
|
Oracle 关系型数据库 数据库
|
SQL 监控 Oracle
ORA-600(2662)错误的重现和解决(一)
前两天同事在测试DATA GUARD的时候将主库的ONLINE日志意外覆盖,造成数据库无法打开,采用隐含参数的方法打开又碰到ORA-600错误,最后采用设置EVENTS的方式解决。
1291 0
|
SQL 监控 Oracle
ORA-600(2662)错误的重现和解决(二)
前两天同事在测试DATA GUARD的时候将主库的ONLINE日志意外覆盖,造成数据库无法打开,采用隐含参数的方法打开又碰到ORA-600错误,最后采用设置EVENTS的方式解决。
1324 0
|
Oracle 关系型数据库 数据库
oerr错误查询工作的使用与ora-56729错误的处理
        oerr是oracle数据库中非常重要的错误查询工具,在实际工作和问题处理中,熟练使用oerr错误查询工具对oracle问题的定位和解决,有非常重要的帮助作用。
1036 0