如何使用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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。