甲骨論36課圖解剖析一個事務(wù)的操作流程
>selectxid,xudusn,xidslot,xidsgn,ubablk,ubafil from v$transaction; //查詢事務(wù)的XID
事務(wù)表:undo段的第一個數(shù)據(jù)塊放著一個事務(wù)表,每個回滾段最多可放47個事務(wù)表涧尿。
事務(wù)建立之后,先被分配一個XID。然后在undo表空間中找一個undo 段,在undo段的段頭塊的事務(wù)表里寫入自己的信息(XID)凌盯。
回滾塊鸠删、事務(wù)表、事務(wù)槽的概念:
事務(wù)表的分配:事務(wù)表被均勻的分在回滾段中蔚舀,盡量一個事務(wù)表占一個回滾段。
>select header_block,header_file from dba_segments wheresegment_name=’_SYSSMU1$’; //查詢段頭塊的地址
>alter system dump udo header ‘_SYSSMU1$’; //轉(zhuǎn)儲回滾段頭
>alter system dump datafile 5 block 4308;//轉(zhuǎn)儲回滾段數(shù)據(jù)塊
事務(wù)槽包括:xid(即是ID 又是地址)锨络、uba(undoblock address回滾塊赌躺,存回滾信息)
事務(wù)操作流程:
1)? ? ? ? ? ? 在undo表空間找一個相對空閑的段,在回滾段的段頭塊的事務(wù)表中寫入事務(wù)信息(xid ;uba)
2)? ? ? ? ? ? 被分配一個undo塊羡儿,同時將undo塊的地址(uba)寫入事務(wù)表中礼患。
3)? ? ? ? ? ? 在被修改的數(shù)據(jù)塊的事務(wù)槽中寫入事務(wù)信息(xid)。
4)? ? ? ? ? ? 修改數(shù)據(jù)時先將原數(shù)據(jù)寫入undo塊掠归,同時事務(wù)槽的xid批向分配的undo塊缅叠。
xid包括事務(wù)使用:回滾段的段頭塊、事務(wù)表使用的行虏冻、覆蓋次數(shù)肤粱。塊號、行號及第幾次覆蓋可以唯一確定某一行厨相。如果沒有覆蓋次數(shù)將不能唯一與事件對應(yīng)领曼。
5)? ? ? ? ? ? 當(dāng)有新的事務(wù)修改數(shù)據(jù),數(shù)據(jù)的三個鏈接:
l? rollback鏈接:則將兩個undo塊鏈起來(新指向舊)蛮穿,鏈接可以方便回滾庶骄。
l? CR鏈接:xid與uid鏈接,使構(gòu)造CR塊不必訪問段頭的地址(一致性讀)践磅。
l? 提交方式:xid鏈接到事務(wù)表单刁。
甲骨論37課深入剖析事務(wù)槽及Oracle多種提交方式
>selectINI_TRANS,MAX_TRANS from dba_tables where table_name=’T2’ //查詢事務(wù)槽相關(guān)信息
Oracle為減數(shù)據(jù)塊的爭用,盡量對事務(wù)槽的征用分布到多個塊中府适。
dump出事務(wù)槽的方法:
l? >select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),idfrom t10;//查詢進(jìn)程ID號對應(yīng)的段號和塊號
l? >select ubafil,ubablk,xidusn,xidslot,xidsgn,start_scnb from v$transaction;//從事務(wù)表查看uba的段號及塊號羔飞、段號、槽位號细溅、被覆蓋次數(shù)褥傍。
l? >select * from v$rollname; //查詢段名字
l? >alter system dump undo header ‘_SYSSMU8$’;//dump出段頭
l? >alter system dump datafile 2 block 4308;//dump出2號段頭的4308號的回滾塊
l? >select spid from vsession where sid=(select sid from v$mystat where rownum=1));//查看當(dāng)前會話的進(jìn)程編號
l? 從文件查看事務(wù)槽:
1)? ? ? ? ? ? #cd $ORACLE/admin/數(shù)據(jù)庫名/udump/;ls塊號;
2)? ? ? ? ? ? #vim 此文件,可以看到事務(wù)槽It1事務(wù)槽編號;Xid事務(wù)ID;Uba回滾塊;Flag是否已提交;Lck鎖定標(biāo)記;Scn/Fsc提交時間點喇聊。
事務(wù)操作流程:
1)? ? ? ? ? ? 回滾段事務(wù)表里找到一個事務(wù)槽恍风,同時分配一個回滾塊。事務(wù)表寫入xid指向回滾塊。
2)? ? ? ? ? ? 修改塊中的事務(wù)槽指向”回滾段事務(wù)表聽xid”朋贬。
3)? ? ? ? ? ? 修改塊中的uba指向回滾塊凯楔。
4)? ? ? ? ? ? 修改數(shù)據(jù)行,數(shù)據(jù)行頭部指向事務(wù)槽锦募。(被改塊的事務(wù)槽中有事務(wù)提交標(biāo)志摆屯,不必查回滾段的段頭)
5)? ? ? ? ? ? 當(dāng)需要的訪問”行頭指向的事務(wù)槽編號”時,此行有已提交和未提交兩種情況糠亩,根據(jù)已提交標(biāo)志作判斷是否可使用虐骑。(事務(wù)信息既要寫在回滾段段頭又要寫要被修改塊的事務(wù)槽中共**2處的原因**)
1000個塊的提交需要訪問所有的塊,以改變提交方式赎线⊥⒚唬可能有800個塊已由DBwriter寫入磁盤,變成干凈塊被覆蓋垂寥,再訪問時不存在颠黎。因此2處寫事務(wù)信息雖然更新數(shù)據(jù)行高效,但是帶來提交commit需要過多修改事務(wù)信息滞项。
因而需要快速提交技術(shù)狭归。當(dāng)大量塊提交時,只更新回滾段段頭的事務(wù)信息文判,對于被修改塊的事務(wù)信息不更新或少量更新过椎。
當(dāng)修改數(shù)據(jù)塊,從而需要更新事務(wù)信息時律杠,以”回滾段的段頭事務(wù)信息”為準(zhǔn)對”修改塊的事務(wù)信息”更新潭流。
行前加事務(wù)槽編號竞惋,相當(dāng)于對該行數(shù)據(jù)加鎖(行級鎖概念)柜去。對于sqlServer的塊級鎖,Oracle的并發(fā)性更好些拆宛。
不僅增刪改產(chǎn)生redo嗓奢,select查詢也會操作redo。select會清除”行鎖”浑厚。當(dāng)有行鎖股耽,且查得被修改塊的事務(wù)槽未提交,若再去查回滾段的事務(wù)槽已提交钳幅,則更新被修改塊的事務(wù)槽并產(chǎn)生日志物蝙。若回滾段的事務(wù)槽也未提交(說明確實未提交),則根據(jù)鎖找到事務(wù)槽敢艰,根據(jù)事務(wù)槽找到undo塊诬乞。拷貝undo塊到CR塊供查詢,保持?jǐn)?shù)據(jù)一致性震嫉。
如果需要查詢的數(shù)據(jù)塊覆蓋次數(shù)小于當(dāng)前覆蓋次數(shù)森瘪,則直接認(rèn)為已提交。
甲骨論38課IMU及Redo Private Strands技術(shù)
傳統(tǒng)oracle的undo機(jī)制:申請的回滾段的段頭事務(wù)槽不在內(nèi)存時票堵,從磁盤讀入扼睬。當(dāng)構(gòu)造CR塊時,可能需要的回滾塊已經(jīng)被DBwriter寫到磁盤上悴势,再使用時需要從新讀磁盤獲取窗宇。
IMU技術(shù):在shared pool分配個IMU buffer用于保存回滾塊。實現(xiàn)快速構(gòu)造CR塊(從IMU buffer讀回滾塊而非undo表空間)特纤,實現(xiàn)讀一致性担映。
一個事務(wù)分配一個IMUbuffer。IMU buffer中的日志在PrivateRedoAddress中產(chǎn)生叫潦,由LGWriter寫回磁盤蝇完。IMU buffer寫滿時還是會被寫回滾塊UndoBlock中去。IMU由shared pool寫到buffer cache的過程稱為IMU flush矗蕊。
IMU技術(shù)優(yōu)點:事務(wù)獲取undoBlock變快短蜕,CR讀變快。
甲骨論39課讀一致性(Ora-01555)錯誤機(jī)制分析及Undo表空間大小設(shè)置
通過回滾塊構(gòu)造CR塊避免臟讀(一個會話讀到了另一個會話未提交的數(shù)據(jù))傻咖。
讀數(shù)據(jù)過程中表被修改朋魔,以開始讀時的數(shù)據(jù)保持一致性。數(shù)據(jù)被修改時間不一致卿操,則構(gòu)造CR塊讀一致性時間相同的數(shù)據(jù)警检。若select執(zhí)行時間太長、undo表空間壓力很大(inactive被占用)害淤,導(dǎo)致undo表空間被覆蓋扇雕,無法構(gòu)造與”一致性時間”相同的CR塊,報錯snap shot too old(ora-01555 error)窥摄。由于select執(zhí)行時間無法解決镶奉,只能增大undo表空間解決ora-01555錯誤。
圖形界面EM-指導(dǎo)中心-還原管理-崭放,可以根據(jù)”還原保留時間查詢undo表空間大小哨苛。還原保留時間至少要大于最長select語句執(zhí)行時間,閃回則需要保留更長的時間币砂。
甲骨論40課字符集概述
字符集是字符和編碼的對應(yīng)表建峭。
#locale –a;//顯示Linux字符集
cmd:chcp //查看win字符集,中文的活動頁代碼936
字符集使用場合:
l? 存儲:固定長度字符char决摧、可變長度字符varchar2亿蒸、大對象clog使碾、舊版大對象long等數(shù)據(jù)類型
l? 存儲:表名、列名祝懂、PL/SQL變量
l? 存儲PL/SQL程序單元
Oracle安裝有數(shù)據(jù)庫字符集和國家字符集票摇。nchar、nvarchar2砚蓬、nclog數(shù)據(jù)類型使用國家字符集矢门。國家字符集作為數(shù)據(jù)庫字符集的補(bǔ)充,用的較少灰蛙。
常用字符集:
l? US7ASCII英文
l? ZHS16GBK中文
l? UTF8萬國碼
l? AL32UTF8適用于數(shù)據(jù)庫字符集
l? AF16UTF16適用于國家字符集
甲骨論41課字符集正確設(shè)置及相關(guān)操作
Linux+PTserver+RAC結(jié)構(gòu)祟剔。UNIX性能和穩(wěn)定性更好。Oracle從客戶端的NLS_LANG參數(shù)獲得編碼方式摩梧。Oracle將接收數(shù)據(jù)先轉(zhuǎn)碼后存儲物延。轉(zhuǎn)碼時字符集找不到存?出現(xiàn)字符丟失的問題仅父。
NLS_LANG必需設(shè)置為客戶端字符集:
l? win:set NLS_LANG=american_america.zhs16gbk //客戶端設(shè)置語言叛薯、地區(qū)、字符集笙纤。其中語言是提示信息的語言耗溜,地區(qū)影響日期格式、貨幣符號省容,字符集是客戶端編碼
NLS_LANG設(shè)置為與服務(wù)端編碼方式抖拴,是個隱蔽的錯誤。雖然未轉(zhuǎn)碼腥椒,但是存儲和訪問都不會報錯阿宅。錯誤設(shè)置前的存儲顯示出錯,錯誤設(shè)置后的存儲編碼錯誤笼蛛。
dump(列名,1016) //將列名以16進(jìn)制顯示洒放,1008八進(jìn)制,1010十進(jìn)制伐弹。用來查詢存儲的編碼方式拉馋。
字符集錯誤中,存儲錯誤的字符編碼是不可逆的惨好,存儲正確的字符編碼只要改正NLS_LANG即可。