天天看點

UNDO表空間的管理

UNDO表空間的管理

1.概念

復原段概述

  復原段用于存放資料修改之前的值(包括資料修改之前的位置和值)。復原段的頭部包含正在使用的該復原段事務的資訊。

    一個事務隻能使用一個復原段來存放它的復原資訊,而一個復原段可以存放多個事務的復原資訊。

復原段的作用

  1。事務復原:當事務修改表中資料的時候,該資料修改前的值(即前影像)會存放在復原段中,當使用者復原事務(ROLLBACK)時,

       ORACLE将會利用復原段中的資料前影像來将修改的資料恢複到原來的值。

  2。事務恢複:當事務正在處理的時候,例程失敗,復原段的資訊儲存在重做日志檔案中,ORACLE将在下次打開資料庫時利用復原來恢複未送出的資料。

  3。讀一緻性:當一個會話正在修改資料時,其他的會話将看不到該會話未送出的修改。而且,當一個語句正在執行時,該語句将看不到從該語句開始執行

       後的未送出的修改(語句級讀一緻性)。當ORACLE執行SELECT語句時,ORACLE依照目前的系統改變号(SYSTEM CHANGE NUMBER-SCN)來保證任何

       前于目前SCN的未送出的改變不被該語句處理。可以想象:當一個長時間的查詢正在執行時,若其他會話改變了該查詢要查詢的某個資料塊,ORACLE将利

       用復原段的資料前影像來構造一個讀一緻性視圖。

事務級的讀一緻性

  ORACLE一般提供SQL語句級(SQL STATEMENT LEVEL)的讀一緻性,可以用以下語句來實作事務級的讀一緻性。

  SET TRANSACTION READ ONLY;

  或:

  SET TANNSACTION SERIALIZABLE;

  以上兩個語句都将在事務開始後提供讀一緻性。需要注意的是,使用第二個語句對資料庫的并發性和性能将帶來影響。

復原段的種類

  1。系統復原段:當資料庫建立後,将自動建立一個系統復原段,該復原段隻用于存放系統表空間中對象的前影像。

  2。非系統復原段:擁有多個表空間的資料庫至少應該有一個非系統復原段,用于存放非系統表空間中對象的資料前影像。非系統復原段又分為私有回

       滾段和公有復原段,私有復原段應在參數檔案的ROLLBACK SEGMENTS參數中列出,以便例程啟動時自動使其線上(ONLINE)。公有復原段一般在

       OPS(ORACLE并行伺服器)中出現,将在例程啟動時自動線上。

  3。DEFERED復原段:該復原段在表空間離線(OFFLINE)時由系統自動建立,當表空間再次線上(ONLINE)時由系統自動删除,用于存放表空間離線時産生的復原資訊。

復原段的使用

  配置設定復原段:當事務開始時,ORACLE将為該事務配置設定復原段,并将擁有最少事務的復原段配置設定給該事務。事務可以用以下語句申請指定的復原段:

  SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment

  事務将以順序,循環的方式使用復原段的區(EXTENTS),當目前區用滿後移到下一個區。幾個事務可以寫在復原段的同一個區,

    但每個復原段的塊隻能包含一個事務的資訊。

  例如(兩個事務使用同一個復原段,該復原段有四個區):

  1、事務在進行中,它們正在使用復原段的第三個區;

  2、當兩個事務産生更多的復原資訊,它們将繼續使用第三個區;

  3、當第三個區滿後,事務将寫到第四個區,當事務開始寫到一個新的區時,稱為翻轉(WRAP);

  4、當第四個區用滿時,如果第一個區是空閑或非活動(使用該區的所有事務完成而沒有活動的事務)的,事務将接着使用第一個區。

復原段的擴張(EXTEND)

  當目前復原段區的所有塊用完而事務還需要更多的復原空間時,復原段的指針将移到下一個區。當最後一個區用完,指針将移到第一個區的前面。

    復原段指針移到下一個區的前提是下一個區沒有活動的事務,同時指針不能跨區。當下一個區正在使用時,事務将為復原段配置設定一個新的區,這種

    配置設定稱為復原段的擴充。復原段将一直擴充到該復原段區的個數到達復原段的參數MAXEXTENTS的值時為止。

復原段的回收和OPTIMAL參數

  OPTIMAL參數指明復原段空閑時收縮到的位置,指明復原段的OPTIMAL參數可以減少復原段空間的浪費。

V$ROLLSTAT中的常用列

?        USN:復原段辨別

?        RSSIZE:復原段預設大小

?        XACTS:活動事務數

在一段時間内增量用到的列

?        WRITES:復原段寫入數(機關:bytes)

?        SHRINKS:復原段收縮次數

?        EXTENDS:復原段擴充次數

?        WRAPS:復原段翻轉(wrap)次數

?        GETS:擷取復原段頭次數

?        WAITS:復原段頭等待次數

V$ROLLSTAT中的連接配接列

Column                                        View                                         Joined Column(s)

--------------                                -----------------------                        ------------------------

USN                                        V$ROLLNAME                        USN

注意:

  通過花費時間除以翻轉次數,你可以得到一次復原段翻轉(wrap)的平均用時。此方法常用于在長查詢中指定合适的復原段大小

    以避免'Snapshot Too Old'錯誤。同時,通過檢視extends和shrinks列可以看出optimal是否需要增加。

2.實踐操作

和undo相關的視圖:

v$rollstat

v$rollname

dba_segments

DBA_ROLLBACK_SEGS

v$transaction

1.檢視復原段的資訊

select * from dba_rollback_segs

SEGMENT_NAME                   OWNER  TABLESPACE_NAME                SEGMENT_ID             FILE_ID                BLOCK_ID               INITIAL_EXTENT         NEXT_EXTENT            MIN_EXTENTS            MAX_EXTENTS            PCT_INCREASE           STATUS           INSTANCE_NUM                             RELATIVE_FNO          

------------------------------ ------ ------------------------------ ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------- ---------------------------------------- ----------------------

SYSTEM                         SYS    SYSTEM                         0                      1                      9                      114688                                        1                      32765                                         ONLINE                                                    1                     

_SYSSMU1$                      PUBLIC UNDOTBS3                       1                      9                      2825                   131072                                        2                      32765                                         ONLINE                                                    9                     

_SYSSMU2$                      PUBLIC UNDOTBS3                       2                      9                      2841                   131072                                        2                      32765                                         ONLINE                                                    9                     

 MIN_EXTENTS :一個段中最小的區的數量(一般段為1,復原段為2)

 MAX_EXTENTS :一個段中最大的區的數量(最大為32765)

 有的人會疑問,那這個段最大值=32765*每個區中段的數量*段的大小,

2.目前庫中建立了多少個回退段,回退段所在的表空間名,回退段的大小

SQL> select segment_name,tablespace_name,bytes,blocks from dba_segments where

  2  segment_type='ROLLBACK';

SEGMENT_NAME

--------------------------------------------------------------------------------

TABLESPACE_NAME                     BYTES     BLOCKS

------------------------------ ---------- ----------

SYSTEM

SYSTEM                             393216         48

3.使用復原段的資訊的查詢

select r.name rollbackname,

       s.sid,

       s.serial#,

       s.username ,

       t.cr_get,

       t.phy_io,

       t.used_ublk,

       t.noundo,

       substr(s.program,1,78) ops_program

from v$rollname r,v$transaction t, v$session s

where t.addr=s.taddr

and t.xidusn=r.usn

order by t.cr_get,phy_io

4.檢視復原段的競争情況,如果命中率大于2%,那就存在回退段競争,必須增加回退段的個數,

select rn.name,rs.gets,rs.waits,(rs.waits/rs.gets)*100 ratio

from v$rollname rn,v$rollstat rs

where rs.usn=rn.usn

gets: 回退段被通路的次數

waits:程序等待回退段的次數

ratio:回退段的命中率

5.undu表空間的大小計算方法

select (rd*(ups*overhead)+overhead)/1024/1024/1024 bytes

 from (select value rd from v$parameter where name ='undo_retention'),

 (select (sum(undoblks)/sum(((end_time-begin_time)*10800))) ups from v$undostat),

 (select value overhead from v$parameter where name='db_block_size');

Rd:undo_retention設定的時間;

Ups:undo blocks per second;

Overhead:rollback segment header;

估計undo tablespace大小的公式:

Undo space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size;

6.檢視系統使用的undo空間的情況

方法1:

SQL> show parameter undo

NAME                                 TYPE        VALUE

------------------------------------ ----------- -----------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

SQL>

方法二:

SQL> select name ,value from v$parameter where name like 'un%';

NAME

--------------------------------------------------------------------------------

VALUE

--------------------------------------------------------------------------------

undo_management

AUTO

undo_tablespace

UNDOTBS1

undo_retention

900

在我們的資料庫往往有undo tablespace占用空間過大,占用了磁盤60%的空間。如果發現此問題的話,應從應用着手了,

什麼事務能使用若大的undo tablespace.發現不能回收,可以考慮我如下的方法:

方法一: 用resize收縮表空間

方法二: 用新健的undo表空間替換現有的

方法一 有時候,無法收縮,最有效的方法是方法二,可以根本的解決空間回縮的方法

方法一:

1.

SQL> select tablespace_name ,sum(bytes)/1024/1024/1024 GB from  dba_data_files group by tablespace_name

  2  union all

  3  select tablespace_name ,sum(bytes)/1024/1024/1024 GB from dba_temp_files group by tablespace_name;

TABLESPACE_NAME                        GB

------------------------------ ----------

SYSAUX                         .263671875

UNDOTBS1                       .034179688

USERS                          .067138672

SYSTEM                         .478515625

EXAMPLE                         .09765625

UNDOTBS2                       .306640625

TEMP                            .01953125

已選擇7行。

SQL>

2.

SQL> select  file#,name from v$datafile;

     FILE#

----------

NAME

-----------------------------------------------------------

.....

         6

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF

已選擇6行。

3.

SQL> select max(block_id) from dba_extents where file_id=6;

MAX(BLOCK_ID)

-------------

         5625

4.

SQL> show parameter db_block_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------

db_block_size                        integer     8192

5,查詢已經用的undo空間

SQL> select 5625*8/1024 from dual;

5625*8/1024

-----------

 43.9453125

6.

SQL> alter database datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF' resize 13m;

alter database datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF' resize 13m

*

第 1 行出現錯誤:

ORA-03297: 檔案包含在請求的 RESIZE 值以外使用的資料

因為我給undo初始大小定義為10M,而現在是43m,說明是擴充的,是以都是用過的

SQL> select file_name ,bytes/1024/1024 from dba_data_files where tablespace_name='UNDOTBS2';

FILE_NAME

--------------------------------------------------------------------------------

BYTES/1024/1024

---------------

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF

            314

SQL> alter database datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF' resize 32

資料庫已更改。

SQL> select file_name ,bytes/1024/1024 from dba_data_files where tablespace_name='UNDOTBS2';

FILE_NAME

--------------------------------------------------------------------------------

BYTES/1024/1024

---------------

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF

            320

SQL> alter database datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF' resize 31

資料庫已更改。

SQL> select file_name ,bytes/1024/1024 from dba_data_files where tablespace_name='UNDOTBS2';

FILE_NAME

--------------------------------------------------------------------------------

BYTES/1024/1024

---------------

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF

            314

方法 二:

1.檢視資料庫檔案的路徑

SQL> select name from v$datafile;

NAME

--------------------------------------------------------------------------------

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/SYSTEM01.DBF

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/SYSAUX01.DBF

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/USERS01.DBF

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/EXAMPLE01.DBF

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF

2. 檢視目前資料庫的預設undo空間

SQL> show parameter undo;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS2

SQL> create undo tablespace undotbs1

  2  datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS01.DBF' size 10m;

表空間已建立。

3.修改參數檔案

SQL> alter system  set  undo_tablespace=undotbs1 scope=both;

系統已更改。

4.檢視復原段的 使用情況,要等沒有是使用復原段的時候.才能删除表空間

SQL> select usn,xacts,status,rssize/1024/1024/1024 ,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize;

       USN      XACTS STATUS          RSSIZE/1024/1024/1024

---------- ---------- --------------- ---------------------

HWMSIZE/1024/1024/1024    SHRINKS

---------------------- ----------

         5          0 ONLINE                     .000114441

            .000114441          0

         1          0 ONLINE                     .000114441

            .000114441          0

         2          0 ONLINE                     .000114441

            .000114441          0

       USN      XACTS STATUS          RSSIZE/1024/1024/1024

---------- ---------- --------------- ---------------------

HWMSIZE/1024/1024/1024    SHRINKS

---------------------- ----------

         3          0 ONLINE                     .000114441

            .000114441          0

         4          0 ONLINE                     .000114441

            .000114441          0

        10          0 ONLINE                     .000114441

            .000114441          0

       USN      XACTS STATUS          RSSIZE/1024/1024/1024

---------- ---------- --------------- ---------------------

HWMSIZE/1024/1024/1024    SHRINKS

---------------------- ----------

         6          0 ONLINE                     .000114441

            .000114441          0

         7          0 ONLINE                     .000114441

            .000114441          0

         8          0 ONLINE                     .000114441

            .000114441          0

       USN      XACTS STATUS          RSSIZE/1024/1024/1024

---------- ---------- --------------- ---------------------

HWMSIZE/1024/1024/1024    SHRINKS

---------------------- ----------

         9          0 ONLINE                     .000114441

            .000114441          0

         0          0 ONLINE                     .000358582

            .000358582          0

已選擇11行。

5.删除undo空間

SQL> drop tablespace ubdotbs2 including contents and datafiles;  //如果資料庫在使用狀态删除時,一般是無法實體删除資料檔案的,因為還有事務在使用,有兩個方法,一個另外建一個資料檔案

                                                                   ,等沒有事務用的時候,在實體删除;第二個方法是重新啟動下資料庫,然後實體删除資料檔案,(如果可以重新開機資料庫,.執行

           這個語句會自動删除資料檔案)

表空間已删除。

6.檢視表空間的大小

SQL> select file_name,bytes/1024/1024 from  dba_data_files

  2  where tablespace_name like 'UNDOTBS1';

FILE_NAME

------------------------------------------------------------------------------

BYTES/1024/1024

---------------

F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS01.DBF

             10

或者

SQL> select tablespace_name ,sum(bytes)/1024/1024/1024 GB from  dba_data_files group by tablespace_

  2  union all

  3  select tablespace_name ,sum(bytes)/1024/1024/1024 GB from dba_temp_files group by tablespace_n

TABLESPACE_NAME                        GB

------------------------------ ----------

SYSAUX                         .263671875

UNDOTBS1                       .009765625

USERS                          .067138672

SYSTEM                         .478515625

EXAMPLE                         .09765625

TEMP                            .01953125

已選擇6行。

SQL>

---待續 復原段管理

1.監控回退段

SQL> select begin_time,end_time,maxquerylen len,undoblks,txncount,maxconcurrency maxcon ,nospaceerrcnt err from v$undostat where

  2  begin_time > sysdate-(2/24);

BEGIN_TIME     END_TIME              LEN   UNDOBLKS   TXNCOUNT     MAXCON

-------------- -------------- ---------- ---------- ---------- ----------

       ERR

----------

14-4月 -08     14-4月 -08              0         14        268          1

14-4月 -08     14-4月 -08              0         83        179          3

14-4月 -08     14-4月 -08           2185         16        136          1

如果産生空間錯誤的問題,則參數nospaceerrcnt會增加,這是就要擴大undo表空間

2.重建undo表空間,更改系統的表空間

SQL> create undo tablespace undotbs2

  2  datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS03.DBF' size 10m

  3  extent management local autoallocate;

表空間已建立。

SQL> alter system  set undo_tablespace=undotbs2;

系統已更改。

SQL> alter tablespace undotbs1 offline;

表空間已更改。

SQL> alter database datafile 'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/UNDOTBS02.DBF','F:/ORACLE/PRODUC

T/10.2.0/ORADATA/MOVO/UNDOTBS01.DBF' OFFLINE DROP;

資料庫已更改。

SQL> commit;

送出完成。

SQL>

------待續  空間的故障恢複

undo空間的案例恢複的方法

--- end ----