作者:admin 日期:2023-10-16 瀏覽: 次
記一次生產(chǎn)數(shù)據(jù)庫Oracle快照過舊解決的思路及方法
因之前業(yè)務(wù)設(shè)計(jì)時(shí)很多接口都是在凌晨執(zhí)行,所以凌晨undo都會急劇增加,而最近考慮到閃回問題,在增加undo_retention后接口報(bào)錯快照過舊,這是什么問題呢?下面一起來看看吧~
ORA-01555 快照過舊 回退段號 10 (名稱為 _SYSSMU10_3452551959$ ) 過小
ORA-06512 在 RFUSER.SPLIT_OTM_OM_NEW , line 343
ORA-06512 在 line 1
======= at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
at FSL.Business.SP_OtmShipmentDataInOut.RF_SQL_Handle_MoreThan.Start(Int32 ioID, String ConnectionName) in d \IT_SVN\SourceCode\RF系統(tǒng)\RF_ReConstruction\FSL.Business.SP_OtmShipmentDataInOut\RF_SQL_Handle_MoreThan.cs line 43
ORA-01555 快照過舊,是數(shù)據(jù)庫中很常見的一個錯誤,比如當(dāng)我們的事務(wù)需要使用undo來構(gòu)建CR塊的時(shí)候,而此時(shí)對應(yīng)的undo已經(jīng)不存在了,這個時(shí)候就會報(bào)ORA-01555的錯誤。
ORA-01555錯誤在Oracle 8i及之前的版本最多。從9i開始的undo自動管理,至現(xiàn)在的10g、11g中的undo auto tuning,使得ORA-01555的錯誤越來越少。但是這個錯誤,仍然不可避免。
無錫數(shù)據(jù)恢復(fù)出現(xiàn)ORA-01555錯誤,通常有2種情況:
(1)、SQL語句執(zhí)行時(shí)間太長,或者undo表空間過小,或者事務(wù)量過大,或者過于頻繁的提交,導(dǎo)致執(zhí)行SQL過程中進(jìn)行一致性讀時(shí),SQL執(zhí)行后修改的前鏡像(既UNDO數(shù)據(jù))在UNDO表空間中已經(jīng)被覆蓋,不能構(gòu)造一致性讀塊(CR blocks)。這種情況最多。
(2)、SQL語句執(zhí)行過程中,訪問到的塊,在進(jìn)行延遲塊清除時(shí),不能確定該塊的事務(wù)提交時(shí)間與SQL執(zhí)行開始時(shí)間的先后次序。這種情況很少。
針對第一種情況解決辦法
(1)、增加UNDO表空間大小;
(2)、增加undo_retention時(shí)間,默認(rèn)只有15分鐘;
(3)、優(yōu)化出錯的SQL,減少查詢的時(shí)間,首選方法;
(4)、避免頻繁的提交
這里在增加undo表空間后問題得到解決。
后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~