標籤:oracle 11g rac
ORA-01555 快照過舊,是資料庫中很常見的一個錯誤,比如當我們的事務需要使用undo來構建CR塊的時候,
而此時對應的undo 已經不存在了, 這個時候就會報ORA-01555的錯誤。
環境是Oracle 11g RAC 由於客戶執行一個比較複雜的SQL,使用PLSQL運行了88分鐘後出現報錯,這是一個要查看報表的SQL。
臨時的處理方法如下:
以下為虛擬機器類比操作,建議資料庫安裝的時候這個參數一定要提前調整最佳化一下,不要使用預設值。
[[email protected] ~]# su - oracle[[email protected] ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Fri Dec 23 10:39:44 2016Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,Data Mining and Real Application Testing options[email protected]>show parameter undo;NAME TYPE VALUE------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900 --預設15分鐘undo_tablespace string UNDOTBS1[email protected]>[email protected]>alter system set undo_retention=10800 scope=both;System altered.
--查看錶空間容量
[email protected]>col tablespace_name for a15[email protected]>col free_rate for a15[email protected]>SELECT a.tablespace_name, ROUND (a.total_size) "total_size(MB)", ROUND (a.total_size) - ROUND (b.free_size, 3) "used_size(MB)", ROUND (b.free_size, 3) "free_size(MB)", ROUND (b.free_size / total_size * 100, 2) || ‘%‘ free_rate FROM ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 total_size FROM dba_data_files GROUP BY tablespace_name) a, ( SELECT tablespace_name, SUM (bytes) / 1024 / 1024 free_size FROM dba_free_space GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name(+);TABLESPACE_NAME total_size(MB) used_size(MB) free_size(MB) FREE_RATE--------------- -------------- ------------- ------------- ---------------SYSAUX 600 178.625 421.375 70.23%UNDOTBS1 200 56.062 143.938 71.97%USERS 5 1 4 80%SYSTEM 700 287.5 412.5 58.93%UNDOTBS2 200 6.687 193.313 96.66%
[email protected]> SELECT tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)" FROM dba_undo_extents GROUP BY tablespace_name, status;TABLESPACE_NAME STATUS Bytes(M)TABLESPACE_NAME STATUS Bytes(M)--------------- --------- ----------UNDOTBS1 UNEXPIRED 11UNDOTBS2 UNEXPIRED 2.125UNDOTBS1 EXPIRED 44.0625UNDOTBS2 EXPIRED 3.5625
1.出現ORA-01555錯誤,通常有2種情況:
1)SQL語句執行時間太長,或者UNDO資料表空間過小,或者事務量過大,或者過於頻繁的提交,導致執行SQL過程中進行一致性讀時,SQL執行後修改的前鏡像(即UNDO資料)在UNDO資料表空間中已經被覆蓋,不能構造一致性讀塊(CR blocks)。 這種情況最多。
2)SQL語句執行過程中,訪問到的塊,在進行延遲塊清除時,不能確定該塊的事務提交時間與SQL執行開始時間的先後次序。 這種情況很少。
2.第1種情況解決的辦法:
1)增加UNDO資料表空間大小
2)增加undo_retention 時間,預設只有15分鐘
3)最佳化出錯的SQL,減少查詢的時間,首選方法
4)避免頻繁的提交
本文出自 “roidba” 部落格,請務必保留此出處http://roidba.blog.51cto.com/12318731/1885405
oracle 11g rac ORA-01555 快照過舊報錯處理