Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)
UNDO表空間用于存放UNDO數(shù)據(jù),當(dāng)執(zhí)行DML操作時(shí),oracle會(huì)將這些操作的舊數(shù)據(jù)寫入到UNDO段,以保證可以回滾或者一致讀等,而臨時(shí)表空間主要用來做查詢和存放一些緩沖區(qū)數(shù)據(jù)。你聽說UNDO也是臨時(shí)表可能是因?yàn)檫@兩個(gè)表空間都不會(huì)永久保存數(shù)據(jù)的原因。
-------------------------------------------------------------------------
oracle undo表空間
undo表空間用于存放undo數(shù)據(jù),當(dāng)執(zhí)行DML操作(insert、update、delete)時(shí),oracle會(huì)將這些操作的舊數(shù)據(jù)寫入到undo段。
undo數(shù)據(jù)的作用
1.回退事務(wù)
當(dāng)執(zhí)行DML操作修改數(shù)據(jù)后,舊數(shù)據(jù)被存放在undo段中。只要數(shù)據(jù)為提交、回滾段未寫滿或者回滾段為超時(shí)的情況下,舊數(shù)據(jù)都能被回滾回來。
2.讀一致性
通過DML操作后的數(shù)據(jù)沒有提交之前,其他用戶讀取的數(shù)據(jù)都是回滾段里面的舊數(shù)據(jù)。
使用undo參數(shù)
1.undo_management
該初始化參數(shù)用于指定undo數(shù)據(jù)的管理方式。如果要使用自動(dòng)管理模式,必須設(shè)置為auto,如果使用手工管理模式必須設(shè)置該參數(shù)為manual,使用自動(dòng)管理模式時(shí),oracle會(huì)使用undo表空間管理,使用手工管理模式時(shí),oracle會(huì)使用回滾段管理undo數(shù)據(jù)。需要注意,使用自動(dòng)管理模式時(shí),如果沒有配置初始化參數(shù)UNDO_TABLESPACE,oracle會(huì)自動(dòng)選擇第一個(gè)可用的UNDO表空間存放UNDO數(shù)據(jù),如果沒有可用的UNDO表空間,oracle會(huì)使用SYSTEM回滾段存放UNDO記錄,并在ALTER文件中記載警告。
2,UNDO_TABLESPACE
該初始化參數(shù)用于指定例程所要使用的UNDO表空間,使用自動(dòng)UNDO管理模式時(shí),通過配置該參數(shù)可以指定例程所要使用的UNDO表空間.
在RAC(Real Application Cluster)結(jié)構(gòu)中,因?yàn)橐粋€(gè)UNDO表空間不能由多個(gè)例程同時(shí)使用,所有必須為每個(gè)例程配置一個(gè)獨(dú)立的UNDO表空間.
3,UNDO_RETENTION
該初始化參數(shù)用于控制UNDO數(shù)據(jù)的最大保留時(shí)間,其默認(rèn)值為900秒,從9i開始,通過配置該初始化參數(shù),可以指定undo數(shù)據(jù)的保留時(shí)間,從而確定倒敘查詢特征(Flashback Query)可以查看到的最早時(shí)間點(diǎn).
手工管理回滾段的規(guī)劃:
SQL> show parameter? undo;
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
undo_management??????????????? string????? AUTO
undo_retention?????????????????????? integer??? 900
undo_tablespace??????????????????? string????? UNDOTBS1
SQL> show parameter? transactions;
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
transactions???????????????????????? integer???? 187???????????? ----------系統(tǒng)準(zhǔn)備支持的事務(wù)連接數(shù)量。
transactions_per_rollback_segment??? integer???? 5?????? --------------每個(gè)回滾段支持的事務(wù)連接數(shù)量。回滾段數(shù)=187/5
SQL> show? parameter rollback;
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ----------
fast_start_parallel_rollback???????? string????? LOW
rollback_segments????????????????????? string ----------------------設(shè)置回滾段的數(shù)量
transactions_per_rollback_segment??? integer???? 5
SQL>
當(dāng)數(shù)據(jù)庫啟動(dòng)的時(shí)候會(huì)判斷私有回滾段是否滿足我們事務(wù)的要求,如果滿足則打開數(shù)據(jù)庫;否則數(shù)據(jù)庫會(huì)去找公有回滾段。
?
?
解決辦法:
?
用戶user1對(duì)表進(jìn)行了更新操作,用戶user2在user1還沒有進(jìn)行提交前讀表中數(shù)據(jù),而且是大批量的讀取(打個(gè)比方:耗時(shí)3分鐘)而在這3分鐘內(nèi)user1進(jìn)行了提交操作,那又會(huì)產(chǎn)生什么影響呢?這個(gè)時(shí)候怎么保證讀寫一致性呢?這個(gè)時(shí)候DBMS就要保證有足夠大的undo表空間來存放修改前的數(shù)值,,以保證user2讀取的數(shù)據(jù)是修改前的一致數(shù)據(jù).然后下次再讀取時(shí)候就是更新后的數(shù)據(jù)了.
ora-01555快照過舊就是因?yàn)閡ndo空間不夠大,其中一部分undo數(shù)據(jù)被覆蓋了,用戶無法獲得修改前的數(shù)據(jù)。
undo數(shù)據(jù)分為三種:
活動(dòng)的undo:未提交事務(wù)的undo數(shù)據(jù),這些undo數(shù)據(jù)永遠(yuǎn)不能覆蓋,用于回滾rollback事務(wù)。
過期的undo:已提交事務(wù)的undo數(shù)據(jù),這些undo數(shù)據(jù)可以覆蓋。
未過期的undo:事務(wù)已提交,但事務(wù)提交前,有些查詢正在進(jìn)行,它要讀取的是提交前的數(shù)據(jù),這部分?jǐn)?shù)據(jù)就是未過期數(shù)據(jù)。如果這部分undo數(shù)據(jù)被覆蓋了,就會(huì)發(fā)生ora-01555錯(cuò)誤。
一個(gè)解決方法是,指定undo表空間參數(shù)UNDO_TABLESPACE,并將undo空間管理方法設(shè)置成自動(dòng)擴(kuò)展:UNDO_MANAGEMENT=AUTO。
這種方法可能產(chǎn)生的結(jié)果是:
因?yàn)閡ndo表空間裝了太多未過期(unexpired)的undo數(shù)據(jù),新的transaction無法向其中寫入undo數(shù)據(jù),這時(shí)transaction就會(huì)發(fā)生ORA-30036錯(cuò)誤。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3278473.html
總結(jié)
以上是生活随笔為你收集整理的Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 此文胜过你听三年的培训课
- 下一篇: c# List 按类的指定字段排序