oracle 體系結構及內存管理 12_undo

一、Undo表空間及管理方式:建立實例時自動建立,自動生成undo段(默認會自動生成11個undo段,一個系統undo段,10
個普通undo段),system回滾段,對數據字典操做時,如創建表,記錄相關信息區是自動分配的,分配給段的區能夠是
不連續的,區中的塊是連續的,9i前段的區都是手動管理,比較麻煩。
查詢undo表空間中已建立的undo段信息
    select * from v$rollname;
    select * from dba_rollback_segs;        
查詢undo段的區塊信息 dba_segments,dba_extents
    select SEGMENT_NAME,EXTENTS,BLOCKS from dba_segments where SEGMENT_NAME='_SYSSMU1$';
    select SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='_SYSSMU1$';
    
二、undo advisor UNDO大小設置
    利用EM獲取系統建議大小:最長sql語句執行時間,閃回考慮,undo大小設置要參考時間因素    
show parameter undo
    undo_management #UNOD的管理方式 AUTO
    undo_retention  #設置保留時間
        alter tablespace undotbs1 retention guarantee; #inactive狀態的區繼續保留不被覆蓋
        alter tablespace undotbs1 retention noguarantee;  #儘可能保留
        select retention from dba_tablespaces; sql

三、undo的做用與undo區狀態
undo的三個做用:主要緣由實現了存儲修改前的數據
    讀一致性,構造CR塊:會話修改未提交的數據別的會話不能讀,未修改的數據和undo中的數據構造CR塊
    回滾:修改前的數據先存入undo表空間裏的undo段裏,方便回滾
    實例恢復:前滾,回滾
Undo段中區的狀態
    free:未使用,未分配給任何段
    expired:過時,不會釋放成free
    inactive:提交後,但願繼續還會保留(undo_retention)時間
    active:正在使用的事物未提交
查詢UNDO區狀態等信息 dba_undo_extents
    SELECT extent_id, bytes, status FROM dba_undo_extents WHERE segment_name='_SYSSMU1$';
    區的自動分配先用free空間,再擴展undo表空間,再使用expired,expired通常不會釋放爲free緩存

四、圖解一個事務的操做流程
    事務表:回滾段段頭塊的結構,存儲回滾段事務信息,最多能夠存儲47個事務信息;
        select header_block,header_file from dba_segments where segment_name='_SYSSMU1$';
    UBA:(Undo Block Address)回滾塊地址;
    事務槽:ITL數據塊頭部結構,存儲數據塊的事務信息;
    事務ID:事務標識號;
        select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
事務操做流程:
    開始一個事務後,先找一個相對空閒的回滾段,在回滾段段頭塊的事務表裏寫入事務XID,同時在回滾段裏分配空
的回滾塊事務表中記錄回滾塊的UBA;在要修改的數據塊的事務槽裏寫入事務XID和回滾塊的UBA,同時記錄事務提交標
識,開始修改數據行,在數據行上寫事務XID,修改前數據寫入回滾塊。
    事務表裏記錄最新的回滾塊UBA方便回滾,數據塊記錄回滾塊UBA方便構造CR塊,實現一致性讀,數據塊記錄事務
XID方便找事務表裏的XID實現快速提交。
    事務表裏的事務提交標識最標準反映出事務是否已提交。提交時只更新事務表提交標識,數據塊和數據行上的事
務信息不必定所有更新,當新的操做須要讀取或者修改某行數據時,發現行上有事務XID,會去事務槽中核實,再去事
務表裏覈實,發現事務表的事務已提交,會更新事務槽和數據行事務信息,由於oracle全部改變過程都會記日誌因此
select操做也可能會產生redo。
    事務過程全部的數據塊修改過程均產生redo和undo,因此一個數據塊,根據當前的undo數據能夠一直向回找到足
夠早的數據。session

五、讀一致性與ORA-01555錯誤
    ORA-01555錯誤:向回構造CR讀時,因空間不足以前的數據已經被覆蓋,不能構造到開始讀的狀態數據。
    eg:8:40開始查詢一個10萬條數據的表,8:45一個事務刪除了表的最後100行,提交了,8:50查詢完成,那麼查詢
的結果是10萬行,實現機制就是由於全部的數據塊修改都作undo,根據undo往回找同一個事務狀態下的數據。當找不
到足夠早的數據時提示ORA-01555錯誤。主要由於查詢時間太長和undo表空間壓力過大    oracle

六、事務槽ITL
每個oracle數據塊頭都有事務槽,默認是1,能夠改最大255(從Oracle10g開始不能更改)
    select INI_TRANS,MAX_TRANS from dba_tables where table_name='T2'
事務槽爭用
    一個數據塊要被修改,會在事務槽中記錄XID(事務ID)和回滾塊的UBA,多個事務修改同一個塊時,由於未提
交的事務槽不能被覆蓋,因此都會獲取新的事務槽導致塊的PCT_free往下壓,同時修改的數據行增長行的大小空間往
上壓,會導致預留pct_free空間不夠,引發事務槽爭用狀況;
    當多個事務向同一張表中並行插入數據時oracle會自動使第一個事務操做第一個塊,第二個事務操做第二個塊,
以減小事務槽爭用,可是對應update和delete時就無能爲力了,因此事務槽爭用主要發生在修改和刪除操做上。        工具

七、DUMP工具
    alter system dump undo header '_SYSSMU1$'; #轉儲回滾段頭
    alter system dump datafile 2 block 9;   #轉儲回滾段數據塊
http://blog.itpub.net/28507395/viewspace-1328056spa

八、圖解Oracle IMU機制,private redo strands機制
    在shared pool中對每一個事務分配IMU buffer用於記錄回滾數據,同時對IMU buffer的改變在shared pool中分配
記錄日誌的空間redo private strands,日誌直接有LGWn寫入redo log,IMU buffer寫滿後轉到buffer cache再寫
入數據文件。緩存了回滾塊,能快速的找到回滾塊,構造CR時間縮短。
    select * from v$sysstat where name like '%IMU%';
    
九、undo相關查詢
查看回滾段的使用狀況,哪一個用戶正在使用回滾段的資源
    select s.username, u.name from v$transaction t,v$rollstat r,v$rollname u,v$session s 
    where s.taddr=t.addr and t.xidusn=r.usn and r.usn=u.usn order by s.username;
檢查UNDO Segment狀態
    select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks  from v$rollstat order by rssize;
查詢UNDO表空間統計信息
    SELECT TO_CHAR(BEGIN_TIME,'HH24:MI:SS') BEGIN_TIME, TO_CHAR(END_TIME,'HH24:MI:SS') END_TIME,UNDOBLKS
    FROM V$UNDOSTAT;    
查詢UNDO段統計信息
    SELECT a.name, b.xacts, b.writes, b.extents FROM v$rollname a, v$rollstat b WHERE a.usn=b.usn;
查詢指定用戶活動事務信息
    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  AND a.username='HR';
查詢數據行所在的文件號和塊號
    select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),id from t10;
查看當前會話的進程編號肯定dump出的trc文件
    select spid from v$process where addr in (select paddr from v$session where 
    sid=(select sid from v$mystat where rownum=1));
 .net

相關文章
相關標籤/搜索