天天看點

ORA-01555 快照過舊

使用者user1對表進行了更新操作,使用者user2在user1還沒有進行送出前讀表中資料,而且是大批量的讀取(打個比方:耗時3分鐘)而在這3分鐘内user1進行了送出操作,那又會産生什麼影響呢?這個時候怎麼保證讀寫一緻性呢?這個時候DBMS就要保證有足夠大的undo表空間來存放修改前的數值,,以保證user2讀取的資料是修改前的一緻資料.然後下次再讀取時候就是更新後的資料了.

ora-01555快照過舊就是因為undo空間不夠大,其中一部分undo資料被覆寫了,使用者無法獲得修改前的資料。

undo資料分為三種:

活動的undo:未送出事務的undo資料,這些undo資料永遠不能覆寫,用于復原rollback事務。

過期的undo:已送出事務的undo資料,這些undo資料可以覆寫。

未過期的undo:事務已送出,但事務送出前,有些查詢正在進行,它要讀取的是送出前的資料,這部分資料就是未過期資料。如果這部分undo資料被覆寫了,就會發生ora-01555錯誤。

一個解決方法是,指定undo表空間參數UNDO_TABLESPACE,并将undo空間管理方法設定成自動擴充:UNDO_MANAGEMENT=AUTO。

這種方法可能産生的結果是:

因為undo表空間裝了太多未過期(unexpired)的undo資料,新的transaction無法向其中寫入undo資料,這時transaction就會發生ORA-30036錯誤。

如果導出資料時,經常出現這種情況,可以減少查詢的資料集