ORACLE 建立回滾段

2021-09-30 15:50:25 字數 4969 閱讀 1085

create rollback segment "rs01" tablespace "ts_name"

storage ( initial 8m next 8m maxextents unlimited);

回滾段管理一直是oracle資料庫管理的乙個難題,本文通過例項介紹oracle回滾段的概念,用法和規劃及問題的解決。

回滾段概述

回滾段用於存放資料修改之前的值(包括資料修改之前的位置和值)。回滾段的頭部包含正在使用的該回滾段事務的資訊。乙個事務只能使用乙個回滾段來存放它的回滾資訊,而乙個回滾段可以存放多個事務的回滾資訊。

回滾段的作用

事務回滾:當事務修改表中資料的時候,該資料修改前的值(即前影像)會存放在回滾段中,當使用者回滾事務(rollback)時,oracle將會利用回滾段中的資料前影像來將修改的資料恢復到原來的值。

事務恢復:當事務正在處理的時候,例程失敗,回滾段的資訊儲存在重做日誌檔案中,oracle將在下次開啟資料庫時利用回滾來恢復未提交的資料。

讀一致性:當乙個會話正在修改資料時,其他的會話將看不到該會話未提交的修改。而且,當乙個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)。當oracle執行select語句時,oracle依照當前的系統改變號(system change number-scn)來保證任何前於當前scn的未提交的改變不被該語句處理。可以想象:當乙個長時間的查詢正在執行時,若其他會話改變了該查詢要查詢的某個資料塊,oracle將利用回滾段的資料前影像來構造乙個讀一致性檢視。

事務級的讀一致性

oracle一般提供sql語句級(sql statement level)的讀一致性,可以用以下語句來實現事務級的讀一致性。

set transaction read only; 

或: set tannsaction serializable; 

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

回滾段的種類

系統回滾段:當資料庫建立後,將自動建立乙個系統回滾段,該回滾段只用於存放系統表空間中物件的前影像。

回滾段的使用

分配回滾段:當事務開始時,oracle將為該事務分配回滾段,並將擁有最少事務的回滾段分配給該事務。事務可以用以下語句申請指定的回滾段:

set transtraction use rollback segment rollback_segment

事務將以順序,迴圈的方式使用回滾段的區(extents),當當前區用滿後移到下乙個區。幾個事務可以寫在回滾段的同乙個區,但每個回滾段的塊只能包含乙個事務的資訊。

例如(兩個事務使用同乙個回滾段,該回滾段有四個區):

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

2、當兩個事務產生更多的回滾資訊,它們將繼續使用第三個區;

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

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

回滾段的擴張(extend)

當當前回滾段區的所有塊用完而事務還需要更多的回滾空間時,回滾段的指標將移到下乙個區。當最後乙個區用完,指標將移到第乙個區的前面。回滾段指標移到下乙個區的前提是下乙個區沒有活動的事務,同時指標不能跨區。當下乙個區正在使用時,事務將為回滾段分配乙個新的區,這種分配稱為回滾段的擴充套件。回滾段將一直擴充套件到該回滾段區的個數到達回滾段的引數maxextents的值時為止。

回滾段的**和optimal引數

optimal引數指明回滾段空閒時收縮到的位置,指明回滾段的optimal引數可以減少回滾段空間的浪費。

建立回滾段

語法:

create [public] rollback segment rollback_segment

[tablespace tablespace]

[storage ([initial integer[k|m]] [next integer[k|m]]

[minextents integer]

[maxtents ]

[optimal ]) ] 

注: 回滾段可以在建立時指明private或public,一旦建立將不能修改。

minextents 必須大於等於2

pctincrease必須是0

optimal如果要指定,必須大於等於回滾段的初始大小(由minextents指定)

建議:

一般情況下,initial=next

設定optimal引數來節約空間的使用

不要設定maxextents為unlimited

回滾段應建立在乙個特定的回滾段表空間內

例: create rollback segment rbs01

tablespace rbs

storage ( initial 100k next 100k minextents 10

maxextents 500 optimal 1000k);

alter rollback segment rollback_segment online; 

例: alter rollback segment rbs01 online; 

rollback_segment=(rbs01,rbs02) 

修改回滾段的儲存引數

可以使用alter rollback segment命令修改回滾段的儲存引數(包括optimal,maxextents)。

語法:

alter rollback segment rollback_segment

[storage ([next integer[k|m]]

[minextents integer]

[maxextents ]

[optimal ]) ] 

例: alter rollback segment rbs01 storage (maxextents 1000);

**回滾段的空間

如果指定了回滾段的optimal引數,oracle將自動**回滾段到optimal指定的位置。使用者也可以手動**回滾段的空間。

語法:

alter rollback segment rollback_segment shrink [to integer [k|m]]; 

說明:

如果不指明to integer的數值,oracle將試圖**到optimal的位置。

例: alter rollback segment rbs01 shrink to 2m; 

使回滾段離線

為了達到以下兩個目的將要回滾段離線:

1.阻止新的事務使用該回滾段;

2.該回滾段必須刪除。

語法:

alter rollback segment rollback_segment offline; 

例: alter rollback segment rbs01 offline; 

說明:

如果有事務正在使用該回滾段,執行該命令後,回滾段的狀態將是pending offline。事務結束後,狀態將改為offline,可以通過v$rollstat查詢回滾段的狀態。

刪除回滾段

當回滾段不再需要或要重建以改變initial,next或minextents引數時,可以將其刪除。要刪除回滾段,不許使該回滾段離線。

語法:

drop rollback segment rollback_segment; 

例: drop rollback segment rbs01;

查詢回滾段的資訊

所用資料字典:dba_rollback_segs

可以查詢的資訊:回滾段的標識(segment_id)、名稱(segment_name)、所在表空間(tablespace_name)、型別(owner)、狀態(status)。

例: sql>select segment_name,tablespace_name,owner,status from dba_rollback_segs; 

回滾段的統計資訊

資料字典:v$rollname,v$rollstat

例: sql>select n.name,s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.status

from v$rollname n,v$rollstat s

where n.usn=s.usn;

回滾段的當前活動事務

資料字典:v$session,v$transaction

例: sql>select s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk

from v$session s,v$transaction t

where s.saddr=t.ses_addr;

username  xidusn   ubafil   ubablk  used_ublk

system      2      2     7      1

scott       1      2    163      1 

2 rows selected.

回滾段的數量規劃

對於oltp系統,存在大量的小事務處理,一般建議:

數量多的小回滾段;每四個事務乙個回滾段;每個回滾段不要超過十個事務。

對於批處理,一般建議:

少的大回滾段;每個事務乙個回滾段。

回滾段的問題及解決方法

問題一:事務要求的回滾段空間不夠,表現為表空間用滿(ora-01560錯誤),回滾段擴充套件到達引數maxextents的值(ora-01628)。

解決方法:向回滾段表空間新增檔案或使已有的檔案變大;增加maxextents的值。

問題二:讀一致性錯誤(ora-01555 snapshot too old)

解決方法:增加minextents的值,增加區的大小,設定乙個高的optimal值。

ORACLE回滾段管理(上)

回滾段管理一直是oracle資料庫管理的乙個難題,本文通過例項介紹oracle回滾段的概念,用法和規劃及問題的解決。回滾段概述 回滾段用於存放資料修改之前的值 包括資料修改之前的位置和值 回滾段的頭部包含正在使用的該回滾段事務的資訊。乙個事務只能使用乙個回滾段來存放它的回滾資訊,而乙個回滾段可以存放...

oracle檢視回滾段資訊

select rownum,sys.dba rollback segs.segment name name,v rollstat.extents extents,v rollstat.rssize size in bytes,v rollstat.xacts xacts,v rollstat.get...

oracle資料回滾

當我們修改了表的資料並且提交了事務後,想回滾資料怎麼辦?先根據sql執行歷史確定資料回滾時間點 select sql text,last load time from v sql where sql text like update order by last load time desc 再將資料...