模拟ora-01555错误并解决
Session 1
SQL> variable c refcursor;
SQL> select * from t;
ID NAME
---------- --------------------
1 a
2 b
SQL> exec open :c for select * from t;
PL/SQL 过程已成功完成。
Session2
SQL>create undo tablespace undotbs2 datafile ' F:\oracle\product\10.2.0\oradata\zxntal\undotbs2.dbf ' size 1m;
表空间已创建。
注:如果有几个undo表空间也可以进行切换,并缩小大小,禁止表空间的自动扩展
如:alter database datafile 7 resize 1M;
Alter database datafile ’ F:\oracle\product\10.2.0\oradata\zxntal\undotbs2.dbf’ autoextend off;
SQL>alter system set undo_tablespace=undotbs2;
系统已更改。
SQL> declare
2 begin
3 fori in 1..10000 loop
4 update t set id=i;
5 commit;
6 endloop;
7 end;
8 /
PL/SQL过程已成功完成。
Session1
SQL>print c;
ERROR:
ORA-01555:快照过旧:回退段号13 (名称为"_SYSSMU13$") 过小
解决办法:1,注意自己的应用程序,为什么会查询老的数据
2,使undo表空间自动扩展
3,加上guarantee参数,强制保证数据能在undo中保存undo_retention的时间
第一种:强制guarantee参数
Session1
SQL>exec open :c for select * from t;
PL/SQL过程已成功完成。
Session2
SQL>alter tablespace undotbs2 retention guarantee;
表空间已更改。
SQL>declare
2 begin
3 fori in 1..10000 loop
4 update t set id=i;
5 commit;
6 endloop;
7 end;
8 /
declare
*
第1 行出现错误:
ORA-30036:无法按8 扩展段(在还原表空间 'UNDOTBS2' 中)
ORA-06512:在line 4
第二种:使表空间自动扩展autoextend on
Session1
SQL>alter database datafile 7 autoextend on;
数据库已更改。
SQL>exec open :c for select * from t;
PL/SQL过程已成功完成。
Session2
SQL> declare
2 begin
3 fori in 1..10000 loop
4 update t set id=i;
5 commit;
6 endloop;
7 end;
8 /
PL/SQL过程已成功完成。
Session1
SQL>print c;
ID NAME
------------------------------
10000 a
10000 b