[每日一题] 11gOCP 1z0-052 :2013-09-28 ORA-01555: snapshot too old......................C52
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12204587
重现ORA-01555快照过旧的错误。
[oracle@mydb admin]$ oerr ORA 01555 01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small" // *Cause: rollback records needed by a reader for consistent read are // overwritten by other writers // *Action: If in Automatic Undo Management mode, increase undo_retention // setting. Otherwise, use larger rollback segments
建undo表空间
gyj@OCM> create undo tablespace undotbs2 datafile'/u01/app/oracle/oradata/ocm/undotbs2.dbf' size 10M; Tablespace created. gyj@OCM> alter system set undo_tablespace=undotbs2; System altered. gyj@OCM> alter system set undo_retention=2 scope=both; System altered.
第1步、session1: 目标是让b表报快照过旧的报错
gyj@OCM> conn gyj/gyj
Connected.
gyj@OCM> create table a (id int,cc varchar2(10));
Table created.
gyj@OCM> insert into a values(1,'hello');
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> create table b(id int,cc varchar2(10));
Table created.
gyj@OCM> insert into b values(10,'AAAAAA');
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> select * from a;
ID CC
---------- ----------
1 hello
gyj@OCM> select * from b;
ID CC
---------- ----------
10 AAAAAA
gyj@OCM> var x refcursor;
gyj@OCM> exec open :x for select * fromb;
PL/SQL procedure successfully completed.
第2步、session2:修改b表,字段cc前镜像"OK"保存在UDNO段中
gyj@OCM> update b set cc='BBBBBB' where id= 10; 1 row updated. gyj@OCM> commit; Commit complete.
第3步、session 3:该条语句就是刷新缓存
sys@OCM> alter system flush buffer_cache; System altered.
第4步、再开3-5个会话:在A表上行大的事务,多运行几次以确保,回滚段被覆盖
gyj@OCM> begin 2 for i in 1..20000 loop 3 update a set cc='HELLOWWWW'; 4 commit; 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed.
第5步、session 1:在B表上执行查询(第一步的查询)
gyj@OCM> print :x ERROR: ORA-01555: snapshot too old: rollbacksegment number 21 with name "_SYSSMU21$" too small
ORA-01555快照过旧与Oracle的一致性读有关,一致性读的实现与UNDO有关。那什么是一致性读呢?
Oracle读一致性是指一个查询所获得的数据来自同一时间点。
gyj@OCM> create table gyj (id int,name varchar2(10));
Table created.
gyj@OCM> insert into gyj values(1,'GGGGGG');
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> select * from gyj;
ID NAME
---------- ----------
1 GGGGGG
gyj@OCM> var x refcursor
gyj@OCM> exec open :x for select * from gyj;
PL/SQL procedure successfully completed.
gyj@OCM> update gyj set name='YYYYYY' where id=1;
1 row updated.
gyj@OCM> commit;
Commit complete.
gyj@OCM> update gyj set name='JJJJJJ' where id=1;
1 row updated.
gyj@OCM> commit;
Commit complete.
gyj@OCM> print :x
ID NAME
---------- ----------
1 GGGGGG
而并不是
答案C不正确,与闪回归档日志无关。
答案D不正确,这个查询去UNDO表空间中去读前镜像的值,这个前镜像被覆盖了。
ORA-01555快照过旧解决办法:
(1) 加大UNDO表空间的大小。
(2) 减少查询条件范围。
QQ:252803295
DSI&Core Search Ⅱ 群:177089463(1000人技术群:未满)
DSI&Core Search Ⅲ 群:284596437(500人技术群:未满)
DSI&Core Search Ⅳ 群:192136702(500人技术群:未满)
DSI&Core Search Ⅴ 群:285030382(500人闲聊群:未满)
MAIL:
BLOG:
WEIBO:
ITPUB:
OCM: http://education.oracle.com/education/otn/YGuo.HTM
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。