問題描述:
在執行下面語句時曝出了標題所示的錯誤ora-01555。
insert into super.sb_kpxx_comselect
* 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引數:
nametype
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執行了...