如何使用undo_retention参数与UNDO表空间GUARANTEE功能避免ORA-01555错误,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
ORA-01555便是著名的snapshot too old(快照太旧)问题,在Oracle早期版本中这个报错一度成为Oracle最为棘手的问题。每一名开发人员或者DBA都不愿意看到这样的报错。
导致ORA-01555错误的最常见原因是当一个查询需要使用已被覆盖的回滚段中的前映像构造一致性读时。那么我们有没有办法可以保证UNDO表空间在我们制定的时间内保留的数据不被覆写呢?答案是肯定的,随着Oracle版本的升级和功能完善,在Oracle 10g版本中UNDO表空间提供了GUARANTEE功能。此功能便能保证我们的UNDO数据不会被轻易的覆写。体验一下这个功能。
1.创建UNDO表空间UNDOTBS_GUARANTEE
注意,我们这里未设置其为自动扩展。
sys@ora10g> create undo tablespace UNDOTBS_GUARANTEE datafile '/oracle/ora10gR2/oradata/ora10g/undotbs_guarantee.dbf' size 5m;
Tablespace created.
2.启用UNDO表空间的GUARANTEE功能
sys@ora10g> alter tablespace UNDOTBS_GUARANTEE retention guarantee;
Tablespace altered.
3.调整与UNDO表空间相关的参数
1)查询当前数据库中有关UNDO相关的信息
sys@ora10g> show parameter undo
NAME TYPE VALUE
------------------ -------------------- -------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
此时系统默认的UNDO表空间是“UNDOTBS1”,我们调整到新创建的UNDOTBS_GUARANTEE表空间上;
UNDO默认的保留时间是15分钟(900秒),我们调整为1.5小时(5400秒)。
sys@ora10g> alter system set undo_retention=5400;
System altered.
sys@ora10g> alter system set undo_tablespace=UNDOTBS_GUARANTEE;
System altered.
2)调整后的UNDO相关参数
sys@ora10g> show parameter undo
NAME TYPE VALUE
------------------ -------------------- ------------------
undo_management string AUTO
undo_retention integer 5400
undo_tablespace string UNDOTBS_GUARANTEE
4.测试当UNDO表空间在GUARANTEE条件下的使用效果
sec@ora10g> update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000;
19999 rows updated.
sec@ora10g> update t set object_name = 'secjssecalskjdf;alksjdfaslkdjf;alskdjfa;sldooler' where rownum<20000;
update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS_GUARANTEE'
在报错之后我们这里提交事务。
sec@ora10g> commit;
Commit complete.
sec@ora10g> update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000;
update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS_GUARANTEE'
由于UNDO表空间在guarantee状态下,是不允许被覆写的,因为没有多余的空间保留更新前的数据。
因此,在UNDO表空间非自动扩展并且UNDO表空间是GUARANTEE状态下,在保留时限内UNDO表空间中保留的数据不允许被覆写!
5.测试当UNDO表空间在NOGUARANTEE条件下的使用效果
1)调整UNDO表空间为nOGUARANTEE
sec@ora10g> alter tablespace UNDOTBS_GUARANTEE retention noguarantee;
Tablespace altered.
2)再次测试
sec@ora10g> update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000;
19999 rows updated.
sec@ora10g> update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000;
update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS_GUARANTEE'
提交事务。
sec@ora10g> commit;
Commit complete.
sec@ora10g> update t set object_name = 'asajsdfjalskjdf;alksjdfaslkdjf;alskdjfa;sldkjfad' where rownum<20000;
19999 rows updated.
可见在事务提交之后,再次执行更新语句后成功。因此可以判断此时部分UNDO表空间的内容已被覆写!
6.小结
这便是UNDO表空间GUARANTEE与NOGUARANTEE之间的区别。
因此在GUARANTEE状态下,可以最有效的保证UNDO表空间中在UNDO_RETENTION规定期间内保留的足够多的数据,前提是我们需要为UNDO表空间分配足够大的空间,防止因UNDO表空间剩余空间过小导致SQL语句报错。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。