作者:admin 日期:2023-10-13 瀏覽: 次
詳解Oracle數(shù)據(jù)庫UNDO表空間的作用、參數(shù)解析和管理
今天主要分享UNDO的一些作用及oracle是如何去設(shè)計(jì)并管理它的,大家一起看下吧~
1、作用
還原段的引入,主要是為了解決三個問題。
事務(wù)恢復(fù):在進(jìn)行DML操作時,insert、update、delete操作時,undo段記錄事務(wù)的反向操作并且redo日志也記錄undo段的操作,既redo保護(hù)undo段的信息。當(dāng)實(shí)例關(guān)閉或意外崩潰后,再次open時實(shí)例需要對沒有commit的事務(wù)進(jìn)行回滾,完成事務(wù)的恢復(fù)。
事務(wù)回滾:用戶進(jìn)行DML操作后沒有進(jìn)行commit,需要修改前的數(shù)據(jù)。只要該操作在undo段保護(hù)的時間內(nèi),此時執(zhí)行rollback操作可以回滾到最近記錄點(diǎn)或上一次commit操作后的狀態(tài),恢復(fù)到數(shù)據(jù)修改前的狀態(tài)。
讀一致性:當(dāng)進(jìn)行DML操作時,undo段會記錄數(shù)據(jù)變更前的狀態(tài)(通過構(gòu)造原數(shù)據(jù)的一致性數(shù)據(jù)塊)。如果用戶還沒有進(jìn)行commit操作,其他人查詢此條數(shù)據(jù)會看到數(shù)據(jù)變更前的狀態(tài)。因?yàn)槠渌脩糇x到的數(shù)據(jù)是undo段中原數(shù)據(jù)塊中的數(shù)據(jù),保證沒有commit的數(shù)據(jù)讀取的一致性。
2、讀一致性
下面模擬復(fù)雜環(huán)境下,讀一致性在復(fù)雜環(huán)境下如何能夠保證?
1)會話A在9:50分的時候?qū)表發(fā)起了一次查詢,需要10分鐘完成查詢結(jié)果打印。
2)會話B在9:51分對T表進(jìn)行了一次update,并且commit。此時undo段會記錄會話B在update的反向操作,假設(shè)名為undo1。
3)會話C在9:52分對T表進(jìn)行了一次insert,并且同樣commit。此時undo段會記錄insert反向操作,假設(shè)名為undo2。
4)會話A的查詢在發(fā)起時已經(jīng)記錄數(shù)據(jù)庫當(dāng)前的SCN號,假設(shè)此時SCN號為950。由于ILT事務(wù)槽記錄最新的SCN號,所以再與數(shù)據(jù)塊頭部ILT事務(wù)槽中的SCN號進(jìn)行比對時發(fā)現(xiàn)當(dāng)前SCN大于950,所以需要對undo段進(jìn)行查詢。查詢到undo2段信息進(jìn)行比對發(fā)現(xiàn)SCN大于950,通過undo中記錄的事務(wù)信息在進(jìn)行前一個數(shù)據(jù)變更查找,此時undo1的SCN還是大于950,再繼續(xù)查找前面的undo信息,發(fā)現(xiàn)undo0的SCN號比950要早,此時會將undo0記錄的數(shù)據(jù)的信息+未變更的數(shù)據(jù)塊信息打印給用戶。
5)由于undo段是通過覆蓋的方式進(jìn)行記錄的,如果時間過長或頻繁進(jìn)行DML操作。那么在尋找過程中可能會出現(xiàn)沒有小于SCN號950的undo段,會返回一個經(jīng)典錯誤ORA-1555 snapshoot too old(快照過舊),這樣是為了避免幻影讀、臟讀等現(xiàn)象,保證讀一致性的絕對特性。
通過上面的一個模擬,證明undo段不僅記錄事務(wù)的回滾信息、同樣記錄ILT事務(wù)槽的上一次變更信息,并且保證能夠通過不斷讀取undo段中記錄ILT事務(wù)槽中的SCN號進(jìn)行事務(wù)的歷史查詢。簡單來講只要UNDO段足夠大,數(shù)據(jù)庫中任何時間的DML操作都可以進(jìn)行查詢。
讀一致性的具體步驟確認(rèn)讀取時間的SCN號搜索所有關(guān)聯(lián)此表、行的數(shù)據(jù)塊,要求數(shù)據(jù)塊ILT事務(wù)槽的SCN號要小于讀取時刻的SCN號。如果搜索到小于讀取時刻的SCN號,直接讀取如果全部沒有小于讀取時刻的SCN號,則根據(jù)數(shù)據(jù)塊內(nèi)ILT事務(wù)槽記錄的undo信息,查找改變之前的數(shù)據(jù)。如果SCN號還是大于讀取時刻,那么通過遞歸讀取undo塊所有關(guān)聯(lián)這一事務(wù)的數(shù)據(jù)塊,直至找到比讀取時刻SCN號小undo塊的信息,找到后進(jìn)行讀取。如果沒有比讀取時刻的SCN號小的undo信息,那么報ORA-155錯誤。
3、實(shí)例恢復(fù)與事務(wù)回滾解析
實(shí)例恢復(fù):在需要實(shí)例恢復(fù)時,oracle會讀取UNDO段的頭部信息的事務(wù)表,每一個事務(wù)是否commit的信息都會存儲在事務(wù)表內(nèi)。已經(jīng)commit的事務(wù)不作處理,沒有commit的事務(wù)會進(jìn)行rollback的回滾處理完成事務(wù)回滾。防止臟數(shù)據(jù)的寫入,造成臟讀。
事務(wù)回滾:當(dāng)需要回滾事務(wù)時,由于錯誤或者rollback命令都會產(chǎn)生回滾需求。此時根據(jù)ITL槽中記錄的undo數(shù)據(jù)塊地址找到undo塊,進(jìn)行數(shù)據(jù)的反向操作,從而實(shí)現(xiàn)恢復(fù)數(shù)據(jù),即回滾事務(wù)。
1、UNDO_MANAGEMENT
該初始化參數(shù)用于指定UNDO數(shù)據(jù)的管理方式.如果要使用自動管理模式,必須設(shè)置該參數(shù)為AUTO,如果使用手工管理模式,必須設(shè)置該參數(shù)為MANUAL,使用自動管理模式時,oracle會使用undo表空間管理undo管理,使用手工管理模式時,oracle會使用回滾段管理undo數(shù)據(jù),如果使用自動管理模式時,如果沒有配置初始化參數(shù)UNDO_TABLESPACE。Oracle會自動選擇第一個可用的UNDO表空間存放UNDO數(shù)據(jù),如果沒有可用的UNDO表空間,oracle會使用SYSTEM回滾段存放UNDO記錄,并在ALTER文件中記載警告.
2、UNDO_TABLESPACE
該初始化參數(shù)用于指定例程所要使用的UNDO表空間,使用自動UNDO管理模式時,通過配置該參數(shù)可以指定實(shí)例所要使用的UNDO表空間.
在RAC(Real Application Cluster)結(jié)構(gòu)中,因?yàn)橐粋€UNDO表空間不能由多個實(shí)例同時使用,所有必須為每個實(shí)例配置一個獨(dú)立的UNDO表空間.
3、undo_retention參數(shù)
在oracle 10g開始引入undo_retention參數(shù),該參數(shù)是一個時間值。說明當(dāng)還原段中的事務(wù)在提交后繼續(xù)保留的時間,為flashback等工具進(jìn)行如閃回數(shù)據(jù)等操作,該參數(shù)默認(rèn)值為900秒,可以動態(tài)修改。
該參數(shù)以秒為單位,表示當(dāng)事務(wù)提交或回滾以后,該事務(wù)所使用undo塊里的數(shù)據(jù)能夠提供的保留時間。當(dāng)保留時間超過undo_retention所指定的時間以后,該undo塊才能夠被其他事務(wù)覆蓋。當(dāng)我們使用AUM的時候,并且設(shè)置了undo_retention以后,undo塊的狀態(tài)就會存在如下4種情況。active:活躍的,表示正在使用該數(shù)據(jù)塊的事務(wù)還沒有提交或回滾。inactive:不活躍的,表示該數(shù)據(jù)塊上沒有活動的事務(wù),該狀態(tài)的數(shù)據(jù)塊可以被其他事務(wù)覆蓋。揚(yáng)州數(shù)據(jù)恢復(fù)expired:達(dá)到時間上限的,表示該數(shù)據(jù)塊持續(xù)inactive的時間已經(jīng)超過了undo_retention所指定的時間,如果沒有freed、inactive可以被其他事務(wù)覆蓋。freed:已經(jīng)釋放的,表示該數(shù)據(jù)塊是空的,從來沒有使用過。
在自動管理模式中,事務(wù)可以在不同的undo segment之間動態(tài)交換undo空間,也就是在不同的undo segment里交換extents。
當(dāng)一個事務(wù)需要更多的undo空間的時候,如何進(jìn)行處理?
當(dāng)事務(wù)進(jìn)行DML操作需要undo段進(jìn)行事務(wù)保護(hù)時,首先獲取undo表空間里可用的、空的extents(segment的最小分配單位是extent),獲取其他undo segment里的expired狀態(tài)的extents。
如果undo表空間內(nèi)的數(shù)據(jù)文件啟動了autoextensible(自動拓展),則數(shù)據(jù)文件會進(jìn)行自動拓展。如果沒有啟動自動拓展,則獲取undo segment里處于inactive狀態(tài)的extent,如果沒有此種狀態(tài)的,會報ORA-30036(undo無法繼續(xù)拓展)。
undo表空間獲取空間的申請順序
freed=>expired=>自動拓展(必須該參數(shù)為yes狀態(tài)才可以)=>inactive(下面詳細(xì)解釋此種狀態(tài)的覆蓋)=>ORA-30036
而且在使用數(shù)據(jù)塊時盡量使用相對更短的連續(xù)extent,如不足時才使用更連續(xù)的extent。這樣能夠減少碎片的產(chǎn)生。并且盡量不去覆蓋inactive狀態(tài)的數(shù)據(jù)塊,如果空間足夠會最大限度的保存此種狀態(tài)的數(shù)據(jù)塊包含的信息。
1、分類
oracle中還原段共包含兩大類,系統(tǒng)還原段和非系統(tǒng)還原段。
系統(tǒng)還原段為系統(tǒng)表空間使用,當(dāng)系統(tǒng)表空間中的對象發(fā)生變化時,這些對象的原始值就保存在系統(tǒng)還原段中,系統(tǒng)還原段在系統(tǒng)表空間中創(chuàng)建,可以在自動模式和手動模式中。
非系統(tǒng)還原段為非系統(tǒng)表空間如用戶表空間等所使用,當(dāng)一個數(shù)據(jù)庫系統(tǒng)具有非系統(tǒng)表空間時,就需要至少一個非系統(tǒng)還原段或一個自動管理的還原表空間,其中自動管理模式由數(shù)據(jù)庫服務(wù)器自動維護(hù),但需要至少一個還原表空間,而手動管理模式需要管理員創(chuàng)建非系統(tǒng)還原段,這些手動的非系統(tǒng)還原段分為兩種類型,即公有還原段和私有還原段。
Oracle 9i以上版本都實(shí)現(xiàn)了還原段的自動管理,使用自動管理需要首先創(chuàng)建一個還原表空間,并通過還原表空間告訴數(shù)據(jù)庫服務(wù)器,之后的管理工作都由數(shù)據(jù)庫服務(wù)器自動完成。
2、還原段的自動管理
這里只涉及私有還原段的管理,即單實(shí)例UNDO段自動管理
在oracle 11g中通過兩個參數(shù)來設(shè)置還原段的自動管理:
UNDO_MANAGEMENT(還原段的管理方式):此參數(shù)為靜態(tài)參數(shù)需要設(shè)置后重啟數(shù)據(jù)庫才能生效。
東臺數(shù)據(jù)恢復(fù)UNDO_TABLESPACE(還原表空間的名字):此參數(shù)為動態(tài)參數(shù)設(shè)置完成可在數(shù)據(jù)庫啟動狀態(tài)生效。
該數(shù)據(jù)字典記錄所有undo表空間記錄undo段的分配信息,包括記錄表空間的名字、段、區(qū)段、數(shù)據(jù)文件ID、數(shù)據(jù)塊ID、retention保留狀態(tài)等信息。
1、創(chuàng)建T表插入一行數(shù)據(jù)
create table t (id number,name varchar2(10));
濱海數(shù)據(jù)恢復(fù)insert into t values (1,'hwb');
2、查詢此條更新記錄回滾段的名字
select a.username,b.name,c.used_ublk from v$session a,v$rollname b,v$transaction c where a.saddr=c.ses_addr and b.usn=c.xidusn;
v$session:記錄用戶關(guān)于會話信息v$rollname:記錄回滾段的名字v$transaction:記錄關(guān)于事務(wù)的信息
3、通過查詢到的回滾段名字,查詢該回滾段在所在表空間、區(qū)段等信息
select segment_name,tablespace_name,extent_id from dba_undo_extents where segment_name='_SYSSMU3_2097677531$';
后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~