原創 ORA 01555 快照過舊

2021-06-20 21:22:21 字數 1486 閱讀 2915

問題描述:
在執行下面語句時曝出了標題所示的錯誤ora-01555。
insert into super.sb_kpxx_com 

select

* from super.sb_kpxx a

where kprq >= to_date('20130101', 'yyyymmdd') and kprq <=to_date('20131001','yyyymmdd') and not exists (select

1 from [email protected] b

where a.sb_num = b.sb_num

and a.kplsh = b.kplsh

and a.dwid = b.dwid);

分析:
這個sql語句的意思是將明細庫中的多餘資料(相對於生產庫來說)插入到臨時表中進行備份。

pctversion 、retention:都是oracle用來管理lob欄位映象資料的。在lob 資料的更新過程中,

oracle沒有用undo tablespace空間,而是從lob欄位所在的表空間裡劃分一段空間來做映象空間的,

這個空間的大小由pctversion引數控制,預設值為10,代表劃分表空間的10%作為映象空間,

每個映象空間的單元大小由chunk引數指定,pctversion可以使用在manual undo mode和automatic undo mode 環境中.

retention應用了automatic undo mode中的undo_retention通過時間來管理lob映象空間.

上面關鍵的地方是說pctversion和retention不能同時被指定,所以我用show parameter undo_retention檢視undo_retention引數:

name 

type 

value

-------------- 

----- 

-----

undo_retention 

integer 

18000

18000/3600=5個小時,而操作報錯大概是一小時以內,所以這個原因不太可能。

2)你查詢的時候有人做了更新操作,導致你剛開始查詢的資料相比更新過後的資料舊了。-->也就是快照過舊

這個原因是有可能的,我曾在不同的時間段查詢,發現資料由92條增加到了207條,原因是因為我直接在明細庫中進行查詢操作,而工作日會有業務,明細庫中的資料是會發生變化的。一旦我插入的資料發生了變化,便會有這個錯誤。這個尚未得到認證。
如果是第一種情況網上有如下解決方案:

1)可以考慮多個分段查詢where sendtime between xx and ***,這樣就不會太大.。(針對pctversion模式

)2) 增加適當的索引縮短查詢時間(針對retention模式 

Error ORA 01555 快照過舊

錯誤資訊 error ora 01555 快照過舊 回退段號47 名稱為 syssmu47 1286521707 過小 可能原因 sql語句執行時間太長,或者undo表空間過小,或者事務量過大,或者過於頻繁的提交,導致執行sql過程中進行一致性讀時,sql執行後修改的前映象 即undo資料 在und...

Oracle ORA 01555 快照過舊

一 引言 oracle yft yft oerr ora 01555 01555,00000,snapshot too old rollback segment number s with name s too small cause rollback records needed by a rea...

關於Oracle ORA 01555快照過舊的錯誤

關於oracle ora 01555快照過舊的錯誤 首先了解oracle在什麼情況下會產生ora 01555錯誤 1 在1點鐘,使用者a發出了select from testdb 此時不管將來testdb怎麼變化,正確的結果應該是使用者a會看到在1點鐘這個時刻的內容。2 在1點30分,使用者b執行了...