[VIP專享]導數(shù)據(jù)遇見ORA_第1頁
[VIP專享]導數(shù)據(jù)遇見ORA_第2頁
[VIP專享]導數(shù)據(jù)遇見ORA_第3頁
[VIP專享]導數(shù)據(jù)遇見ORA_第4頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、導數(shù)據(jù)遇見ORA-01555錯誤昨天在對 CALLCENTER系統(tǒng)的主庫導入 CUSTOMER 數(shù)據(jù)的時候,遇到了ORA-01555錯誤。軟件環(huán)境:兩臺 DB 都是導入工具使用: powercenter8.6主庫是 redhat linux4.7備庫是 windows2003 (32 位)環(huán)境在導入過程中,報:ORA-01555:快照過舊 : 回退段號1 在名稱為"_SYSSMU1$"過小錯誤。1555錯誤產(chǎn)生的原因,就需要知道ORACLE的兩個特性:一致性讀 (Consistent Get)清除( Delayed Block Cleanout)。此外,還要知道關(guān)于回滾段的

2、一些配置參數(shù):和延遲塊相關(guān)參數(shù)先看下 Oracle 中關(guān)于 UNDO 有哪些配置參數(shù):SQL> show parameter undoNAMETYPEVALUE- - -undo_managementstringMANUALundo_retentioninteger 900undo_suppress_errors Boolean FALSEundo_tablespacestringUNDOTBS1undo_management回滾段的 管理方式。值可以為MANUAL/AUTO。9i 中默認是 MANUAL ,10g中默認是AUTO 。從 9i 后,回滾段就以表空間的形式管理,并且支持系統(tǒng)

3、自動管理回滾段。一個回滾表空間上可以創(chuàng)建多個回滾段,一個 數(shù)據(jù)庫可以創(chuàng)建多個回滾表空間。但是,一個實例( Instance )只能使用一個回滾表空間。如果 undo_management設置為 MANUAL ,就是手動創(chuàng)建回滾段:SQL> create rollback segment undo1 tablespace UNDOTBS1;如果設置為 AUTO , Oracle 就自動管理回滾段的創(chuàng)建,而手工創(chuàng)建就會失敗。undo_retention這個參數(shù)設置回滾段中的被提交或回滾的數(shù)據(jù)強制保留時間,單位是秒。請注意,這個參數(shù)和1555錯誤有非常大的關(guān)系。但是,需要提醒的是,并不是回滾段

4、中的數(shù)據(jù)超過這個時間以后就會被清除掉,而是等到后面事務產(chǎn)生的回滾數(shù)據(jù)覆蓋掉“超期 ”數(shù)據(jù)。所以這就是為什么我們往往看到系統(tǒng)的回滾表空間占有率始終是100% 的原因了。undo_suppress_errors是否報與回滾段有關(guān)的錯誤。如果為FALSE ,就不會產(chǎn)生與回滾段有關(guān)的錯誤。但是,請注意,并不是不會發(fā)生回滾段錯誤,而只是屏蔽錯誤信息,錯誤發(fā)生了就會存在滴。在10g 中,這個參數(shù)是隱含參數(shù)。undo_tablespace為每個實例制定的唯一當前使用的回滾段表空間。面我們就模擬一下1555錯誤發(fā)生的情況:首先建立測試環(huán)境。由于我們只是要模擬1555錯誤的發(fā)生,所以需要建立一個小的回滾表空間,

5、并且設置 undo_retention時間為 1 (秒),以便回滾數(shù)據(jù)盡快被覆蓋(呵呵,要防止1555錯誤發(fā)生,這就一定要避免的)。CREATE UNDO TABLESPACE rbs_tsDATAFILE 'rbs_ts2.dbf' SIZE10MAUTOEXTEND OFF;altersystem set undo_retention=1 scope=spfile;altersystem set undo_management=auto scope=spfile;altersystem set undo_tablespace=rbs_tsscope=spfile;start

6、up forcealter tablespace rbs_tsonline;create table demo.t_dualas select * from dual;insert intot_dual values(1);commit;一致性讀導致的1555錯誤開始讀取表。SQL>SQL>var cl refcursorSQL> begin2open:clfor select * from demo.t_multiver;3end;4/PL/SQL procedure successfully completed.SQL>更新表數(shù)據(jù),產(chǎn)生回滾信息。SQL> up

7、dated mo.t_multiver set b = 111 where a = 1;1 row updated.SQL> commit;Commit complete.運行大批其他事務,充滿所有回滾段,以致覆蓋上面的回滾信息?;貪L段可以通過dba_rollback_segs查看。SQL> begin2for I in 1.20000loop3update demo.t_dualset dummy=1;4commit;5end loop;6end;78/PL/SQL procedure successfully completed.SQL> /PL/SQL procedur

8、e successfully completed.查詢到更新過的數(shù)據(jù)記錄,回滾信息已經(jīng)被覆蓋,所以報1555錯誤。SQL>print :clERROR:ORA-01555: snapshot too old: rollback segment number 18 with name "_SYSSMU18$"toosmallnorows selectedSQL>延遲塊清除導致的1555錯誤開始讀取表。SQL>var cc refcursorSQL>SQL> begin2open:cc for select * from t_multiver;3e

9、nd;4/這時一個事務更新了該數(shù)據(jù)塊,但在提交前,我們手工將buffer cache中的數(shù)據(jù)做了flush ,再做提交。這時的數(shù)據(jù)塊上只記錄了鎖標志,沒有事務標志和Commit SCN。PL/SQL procedure successfully completed.SQL>SQL> update t_multiver set b=115 where a=1;1 row updated.SQL>SQL> alter system flushbuffer_cache;System altered.SQL>SQL> commit;Commit complete.進

10、行非常多的事務,將回滾段中的事務信息表中的數(shù)據(jù)全部覆蓋:SQL>SQL> begin2-overwriterollback slot3for I in 1.40000loop4updatet_dualset dummy=1;5commit;6end loop;7end;8/PL/SQL procedure successfully completed.讀取數(shù)據(jù)塊前需要到回滾段的事務信息表中讀取Itl 中沒有標記完全的事務的狀態(tài)和Commit SCN,以判斷是否需要進行一致性讀。但是事務信息表中的數(shù)據(jù)都已經(jīng)被覆蓋,所以報1555錯誤:SQL>SQL>print :ccER

11、ROR:ORA-01555: snapshot too old: rollback segment number 20 with name"_SYSSMU20$"toosmallnorows selected以上兩個例子看起來是好像很類似,但是,他們的本質(zhì)區(qū)別是:第一個實際上是在進行一致性讀得時候發(fā)生的 1555 錯誤,而第二個例子是在判斷是否需要進行一致性讀得時候發(fā)生的 1555 錯誤。解決 1555錯誤的方法現(xiàn)在,我們已經(jīng)知道了1555 錯誤產(chǎn)生的原因。那么,就可以總結(jié)出以下方法來解決1555錯誤問題:1 、擴大回滾段因為回滾段是循環(huán)使用的,如果回滾段足夠大,那么那些被

12、提交的數(shù)據(jù)信息就能保存足夠長的時間是那些大事務完成一致性讀取。2 、增加 undo_retention時間在 undo_retention規(guī)定的時間內(nèi),任何其他事務都不能覆蓋這些數(shù)據(jù)。3 、優(yōu)化相關(guān)查詢語句,減少一致性讀。減少查詢語句的一致性讀,就降低讀取不到回滾段數(shù)據(jù)的風險。這一點非常重要!4 、減少不必要的事務提交提交的事務越少,產(chǎn)生的回滾段信息就越少。5 、對大事務指定回滾段通過以下語句可以指定事務的回滾段:SET TRANSACTION USE ROLLBACK SEGMENTrollback_segment;給大事務指定回滾段,即降低大事務回滾信息覆蓋其他事務的回滾信息的幾率,又降低

13、了他自身的回滾信息被覆蓋的幾率。大事務的存在,往往是1555錯誤產(chǎn)生的誘因。6 、使用游標時盡量使用顯式游標,并且只在需要的時候打開游標,同時將所有可以在游標外做的操作從游標循環(huán)中拿出。當游標打開時,查詢就開始了,直到游標關(guān)閉。減少游標的打開時間,就減少了1555 錯誤發(fā)生的幾率。在本次操作中,筆者的解決方案是:1. 適當增大 undo 表空間的尺寸,防止回滾信息被覆蓋。2. 增加 undo_retention 時間,增加到 10800 秒(在導入源和導出源都修改)。3. 刪除目標表的部分索引,加快導入速度,在倒完數(shù)據(jù)后,再建立。關(guān)于備份數(shù)據(jù)庫報ora-01555 的解決方法備份包含大二進制數(shù)

14、據(jù)提示如下錯誤表 ANNEX將以常規(guī)路徑導出。. .正在導出表ANNEXEXP-00056: 遇到 ORACLE錯誤 1555ORA-01555: 快照過舊 :回退段號在名稱為ORA-22924: 快照太舊""過小導出成功終止,但出現(xiàn)警告。問題原因:大二進制的表中有記錄損壞掉,導致數(shù)據(jù)不能備份成功。-解決方法找到 所有錯誤記錄刪除-監(jiān)測錯誤記錄的語法beginset serveroutput onexec dbms_output.enable(100000);declarepagnumber;lennumber;c varchar2(10); charpp number := 8132/2;beginfor r in (select rowid rid, dbms_lob.getlength (ANNEX_CONTENT) len from annex ) loopif r.len is not null thenfor page in 0.r.len/charpp loopbeginselect dbms_lob.substr (ANNEX_CONTENT, 1, 1+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論